blob: 9dafa832a72b3cf45414cb2e6f0e38e3cc811643 [file] [log] [blame]
/*
* Copyright 2009-2010 by The Regents of the University of California
* Licensed 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 from
*
* 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 edu.uci.ics.hyracks.dataflow.common.util;
import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparatorFactory;
import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
import edu.uci.ics.hyracks.api.dataflow.value.ITypeTraits;
import edu.uci.ics.hyracks.data.std.accessors.PointableBinaryComparatorFactory;
import edu.uci.ics.hyracks.data.std.primitive.BooleanPointable;
import edu.uci.ics.hyracks.data.std.primitive.DoublePointable;
import edu.uci.ics.hyracks.data.std.primitive.FloatPointable;
import edu.uci.ics.hyracks.data.std.primitive.IntegerPointable;
import edu.uci.ics.hyracks.data.std.primitive.LongPointable;
import edu.uci.ics.hyracks.data.std.primitive.ShortPointable;
import edu.uci.ics.hyracks.data.std.primitive.UTF8StringPointable;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.BooleanSerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.DoubleSerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.FloatSerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.Integer64SerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.IntegerSerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.ShortSerializerDeserializer;
import edu.uci.ics.hyracks.dataflow.common.data.marshalling.UTF8StringSerializerDeserializer;
@SuppressWarnings("rawtypes")
public class SerdeUtils {
public static class PayloadTypeTraits implements ITypeTraits {
private static final long serialVersionUID = 1L;
final int payloadSize;
public PayloadTypeTraits(int payloadSize) {
this.payloadSize = payloadSize;
}
@Override
public boolean isFixedLength() {
return true;
}
@Override
public int getFixedLength() {
return payloadSize;
}
}
public static ITypeTraits[] serdesToTypeTraits(ISerializerDeserializer[] serdes) {
ITypeTraits[] typeTraits = new ITypeTraits[serdes.length];
for (int i = 0; i < serdes.length; i++) {
typeTraits[i] = serdeToTypeTrait(serdes[i]);
}
return typeTraits;
}
public static ITypeTraits[] serdesToTypeTraits(ISerializerDeserializer[] serdes, int payloadSize) {
ITypeTraits[] typeTraits = new ITypeTraits[serdes.length + 1];
for (int i = 0; i < serdes.length; i++) {
typeTraits[i] = serdeToTypeTrait(serdes[i]);
}
typeTraits[serdes.length] = new PayloadTypeTraits(payloadSize);
return typeTraits;
}
public static ITypeTraits serdeToTypeTrait(ISerializerDeserializer serde) {
if (serde instanceof ShortSerializerDeserializer) {
return ShortPointable.TYPE_TRAITS;
}
if (serde instanceof IntegerSerializerDeserializer) {
return IntegerPointable.TYPE_TRAITS;
}
if (serde instanceof Integer64SerializerDeserializer) {
return LongPointable.TYPE_TRAITS;
}
if (serde instanceof FloatSerializerDeserializer) {
return FloatPointable.TYPE_TRAITS;
}
if (serde instanceof DoubleSerializerDeserializer) {
return DoublePointable.TYPE_TRAITS;
}
if (serde instanceof BooleanSerializerDeserializer) {
return BooleanPointable.TYPE_TRAITS;
}
return UTF8StringPointable.TYPE_TRAITS;
}
public static IBinaryComparator[] serdesToComparators(ISerializerDeserializer[] serdes, int numSerdes) {
IBinaryComparator[] comparators = new IBinaryComparator[numSerdes];
for (int i = 0; i < numSerdes; i++) {
comparators[i] = serdeToComparator(serdes[i]);
}
return comparators;
}
public static IBinaryComparator serdeToComparator(ISerializerDeserializer serde) {
IBinaryComparatorFactory f = serdeToComparatorFactory(serde);
return f.createBinaryComparator();
}
public static IBinaryComparatorFactory[] serdesToComparatorFactories(ISerializerDeserializer[] serdes, int numSerdes) {
IBinaryComparatorFactory[] comparatorsFactories = new IBinaryComparatorFactory[numSerdes];
for (int i = 0; i < numSerdes; i++) {
comparatorsFactories[i] = serdeToComparatorFactory(serdes[i]);
}
return comparatorsFactories;
}
public static IBinaryComparatorFactory serdeToComparatorFactory(ISerializerDeserializer serde) {
if (serde instanceof ShortSerializerDeserializer) {
return PointableBinaryComparatorFactory.of(ShortPointable.FACTORY);
}
if (serde instanceof IntegerSerializerDeserializer) {
return PointableBinaryComparatorFactory.of(IntegerPointable.FACTORY);
}
if (serde instanceof Integer64SerializerDeserializer) {
return PointableBinaryComparatorFactory.of(LongPointable.FACTORY);
}
if (serde instanceof FloatSerializerDeserializer) {
return PointableBinaryComparatorFactory.of(FloatPointable.FACTORY);
}
if (serde instanceof DoubleSerializerDeserializer) {
return PointableBinaryComparatorFactory.of(DoublePointable.FACTORY);
}
if (serde instanceof BooleanSerializerDeserializer) {
throw new UnsupportedOperationException("Binary comparator factory for Boolean not implemented.");
}
if (serde instanceof UTF8StringSerializerDeserializer) {
return PointableBinaryComparatorFactory.of(UTF8StringPointable.FACTORY);
}
throw new UnsupportedOperationException("Binary comparator for + " + serde.toString() + " not implemented.");
}
}