package com.bagri.client.hazelcast.serialize.query;
import java.io.IOException;
import com.bagri.client.hazelcast.serialize.DataSerializationFactoryImpl;
import com.bagri.core.query.AlwaysExpression;
import com.bagri.core.query.BinaryExpression;
import com.bagri.core.query.Comparison;
import com.bagri.core.query.Expression;
import com.bagri.core.query.PathBuilder;
import com.bagri.core.query.PathExpression;
import com.bagri.core.query.QueriedPath;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.nio.serialization.StreamSerializer;
public class ExpressionSerializer implements StreamSerializer<Expression> {
@Override
public void destroy() {
}
@Override
public int getTypeId() {
return DataSerializationFactoryImpl.cli_Expression;
}
@Override
public Expression read(ObjectDataInput in) throws IOException {
int clnId = in.readInt();
Comparison compType = Comparison.values()[in.readInt()];
byte type = in.readByte();
if (type == 0) {
return new AlwaysExpression(clnId);
}
PathBuilder path = in.readObject();
if (type == 1) {
return new BinaryExpression(clnId, compType, path);
} else {
return new PathExpression(clnId, compType, path, in.readUTF(),
(QueriedPath) in.readObject());
}
}
@Override
public void write(ObjectDataOutput out, Expression exp) throws IOException {
out.writeInt(exp.getCollectionId());
out.writeInt(exp.getCompType().ordinal());
if (exp instanceof AlwaysExpression) {
out.writeByte(0);
} else if (exp instanceof BinaryExpression) {
out.writeByte(1);
out.writeObject(exp.getPath());
} else {
out.writeByte(2);
out.writeObject(exp.getPath());
out.writeUTF(((PathExpression) exp).getParamName());
out.writeObject(((PathExpression) exp).getCachedPath());
}
}
}