use of com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction in project GraphScope by alibaba.
the class VertexTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
TreeNodeLabelManager labelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
Message.Value.Builder argumentBuilder = createArgumentBuilder();
if (null != edgeLabels) {
for (String edgeLabel : edgeLabels) {
argumentBuilder.addIntValueList(schema.getElement(edgeLabel).getLabelId());
}
}
ProcessorFunction processorFunction = new ProcessorFunction(getCountOperator(QueryFlowOuterClass.OperatorType.valueOf(direction.name())), argumentBuilder, rangeLimit);
if (direction == Direction.OUT && getInputNode().isPropLocalFlag()) {
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager, new LogicalEdge(EdgeShuffleType.FORWARD));
} else {
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager);
}
}
use of com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction in project GraphScope by alibaba.
the class WherePredicateTreeNode method processComplexNode.
private int processComplexNode(ContextManager contextManager, VertexIdManager vertexIdManager, TreeNodeLabelManager labelManager, LogicalSubQueryPlan logicalSubQueryPlan, LogicalVertex sourceVertex, TreeNode ringNode) {
if (ringNode instanceof JoinZeroNode) {
((JoinZeroNode) ringNode).disableJoinZero();
}
LogicalSubQueryPlan subQueryPlan = TreeNodeUtils.buildSubQueryPlan(ringNode, sourceVertex, contextManager);
LogicalVertex secondValueVertex = subQueryPlan.getOutputVertex();
logicalSubQueryPlan.mergeLogicalQueryPlan(subQueryPlan);
String secondValueLabel = labelManager.createSysLabelStart("val");
int labelId = labelManager.getLabelIndex(secondValueLabel);
QueryFlowOuterClass.OperatorType joinType = CompilerUtils.parseJoinOperatorType(ringNode);
LogicalBinaryVertex joinVertex = new LogicalBinaryVertex(vertexIdManager.getId(), new ProcessorFunction(joinType, Message.Value.newBuilder().setIntValue(labelId)), false, sourceVertex, secondValueVertex);
logicalSubQueryPlan.addLogicalVertex(joinVertex);
logicalSubQueryPlan.addLogicalEdge(sourceVertex, joinVertex, new LogicalEdge());
logicalSubQueryPlan.addLogicalEdge(secondValueVertex, joinVertex, new LogicalEdge());
return labelId;
}
use of com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction in project GraphScope by alibaba.
the class WherePredicateTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
TreeNodeLabelManager labelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
Map<String, Integer> labelIndexList = labelManager.getLabelIndexList();
if (ringEmptyFlag) {
Message.CompareType compareType = CompilerUtils.parseCompareType(predicate, predicate.getBiPredicate());
if (StringUtils.isEmpty(startKey)) {
String predicateKey = getPredicateValue();
if (null != contextManager.getStoreVertex(predicateKey)) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex storeVertex = contextManager.getStoreVertex(predicateKey);
LogicalVertex sourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(sourceVertex);
ProcessorFunction joinStoreFilterFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.JOIN_STORE_FILTER, Message.Value.newBuilder().setIntValue(CompilerUtils.parseCompareType(predicate, predicate.getBiPredicate()).getNumber()));
LogicalBinaryVertex logicalBinaryVertex = new LogicalBinaryVertex(vertexIdManager.getId(), joinStoreFilterFunction, getInputNode().isPropLocalFlag(), sourceVertex, storeVertex);
logicalSubQueryPlan.addLogicalVertex(logicalBinaryVertex);
logicalSubQueryPlan.addLogicalEdge(sourceVertex, logicalBinaryVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
setFinishVertex(logicalBinaryVertex, labelManager);
addUsedLabelAndRequirement(logicalBinaryVertex, labelManager);
return logicalSubQueryPlan;
} else {
int whereLabelId = labelIndexList.getOrDefault(predicateKey, TreeConstants.MAGIC_LABEL_ID);
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.WHERE, Message.Value.newBuilder().addIntValueList(compareType.getNumber()).addIntValueList(whereLabelId));
processorFunction.getUsedLabelList().add(whereLabelId);
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager);
}
} else {
int startLabelId = labelIndexList.getOrDefault(startKey, TreeConstants.MAGIC_LABEL_ID);
String predicateKey = getPredicateValue();
if (null != contextManager.getStoreVertex(predicateKey)) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex storeVertex = contextManager.getStoreVertex(predicateKey);
LogicalVertex sourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(sourceVertex);
ProcessorFunction joinStoreFilterFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.JOIN_STORE_FILTER, Message.Value.newBuilder().setIntValue(startLabelId));
LogicalBinaryVertex logicalBinaryVertex = new LogicalBinaryVertex(vertexIdManager.getId(), joinStoreFilterFunction, getInputNode().isPropLocalFlag(), sourceVertex, storeVertex);
logicalSubQueryPlan.addLogicalVertex(logicalBinaryVertex);
logicalSubQueryPlan.addLogicalEdge(sourceVertex, logicalBinaryVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
setFinishVertex(logicalBinaryVertex, labelManager);
addUsedLabelAndRequirement(logicalBinaryVertex, labelManager);
return logicalSubQueryPlan;
} else {
int whereLabelId = labelIndexList.getOrDefault(predicateKey, TreeConstants.MAGIC_LABEL_ID);
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.WHERE_LABEL, Message.Value.newBuilder().addIntValueList(compareType.getNumber()).addIntValueList(startLabelId).addIntValueList(whereLabelId));
processorFunction.getUsedLabelList().addAll(Lists.newArrayList(startLabelId, whereLabelId));
if ((startLabelId < 0 && whereLabelId < 0) || getInputNode().isPropLocalFlag()) {
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager);
} else {
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager);
}
}
}
} else {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex delegateSourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(delegateSourceVertex);
String inputLabel = labelManager.createSysLabelStart(getInputNode().getOutputVertex(), "val");
TreeNode firstRingNode = sourceNode;
if (TreeNodeUtils.checkMultipleOutput(firstRingNode)) {
firstRingNode = new RangeGlobalTreeNode(firstRingNode, schema, 0, 1);
}
TreeNode secondRingNode = targetNode;
if (TreeNodeUtils.checkMultipleOutput(secondRingNode)) {
secondRingNode = new RangeGlobalTreeNode(secondRingNode, schema, 0, 1);
}
int sourceLabelId, targetLabelId;
boolean selfValueFlag = false;
if (!TreeNodeUtils.checkJoinSourceFlag(firstRingNode)) {
// first ring is value node
if (!TreeNodeUtils.checkJoinSourceFlag(secondRingNode)) {
// second ring is value node
sourceLabelId = processFirstValueNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, firstRingNode);
targetLabelId = processSecondValueNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, secondRingNode);
} else {
// second ring is not value node
targetLabelId = processComplexNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, delegateSourceVertex, secondRingNode);
sourceLabelId = processFirstValueNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, firstRingNode);
}
} else {
// first ring is not value node
if (!TreeNodeUtils.checkJoinSourceFlag(secondRingNode)) {
// second ring is value node
sourceLabelId = processComplexNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, logicalSubQueryPlan.getOutputVertex(), firstRingNode);
targetLabelId = processSecondValueNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, secondRingNode);
} else {
// second ring is not value node
sourceLabelId = processComplexNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, logicalSubQueryPlan.getOutputVertex(), firstRingNode);
targetLabelId = processComplexNode(contextManager, vertexIdManager, labelManager, logicalSubQueryPlan, logicalSubQueryPlan.getOutputVertex(), secondRingNode);
selfValueFlag = true;
}
}
LogicalVertex currentOutputVertex = logicalSubQueryPlan.getOutputVertex();
Message.Value.Builder argumentBuilder = Message.Value.newBuilder().addIntValueList(CompilerUtils.parseCompareType(predicate, predicate.getBiPredicate()).getNumber()).addIntValueList(sourceLabelId).addIntValueList(targetLabelId);
ProcessorFunction whereFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.WHERE_LABEL, argumentBuilder);
whereFunction.getUsedLabelList().add(sourceLabelId);
whereFunction.getUsedLabelList().add(targetLabelId);
LogicalVertex whereVertex = new LogicalUnaryVertex(vertexIdManager.getId(), whereFunction, getInputNode().isPropLocalFlag(), currentOutputVertex);
logicalSubQueryPlan.addLogicalVertex(whereVertex);
logicalSubQueryPlan.addLogicalEdge(currentOutputVertex, whereVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
if (!selfValueFlag) {
ProcessorFunction inputValueFunction = TreeNodeUtils.createSelectOneFunction(inputLabel, Pop.first, labelIndexList);
LogicalVertex logicalVertex = new LogicalUnaryVertex(vertexIdManager.getId(), inputValueFunction, false, whereVertex);
logicalSubQueryPlan.addLogicalVertex(logicalVertex);
logicalSubQueryPlan.addLogicalEdge(whereVertex, logicalVertex, new LogicalEdge(EdgeShuffleType.FORWARD));
}
LogicalVertex outputVertex = logicalSubQueryPlan.getOutputVertex();
addUsedLabelAndRequirement(outputVertex, labelManager);
setFinishVertex(outputVertex, labelManager);
List<LogicalVertex> logicalVertexList = logicalSubQueryPlan.getLogicalVertexList();
logicalVertexList.remove(delegateSourceVertex);
return logicalSubQueryPlan;
}
}
use of com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction in project GraphScope by alibaba.
the class DfsRepeatGraphTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalQueryPlan sourceSubPlan = sourceTreeNode.buildLogicalQueryPlan(contextManager);
LogicalVertex sourceVertex = sourceSubPlan.getOutputVertex();
ProcessorSourceFunction processorSourceFunction = ProcessorSourceFunction.class.cast(sourceVertex.getProcessorFunction());
Message.Value.Builder argument = Message.Value.newBuilder().mergeFrom(processorSourceFunction.getArgumentBuilder().build()).setBoolValue(sourceTreeNode.getOutputValueType() instanceof VertexValueType);
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.DFS_REPEAT_GRAPH, argument);
processorFunction.getLogicalCompareList().addAll(processorSourceFunction.getLogicalCompareList());
return parseSingleUnaryVertex(contextManager.getVertexIdManager(), contextManager.getTreeNodeLabelManager(), processorFunction, contextManager);
}
use of com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction in project GraphScope by alibaba.
the class ElementValueTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
if (null == bypassTreeNode) {
Message.Value.Builder argumentBuilder = Message.Value.newBuilder().addIntValueList(SchemaUtils.getPropId(propKey, schema)).setBoolFlag(edgePropFlag());
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.PROP_VALUE, argumentBuilder);
return parseSingleUnaryVertex(contextManager.getVertexIdManager(), contextManager.getTreeNodeLabelManager(), processorFunction, contextManager);
} else {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex delegateSourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(delegateSourceVertex);
LogicalSubQueryPlan bypassPlan = TreeNodeUtils.buildQueryPlanWithSource(bypassTreeNode, contextManager.getTreeNodeLabelManager(), contextManager, contextManager.getVertexIdManager(), delegateSourceVertex);
logicalSubQueryPlan.mergeLogicalQueryPlan(bypassPlan);
LogicalVertex outputVertex = bypassPlan.getOutputVertex();
setFinishVertex(outputVertex, contextManager.getTreeNodeLabelManager());
addUsedLabelAndRequirement(outputVertex, contextManager.getTreeNodeLabelManager());
return logicalSubQueryPlan;
}
}
Aggregations