blob: c86e5c97502ed31928de248274d2d0e75cc66d8f [file] [log] [blame]
package edu.uci.ics.asterix.formats.nontagged;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ACircleSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADateSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADateTimeSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ADurationSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ALineSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ANullSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AOrderedListSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.APoint3DSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.APointSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.APolygonSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AStringSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.ATimeSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.AUnorderedListSerializerDeserializer;
import edu.uci.ics.asterix.dataflow.data.nontagged.serde.SerializerDeserializerUtil;
import edu.uci.ics.asterix.om.base.IAObject;
import edu.uci.ics.asterix.om.types.AOrderedListType;
import edu.uci.ics.asterix.om.types.ARecordType;
import edu.uci.ics.asterix.om.types.ATypeTag;
import edu.uci.ics.asterix.om.types.AUnorderedListType;
import edu.uci.ics.asterix.om.types.IAType;
import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException;
import edu.uci.ics.hyracks.algebricks.data.ISerializerDeserializerProvider;
import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
public class AqlSerializerDeserializerProvider implements ISerializerDeserializerProvider, Serializable {
private static final long serialVersionUID = 1L;
public static final AqlSerializerDeserializerProvider INSTANCE = new AqlSerializerDeserializerProvider();
private AqlSerializerDeserializerProvider() {
}
@SuppressWarnings("unchecked")
@Override
public ISerializerDeserializer getSerializerDeserializer(Object typeInfo) {
IAType aqlType = (IAType) typeInfo;
switch (aqlType.getTypeTag()) {
case ANY:
case UNION: { // we could do smth better for nullable fields
return AObjectSerializerDeserializer.INSTANCE;
}
default: {
return addTag(getNonTaggedSerializerDeserializer(aqlType), aqlType.getTypeTag());
}
}
}
@SuppressWarnings("unchecked")
public ISerializerDeserializer getNonTaggedSerializerDeserializer(IAType aqlType) {
switch (aqlType.getTypeTag()) {
case CIRCLE: {
return ACircleSerializerDeserializer.INSTANCE;
}
case DATE: {
return ADateSerializerDeserializer.INSTANCE;
}
case DATETIME: {
return ADateTimeSerializerDeserializer.INSTANCE;
}
case DOUBLE: {
return ADoubleSerializerDeserializer.INSTANCE;
}
case FLOAT: {
return AFloatSerializerDeserializer.INSTANCE;
}
case BOOLEAN: {
return ABooleanSerializerDeserializer.INSTANCE;
}
case INT8: {
return AInt8SerializerDeserializer.INSTANCE;
}
case INT16: {
return AInt16SerializerDeserializer.INSTANCE;
}
case INT32: {
return AInt32SerializerDeserializer.INSTANCE;
}
case INT64: {
return AInt64SerializerDeserializer.INSTANCE;
}
case LINE: {
return ALineSerializerDeserializer.INSTANCE;
}
case NULL: {
return ANullSerializerDeserializer.INSTANCE;
}
case STRING: {
return AStringSerializerDeserializer.INSTANCE;
}
case TIME: {
return ATimeSerializerDeserializer.INSTANCE;
}
case DURATION: {
return ADurationSerializerDeserializer.INSTANCE;
}
case ORDEREDLIST: {
return new AOrderedListSerializerDeserializer((AOrderedListType) aqlType);
}
case POINT: {
return APointSerializerDeserializer.INSTANCE;
}
case POINT3D: {
return APoint3DSerializerDeserializer.INSTANCE;
}
case RECTANGLE: {
return ARectangleSerializerDeserializer.INSTANCE;
}
case POLYGON: {
return APolygonSerializerDeserializer.INSTANCE;
}
case RECORD: {
return new ARecordSerializerDeserializer((ARecordType) aqlType);
}
case UNORDEREDLIST: {
return new AUnorderedListSerializerDeserializer((AUnorderedListType) aqlType);
}
default: {
throw new NotImplementedException("No serializer/deserializer implemented for type "
+ aqlType.getTypeTag() + " .");
}
}
}
@SuppressWarnings("unchecked")
private ISerializerDeserializer addTag(final ISerializerDeserializer nonTaggedSerde, final ATypeTag typeTag) {
return new ISerializerDeserializer<IAObject>() {
private static final long serialVersionUID = 1L;
@Override
public IAObject deserialize(DataInput in) throws HyracksDataException {
try {
SerializerDeserializerUtil.deserializeTag(in);
} catch (IOException e) {
throw new HyracksDataException(e);
}
return (IAObject) nonTaggedSerde.deserialize(in);
}
@Override
public void serialize(IAObject instance, DataOutput out) throws HyracksDataException {
SerializerDeserializerUtil.serializeTag(instance, out);
nonTaggedSerde.serialize(instance, out);
}
};
}
}