package org.vertexium.accumulo.iterator;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.iterators.IteratorEnvironment;
import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
import org.apache.accumulo.core.iterators.user.RowEncodingIterator;
import org.apache.hadoop.io.Text;
import org.vertexium.accumulo.iterator.model.VertexiumAccumuloIteratorException;
import org.vertexium.accumulo.iterator.util.ByteArrayWrapper;
import org.vertexium.accumulo.iterator.util.DataInputStreamUtils;
import org.vertexium.accumulo.iterator.util.DataOutputStreamUtils;
import java.io.*;
import java.util.Iterator;
import java.util.List;
import java.util.SortedMap;
public class VertexEdgeIdIterator extends RowEncodingIterator {
@Override
public SortedMap<Key, Value> rowDecoder(Key rowKey, Value rowValue) throws IOException {
throw new VertexiumAccumuloIteratorException("Not Implemented");
}
@Override
public Value rowEncoder(List<Key> keys, List<Value> values) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (Key key : keys) {
if (!key.getColumnFamily().equals(VertexIterator.CF_OUT_EDGE)
&& !key.getColumnFamily().equals(VertexIterator.CF_IN_EDGE)) {
continue;
}
Text edgeId = key.getColumnQualifier();
DataOutputStreamUtils.encodeByteArray(out, edgeId.getBytes());
}
return new Value(baos.toByteArray());
}
@Override
public SortedKeyValueIterator<Key, Value> deepCopy(IteratorEnvironment env) {
return new VertexEdgeIdIterator();
}
public static Iterable<ByteArrayWrapper> decodeValue(final Value value) {
return new Iterable<ByteArrayWrapper>() {
@Override
public Iterator<ByteArrayWrapper> iterator() {
ByteArrayInputStream bais = new ByteArrayInputStream(value.get());
final DataInputStream in = new DataInputStream(bais);
return new Iterator<ByteArrayWrapper>() {
@Override
public boolean hasNext() {
try {
return in.available() > 0;
} catch (IOException e) {
throw new VertexiumAccumuloIteratorException("Could not get available", e);
}
}
@Override
public ByteArrayWrapper next() {
try {
return DataInputStreamUtils.decodeByteArrayWrapper(in);
} catch (IOException e) {
throw new VertexiumAccumuloIteratorException("Could not read text", e);
}
}
@Override
public void remove() {
throw new VertexiumAccumuloIteratorException("not implemented");
}
};
}
};
}
}