package org.infinispan.query.remote.client;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.infinispan.protostream.MessageMarshaller;
import org.infinispan.protostream.ProtobufUtil;
import org.infinispan.protostream.WrappedMessage;
/**
* @author anistor@redhat.com
* @since 7.2
*/
public final class FilterResult {
private final Object instance;
private final Object[] projection;
private final Comparable[] sortProjection;
public FilterResult(Object instance, Object[] projection, Comparable[] sortProjection) {
if (instance == null && projection == null) {
throw new IllegalArgumentException("instance and projection cannot be both null");
}
this.instance = instance;
this.projection = projection;
this.sortProjection = sortProjection;
}
public Object getInstance() {
return instance;
}
public Object[] getProjection() {
return projection;
}
public Comparable[] getSortProjection() {
return sortProjection;
}
@Override
public String toString() {
return "FilterResult{" +
"instance=" + instance +
", projection=" + Arrays.toString(projection) +
", sortProjection=" + Arrays.toString(sortProjection) +
'}';
}
static final class Marshaller implements MessageMarshaller<FilterResult> {
@Override
public FilterResult readFrom(ProtoStreamReader reader) throws IOException {
byte[] instance = reader.readBytes("instance");
List<WrappedMessage> projection = reader.readCollection("projection", new ArrayList<>(), WrappedMessage.class);
List<WrappedMessage> sortProjection = reader.readCollection("sortProjection", new ArrayList<>(), WrappedMessage.class);
Object i = null;
if (instance != null) {
i = ProtobufUtil.fromWrappedByteArray(reader.getSerializationContext(), instance);
}
Object[] p = null;
if (!projection.isEmpty()) {
p = new Object[projection.size()];
int j = 0;
for (WrappedMessage m : projection) {
p[j++] = m.getValue();
}
}
Comparable[] sp = null;
if (!sortProjection.isEmpty()) {
sp = new Comparable[sortProjection.size()];
int j = 0;
for (WrappedMessage m : sortProjection) {
sp[j++] = (Comparable) m.getValue();
}
}
return new FilterResult(i, p, sp);
}
@Override
public void writeTo(ProtoStreamWriter writer, FilterResult filterResult) throws IOException {
if (filterResult.getProjection() == null) {
// skip marshalling the instance if there is a projection
writer.writeBytes("instance", (byte[]) filterResult.getInstance());
} else {
WrappedMessage[] p = new WrappedMessage[filterResult.getProjection().length];
for (int i = 0; i < p.length; i++) {
p[i] = new WrappedMessage(filterResult.getProjection()[i]);
}
writer.writeArray("projection", p, WrappedMessage.class);
}
if (filterResult.getSortProjection() != null) {
WrappedMessage[] p = new WrappedMessage[filterResult.getSortProjection().length];
for (int i = 0; i < p.length; i++) {
p[i] = new WrappedMessage(filterResult.getSortProjection()[i]);
}
writer.writeArray("sortProjection", p, WrappedMessage.class);
}
}
@Override
public Class<? extends FilterResult> getJavaClass() {
return FilterResult.class;
}
@Override
public String getTypeName() {
return "org.infinispan.query.remote.client.FilterResult";
}
}
}