package org.vertexium.accumulo.iterator;
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.iterators.Filter;
import org.apache.accumulo.core.iterators.IteratorEnvironment;
import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
import org.apache.hadoop.io.Text;
import org.vertexium.accumulo.iterator.model.EdgeInfo;
import org.vertexium.accumulo.iterator.util.SetOfStringsEncoder;
import java.io.IOException;
import java.util.*;
public class EdgeRefFilter extends Filter {
private static final String SETTING_VERTEX_IDS = "vertexId";
private Set<String> vertexIdsSet;
private List<Text> nonVisibleEdges = Arrays.asList(
VertexIterator.CF_IN_EDGE_HIDDEN,
VertexIterator.CF_IN_EDGE_SOFT_DELETE,
VertexIterator.CF_OUT_EDGE_HIDDEN,
VertexIterator.CF_OUT_EDGE_SOFT_DELETE);
public static void setVertexIds(IteratorSetting settings, Set<String> vertexIdsSet) {
settings.addOption(SETTING_VERTEX_IDS, SetOfStringsEncoder.encodeToString(vertexIdsSet));
}
@Override
public void init(SortedKeyValueIterator<Key, Value> source, Map<String, String> options, IteratorEnvironment env) throws IOException {
super.init(source, options, env);
this.vertexIdsSet = SetOfStringsEncoder.decodeFromString(options.get(SETTING_VERTEX_IDS));
}
@Override
public SortedKeyValueIterator<Key, Value> deepCopy(IteratorEnvironment env) {
EdgeRefFilter edgeRefFilter = (EdgeRefFilter) super.deepCopy(env);
edgeRefFilter.vertexIdsSet = new HashSet<>(this.vertexIdsSet);
return edgeRefFilter;
}
@Override
public boolean accept(Key k, Value v) {
Text columnFamily = k.getColumnFamily();
if (columnFamily.equals(VertexIterator.CF_IN_EDGE) || columnFamily.equals(VertexIterator.CF_OUT_EDGE)) {
EdgeInfo edgeInfo = new EdgeInfo(v.get(), k.getTimestamp());
return vertexIdsSet.contains(edgeInfo.getVertexId());
}
return nonVisibleEdges.contains(columnFamily);
}
}