blob: 9edb640a741a13a0b556334758942d197b39b884 [file] [log] [blame]
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.AOrderedListType;
import edu.uci.ics.asterix.om.types.ATypeTag;
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 AOrderedlistPrinterFactory implements IPrinterFactory {
private static final long serialVersionUID = 1L;
private AOrderedListType orderedlistType;
public AOrderedlistPrinterFactory(AOrderedListType orderedlistType) {
this.orderedlistType = orderedlistType;
}
@Override
public IPrinter createPrinter() {
return new IPrinter() {
private IPrinter itemPrinter;
private IAType itemType;
private ATypeTag itemTag;
private boolean typedItemList = false;
// private int itemLength;
// private int numberOfitems;
// private int itemOffset;
@Override
public void init() throws AlgebricksException {
if (orderedlistType != null && orderedlistType.getItemType() != null) {
itemType = orderedlistType.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 = orderedlistType.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 = 0;
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(" ]");
}
};
}
}