blob: 2ba9e56ddde01738a2b68c61d14d611199092178 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.asterix.formats.nontagged;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
import org.apache.asterix.dataflow.data.nontagged.serde.ABinarySerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ABooleanSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ACircleSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADateSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADateTimeSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADayTimeDurationSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ADurationSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AGeometrySerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AIntervalSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ALineSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AMissingSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ANullSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AObjectSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AOrderedListSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.APoint3DSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.APointSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.APolygonSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ARecordSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ARectangleSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AStringSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.ATimeSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AUUIDSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AUnorderedListSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.AYearMonthDurationSerializerDeserializer;
import org.apache.asterix.dataflow.data.nontagged.serde.SerializerDeserializerUtil;
import org.apache.asterix.om.base.AMissing;
import org.apache.asterix.om.base.ANull;
import org.apache.asterix.om.base.IAObject;
import org.apache.asterix.om.types.AOrderedListType;
import org.apache.asterix.om.types.ARecordType;
import org.apache.asterix.om.types.ATypeTag;
import org.apache.asterix.om.types.AUnorderedListType;
import org.apache.asterix.om.types.IAType;
import org.apache.hyracks.algebricks.common.exceptions.NotImplementedException;
import org.apache.hyracks.algebricks.data.ISerializerDeserializerProvider;
import org.apache.hyracks.api.dataflow.value.ISerializerDeserializer;
import org.apache.hyracks.api.exceptions.HyracksDataException;
import org.apache.hyracks.dataflow.common.data.marshalling.ShortSerializerDeserializer;
import org.apache.hyracks.util.string.UTF8StringReader;
import org.apache.hyracks.util.string.UTF8StringWriter;
public class SerializerDeserializerProvider implements ISerializerDeserializerProvider, Serializable {
private static final long serialVersionUID = 1L;
public static final SerializerDeserializerProvider INSTANCE = new SerializerDeserializerProvider();
private SerializerDeserializerProvider() {
}
// Can't be shared among threads <Stateful>
@SuppressWarnings("rawtypes")
public ISerializerDeserializer getAStringSerializerDeserializer() {
return addTag(new AStringSerializerDeserializer(new UTF8StringWriter(), new UTF8StringReader()));
}
@SuppressWarnings("rawtypes")
@Override
public ISerializerDeserializer getSerializerDeserializer(Object typeInfo) {
IAType type = (IAType) typeInfo;
if (type == null) {
return null;
}
switch (type.getTypeTag()) {
case ANY:
case UNION:
// we could do smth better for nullable fields
return AObjectSerializerDeserializer.INSTANCE;
default:
return addTag(getNonTaggedSerializerDeserializer(type));
}
}
@SuppressWarnings("rawtypes")
public ISerializerDeserializer getNonTaggedSerializerDeserializer(IAType type) {
switch (type.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 TINYINT:
return AInt8SerializerDeserializer.INSTANCE;
case SMALLINT:
return AInt16SerializerDeserializer.INSTANCE;
case INTEGER:
return AInt32SerializerDeserializer.INSTANCE;
case BIGINT:
return AInt64SerializerDeserializer.INSTANCE;
case LINE:
return ALineSerializerDeserializer.INSTANCE;
case MISSING:
return AMissingSerializerDeserializer.INSTANCE;
case NULL:
return ANullSerializerDeserializer.INSTANCE;
case STRING:
return AStringSerializerDeserializer.INSTANCE;
case BINARY:
return ABinarySerializerDeserializer.INSTANCE;
case TIME:
return ATimeSerializerDeserializer.INSTANCE;
case DURATION:
return ADurationSerializerDeserializer.INSTANCE;
case YEARMONTHDURATION:
return AYearMonthDurationSerializerDeserializer.INSTANCE;
case DAYTIMEDURATION:
return ADayTimeDurationSerializerDeserializer.INSTANCE;
case INTERVAL:
return AIntervalSerializerDeserializer.INSTANCE;
case ARRAY:
return new AOrderedListSerializerDeserializer((AOrderedListType) type);
case POINT:
return APointSerializerDeserializer.INSTANCE;
case POINT3D:
return APoint3DSerializerDeserializer.INSTANCE;
case RECTANGLE:
return ARectangleSerializerDeserializer.INSTANCE;
case POLYGON:
return APolygonSerializerDeserializer.INSTANCE;
case OBJECT:
return new ARecordSerializerDeserializer((ARecordType) type);
case MULTISET:
return new AUnorderedListSerializerDeserializer((AUnorderedListType) type);
case UUID:
return AUUIDSerializerDeserializer.INSTANCE;
case SHORTWITHOUTTYPEINFO:
return ShortSerializerDeserializer.INSTANCE;
case GEOMETRY:
return AGeometrySerializerDeserializer.INSTANCE;
default:
throw new NotImplementedException(
"No serializer/deserializer implemented for type " + type.getTypeTag() + " .");
}
}
@SuppressWarnings("rawtypes")
public static ISerializerDeserializer addTag(final ISerializerDeserializer nonTaggedSerde) {
return new ISerializerDeserializer<IAObject>() {
private static final long serialVersionUID = 1L;
@Override
public IAObject deserialize(DataInput in) throws HyracksDataException {
try {
ATypeTag tag = SerializerDeserializerUtil.deserializeTag(in);
//deserialize the tag (move input cursor forward) and check if it's not NULL tag
if (tag == ATypeTag.MISSING) {
return AMissing.MISSING;
}
if (tag == ATypeTag.NULL) {
return ANull.NULL;
}
} catch (IOException e) {
throw HyracksDataException.create(e);
}
return (IAObject) nonTaggedSerde.deserialize(in);
}
@SuppressWarnings("unchecked")
@Override
public void serialize(IAObject instance, DataOutput out) throws HyracksDataException {
SerializerDeserializerUtil.serializeTag(instance, out);
nonTaggedSerde.serialize(instance, out);
}
};
}
}