
prerna.reactor.frame.graph.ConnectedNodesReactor Maven / Gradle / Ivy
The newest version!
package prerna.reactor.frame.graph;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import prerna.ds.TinkerFrame;
import prerna.query.querystruct.filters.IQueryFilter;
import prerna.query.querystruct.filters.SimpleQueryFilter;
import prerna.query.querystruct.selectors.QueryColumnSelector;
import prerna.reactor.frame.AbstractFrameReactor;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.nounmeta.NounMetadata;
public class ConnectedNodesReactor extends AbstractFrameReactor {
private static final String DEGREE_SEPERATION = "deg";
private static final String DIRECTION = "dir";
public ConnectedNodesReactor() {
this.keysToGet = new String[]{ReactorKeysEnum.FRAME.getKey(), ReactorKeysEnum.COLUMN.getKey(),
ReactorKeysEnum.VALUES.getKey(), DEGREE_SEPERATION, DIRECTION};
}
@Override
public NounMetadata execute() {
TinkerFrame tinker = (TinkerFrame) getFrame();
String nodeType = getColumn();
List nodeValues = getValues();
int seperation = getDegreeSep();
String direction = getDirection();
findConnectedVertices(tinker, nodeType, nodeValues, seperation, direction);
return new NounMetadata(true, PixelDataType.BOOLEAN, PixelOperationType.FRAME_FILTER);
}
public static void findConnectedVertices(TinkerFrame tf, String columnType, List instances, int numTraversals, String direction) {
// get the correct physical name
String nodeType = tf.getMetaData().getPhysicalName(columnType);
//keep set of all vertices to keep
List instancesToKeep = new Vector();
GraphTraversal t1 = tf.g.traversal().V()
.has(TinkerFrame.TINKER_TYPE, nodeType)
.has(TinkerFrame.TINKER_NAME, P.within(instances))
.emit();
// use if we want directions or both
if(direction.equals("in")) {
t1 = t1.repeat(__.in().simplePath());
} else if(direction.equals("out")) {
t1 = t1.repeat(__.out().simplePath());
} else {
t1 = t1.repeat(__.both().simplePath());
}
t1 = t1.times(numTraversals).dedup();
while(t1.hasNext()) {
Vertex v = t1.next();
instancesToKeep.add(v);
}
int size = instancesToKeep.size();
if(size == 0) {
throw new IllegalStateException("Could not find any paths");
}
// remove the current frame filters
tf.getFrameFilters().removeAllFilters();
Map> colToValues = new HashMap>();
for(Vertex v : instancesToKeep) {
String type = v.value(TinkerFrame.TINKER_TYPE);
Object value = v.value(TinkerFrame.TINKER_NAME);
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy