| package edu.uci.ics.asterix.dataflow.data.nontagged.printers; |
| |
| import java.io.PrintStream; |
| |
| import edu.uci.ics.asterix.common.exceptions.AsterixException; |
| import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer; |
| import edu.uci.ics.asterix.formats.nontagged.AqlPrinterFactoryProvider; |
| import edu.uci.ics.asterix.om.types.ATypeTag; |
| import edu.uci.ics.asterix.om.types.AUnorderedListType; |
| import edu.uci.ics.asterix.om.types.EnumDeserializer; |
| import edu.uci.ics.asterix.om.types.IAType; |
| import edu.uci.ics.asterix.om.util.NonTaggedFormatUtil; |
| import edu.uci.ics.hyracks.algebricks.common.exceptions.AlgebricksException; |
| import edu.uci.ics.hyracks.algebricks.data.IPrinter; |
| import edu.uci.ics.hyracks.algebricks.data.IPrinterFactory; |
| |
| public class AUnorderedlistPrinterFactory implements IPrinterFactory { |
| |
| private static final long serialVersionUID = 1L; |
| |
| private AUnorderedListType unorderedlistType; |
| |
| public AUnorderedlistPrinterFactory(AUnorderedListType unorderedlistType) { |
| this.unorderedlistType = unorderedlistType; |
| } |
| |
| @Override |
| public IPrinter createPrinter() { |
| |
| return new IPrinter() { |
| |
| private IPrinter itemPrinter; |
| private IAType itemType; |
| private ATypeTag itemTag; |
| private boolean typedItemList = false; |
| |
| @Override |
| public void init() throws AlgebricksException { |
| |
| if (unorderedlistType != null && unorderedlistType.getItemType() != null) { |
| itemType = unorderedlistType.getItemType(); |
| if (itemType.getTypeTag() == ATypeTag.ANY) { |
| this.typedItemList = false; |
| this.itemPrinter = AObjectPrinterFactory.INSTANCE.createPrinter(); |
| } else { |
| this.typedItemList = true; |
| itemPrinter = AqlPrinterFactoryProvider.INSTANCE.getPrinterFactory(itemType).createPrinter(); |
| itemTag = unorderedlistType.getItemType().getTypeTag(); |
| } |
| } else { |
| this.typedItemList = false; |
| this.itemPrinter = AObjectPrinterFactory.INSTANCE.createPrinter(); |
| } |
| itemPrinter.init(); |
| } |
| |
| @Override |
| public void print(byte[] b, int s, int l, PrintStream ps) throws AlgebricksException { |
| ps.print("{{ "); |
| int numberOfitems = AInt32SerializerDeserializer.getInt(b, s + 6); |
| int itemOffset; |
| if (typedItemList) { |
| switch (itemTag) { |
| case STRING: |
| case RECORD: |
| case ORDEREDLIST: |
| case UNORDEREDLIST: |
| case ANY: |
| itemOffset = s + 10 + (numberOfitems * 4); |
| break; |
| default: |
| itemOffset = s + 10; |
| } |
| } else |
| itemOffset = s + 10 + (numberOfitems * 4); |
| int itemLength; |
| |
| try { |
| if (typedItemList) { |
| for (int i = 0; i < numberOfitems; i++) { |
| itemLength = NonTaggedFormatUtil.getFieldValueLength(b, itemOffset, itemTag, false); |
| itemPrinter.print(b, itemOffset - 1, itemLength, ps); |
| itemOffset += itemLength; |
| if (i + 1 < numberOfitems) |
| ps.print(", "); |
| } |
| } else { |
| for (int i = 0; i < numberOfitems; i++) { |
| itemTag = EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(b[itemOffset]); |
| itemLength = NonTaggedFormatUtil.getFieldValueLength(b, itemOffset, itemTag, true) + 1; |
| itemPrinter.print(b, itemOffset, itemLength, ps); |
| itemOffset += itemLength; |
| if (i + 1 < numberOfitems) |
| ps.print(", "); |
| } |
| } |
| } catch (AsterixException e) { |
| throw new AlgebricksException(e); |
| } |
| ps.print(" }}"); |
| } |
| }; |
| } |
| } |