use of com.alibaba.maxgraph.compiler.logical.LogicalBinaryVertex in project GraphScope by alibaba.
the class OptionalTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalSubQueryPlan logicalQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex sourceVertex = getInputNode().getOutputVertex();
logicalQueryPlan.addLogicalVertex(sourceVertex);
LogicalVertex trueVertex = TreeNodeUtils.buildFilterTreeNode(this.branchTreeNode, contextManager, logicalQueryPlan, sourceVertex, schema);
ProcessorFunction joinFilterRightFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.JOIN_DIRECT_FILTER_NEGATE);
LogicalEdge leftEdge = getInputNode().isPropLocalFlag() ? new LogicalEdge(EdgeShuffleType.FORWARD) : new LogicalEdge(EdgeShuffleType.SHUFFLE_BY_KEY);
LogicalBinaryVertex falseVertex = new LogicalBinaryVertex(contextManager.getVertexIdManager().getId(), joinFilterRightFunction, getInputNode().isPropLocalFlag(), sourceVertex, trueVertex);
logicalQueryPlan.addLogicalVertex(falseVertex);
logicalQueryPlan.addLogicalEdge(sourceVertex, falseVertex, leftEdge);
logicalQueryPlan.addLogicalEdge(trueVertex, falseVertex, new LogicalEdge(EdgeShuffleType.SHUFFLE_BY_KEY));
LogicalQueryPlan truePlan = TreeNodeUtils.buildSubQueryPlan(this.trueNode, trueVertex, contextManager);
LogicalVertex trueOutputVertex = truePlan.getOutputVertex();
LogicalQueryPlan falsePlan = TreeNodeUtils.buildSubQueryPlan(this.falseNode, falseVertex, contextManager);
LogicalVertex falseOutputVertex = falsePlan.getOutputVertex();
logicalQueryPlan.mergeLogicalQueryPlan(truePlan);
logicalQueryPlan.mergeLogicalQueryPlan(falsePlan);
LogicalBinaryVertex unionVertex = new LogicalBinaryVertex(contextManager.getVertexIdManager().getId(), new ProcessorFunction(QueryFlowOuterClass.OperatorType.UNION), false, trueOutputVertex, falseOutputVertex);
logicalQueryPlan.addLogicalVertex(unionVertex);
logicalQueryPlan.addLogicalEdge(trueOutputVertex, unionVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
logicalQueryPlan.addLogicalEdge(falseOutputVertex, unionVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
setFinishVertex(unionVertex, contextManager.getTreeNodeLabelManager());
addUsedLabelAndRequirement(unionVertex, contextManager.getTreeNodeLabelManager());
return logicalQueryPlan;
}
use of com.alibaba.maxgraph.compiler.logical.LogicalBinaryVertex in project GraphScope by alibaba.
the class DfsFinishTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex delegateSourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(delegateSourceVertex);
LogicalVertex countVertex = new LogicalUnaryVertex(contextManager.getVertexIdManager().getId(), new ProcessorFunction(QueryFlowOuterClass.OperatorType.COUNT), false, delegateSourceVertex);
logicalSubQueryPlan.addLogicalVertex(countVertex);
logicalSubQueryPlan.addLogicalEdge(delegateSourceVertex, countVertex, new LogicalEdge());
Message.Value.Builder argument = Message.Value.newBuilder().setLongValue(maxRecordCount);
LogicalVertex dfsFinishVertex = new LogicalBinaryVertex(contextManager.getVertexIdManager().getId(), new ProcessorFunction(QueryFlowOuterClass.OperatorType.DFS_FINISH_JOIN, argument), true, repeatSourceVertex, countVertex);
logicalSubQueryPlan.addLogicalVertex(dfsFinishVertex);
logicalSubQueryPlan.addLogicalEdge(countVertex, dfsFinishVertex, new LogicalEdge(EdgeShuffleType.SHUFFLE_BY_CONST));
return logicalSubQueryPlan;
}
use of com.alibaba.maxgraph.compiler.logical.LogicalBinaryVertex in project GraphScope by alibaba.
the class TraversalFlatMapTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
TreeNodeLabelManager treeNodeLabelManager = contextManager.getTreeNodeLabelManager();
LogicalVertex inputVertex = getInputNode().getOutputVertex();
LogicalSubQueryPlan logicalQueryPlan = new LogicalSubQueryPlan(contextManager);
logicalQueryPlan.addLogicalVertex(inputVertex);
LogicalQueryPlan flatMapPlan = TreeNodeUtils.buildSubQueryPlan(flatMapNode, inputVertex, contextManager);
logicalQueryPlan.mergeLogicalQueryPlan(flatMapPlan);
LogicalVertex flatOutputVertex = logicalQueryPlan.getOutputVertex();
LogicalVertex inputTargetVertex = flatMapPlan.getTargetVertex(inputVertex);
if (inputTargetVertex.getProcessorFunction().getOperatorType() == QueryFlowOuterClass.OperatorType.ENTER_KEY && !(flatOutputVertex instanceof LogicalBinaryVertex)) {
flatOutputVertex.getAfterRequirementList().add(QueryFlowOuterClass.RequirementValue.newBuilder().setReqType(QueryFlowOuterClass.RequirementType.KEY_DEL));
}
addUsedLabelAndRequirement(flatOutputVertex, treeNodeLabelManager);
setFinishVertex(flatOutputVertex, treeNodeLabelManager);
return logicalQueryPlan;
}
use of com.alibaba.maxgraph.compiler.logical.LogicalBinaryVertex in project GraphScope by alibaba.
the class NotTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex delegateSourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(delegateSourceVertex);
TreeNode currentNotNode = TreeNodeUtils.buildSingleOutputNode(notTreeNode, schema);
LogicalSubQueryPlan notQueryPlan = TreeNodeUtils.buildSubQueryPlanWithKey(currentNotNode, delegateSourceVertex, contextManager.getTreeNodeLabelManager(), contextManager, contextManager.getVertexIdManager());
LogicalVertex notValueVertex = notQueryPlan.getOutputVertex();
logicalSubQueryPlan.mergeLogicalQueryPlan(notQueryPlan);
TreeNode sourceNode = TreeNodeUtils.getSourceTreeNode(currentNotNode);
LogicalVertex enterKeyVertex = sourceNode.getOutputVertex();
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.JOIN_DIRECT_FILTER_NEGATE);
LogicalBinaryVertex logicalBinaryVertex = new LogicalBinaryVertex(contextManager.getVertexIdManager().getId(), processorFunction, false, enterKeyVertex, notValueVertex);
logicalSubQueryPlan.addLogicalVertex(logicalBinaryVertex);
logicalSubQueryPlan.addLogicalEdge(enterKeyVertex, logicalBinaryVertex, new LogicalEdge());
logicalSubQueryPlan.addLogicalEdge(notValueVertex, logicalBinaryVertex, new LogicalEdge());
LogicalVertex outputVertex = logicalSubQueryPlan.getOutputVertex();
addUsedLabelAndRequirement(outputVertex, contextManager.getTreeNodeLabelManager());
setFinishVertex(outputVertex, contextManager.getTreeNodeLabelManager());
return logicalSubQueryPlan;
}
use of com.alibaba.maxgraph.compiler.logical.LogicalBinaryVertex in project GraphScope by alibaba.
the class TreeNodeUtils method buildFilterTreeNode.
/**
* Build logical plan with filter tree node and output the input value
*/
public static LogicalVertex buildFilterTreeNode(TreeNode treeNode, ContextManager contextManager, LogicalQueryPlan logicalQueryPlan, LogicalVertex sourceVertex, GraphSchema schema) {
TreeNodeLabelManager labelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
TreeNode filterTreeNode = TreeNodeUtils.optimizeSubFilterNode(treeNode);
UnaryTreeNode unaryTreeNode = UnaryTreeNode.class.cast(filterTreeNode);
LogicalVertex outputVertex;
if (unaryTreeNode.getInputNode() instanceof SourceTreeNode && (unaryTreeNode instanceof SelectOneTreeNode || unaryTreeNode instanceof PropertyNode)) {
// optimize traversal filter to filter operator
int propId;
if (unaryTreeNode instanceof SelectOneTreeNode) {
propId = labelManager.getLabelIndex(SelectOneTreeNode.class.cast(unaryTreeNode).getSelectLabel());
} else {
propId = SchemaUtils.getPropId(PropertyNode.class.cast(unaryTreeNode).getPropKeyList().iterator().next(), schema);
}
Message.LogicalCompare logicalCompare = Message.LogicalCompare.newBuilder().setCompare(Message.CompareType.EXIST).setPropId(propId).build();
ProcessorFilterFunction processorFunction = new ProcessorFilterFunction(QueryFlowOuterClass.OperatorType.HAS);
if (propId < 0) {
processorFunction.getUsedLabelList().add(propId);
}
processorFunction.getLogicalCompareList().add(logicalCompare);
outputVertex = new LogicalUnaryVertex(vertexIdManager.getId(), processorFunction, false, sourceVertex);
logicalQueryPlan.addLogicalVertex(outputVertex);
logicalQueryPlan.addLogicalEdge(sourceVertex, outputVertex, new LogicalEdge());
} else {
TreeNode currentFilterTreeNode = TreeNodeUtils.buildSingleOutputNode(filterTreeNode, schema);
// build filter plan, and use join direct filter vertex to filter left stream
LogicalSubQueryPlan filterPlan = TreeNodeUtils.buildSubQueryPlan(currentFilterTreeNode, sourceVertex, contextManager);
TreeNode filterSourceNode = TreeNodeUtils.getSourceTreeNode(currentFilterTreeNode);
sourceVertex = filterSourceNode.getOutputVertex();
LogicalVertex rightVertex = filterPlan.getOutputVertex();
logicalQueryPlan.mergeLogicalQueryPlan(filterPlan);
if (TreeNodeUtils.checkJoinSourceFlag(currentFilterTreeNode)) {
LogicalBinaryVertex filterJoinVertex = new LogicalBinaryVertex(vertexIdManager.getId(), new ProcessorFunction(QueryFlowOuterClass.OperatorType.JOIN_DIRECT_FILTER), false, sourceVertex, rightVertex);
logicalQueryPlan.addLogicalVertex(filterJoinVertex);
logicalQueryPlan.addLogicalEdge(sourceVertex, filterJoinVertex, new LogicalEdge());
logicalQueryPlan.addLogicalEdge(rightVertex, filterJoinVertex, new LogicalEdge());
outputVertex = filterJoinVertex;
} else if (TreeNodeUtils.checkSelectFlag(currentFilterTreeNode)) {
String inputLabel = labelManager.createSysLabelStart(sourceVertex, "input");
ProcessorFunction selectFunction = createSelectOneFunction(inputLabel, Pop.last, labelManager.getLabelIndexList());
LogicalUnaryVertex selectVertex = new LogicalUnaryVertex(vertexIdManager.getId(), selectFunction, false, rightVertex);
logicalQueryPlan.addLogicalVertex(selectVertex);
logicalQueryPlan.addLogicalEdge(rightVertex, selectVertex, new LogicalEdge());
outputVertex = logicalQueryPlan.getOutputVertex();
} else {
outputVertex = logicalQueryPlan.getOutputVertex();
}
}
return outputVertex;
}
Aggregations