use of com.alibaba.maxgraph.compiler.cost.CostMappingManager in project GraphScope by alibaba.
the class LogicalPlanBuilder method processCostModel.
private void processCostModel(TreeNode currentNode, LogicalQueryPlan queryPlan, ContextManager contextManager, GraphSchema schema, Set<Integer> labelIdList) {
CostModelManager costModelManager = contextManager.getCostModelManager();
TreeNodeLabelManager treeNodeLabelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
if (costModelManager.hasBestPath()) {
CostMappingManager costMappingManager = costModelManager.getCostMappingManager();
RowFieldManager rowFieldManager = costModelManager.getPathFieldManager();
if (null == rowFieldManager) {
return;
}
RowField rowField = rowFieldManager.getRowField();
Set<String> birthFieldList = rowFieldManager.getBirthFieldList();
Set<String> fieldList = rowField.getFieldList();
for (String field : fieldList) {
LogicalVertex outputVertex = queryPlan.getOutputVertex();
if (birthFieldList.contains(field)) {
buildLabelValuePlan(queryPlan, contextManager, schema, outputVertex, treeNodeLabelManager, vertexIdManager, costMappingManager, field, currentNode);
} else {
RowFieldManager parentFieldManager = rowFieldManager.getParent();
if (!parentFieldManager.getRowField().getFieldList().contains(field)) {
buildLabelValuePlan(queryPlan, contextManager, schema, outputVertex, treeNodeLabelManager, vertexIdManager, costMappingManager, field, currentNode);
}
}
}
currentNode.setFinishVertex(queryPlan.getOutputVertex(), null);
}
List<LogicalVertex> logicalVertexList = queryPlan.getLogicalVertexList();
for (LogicalVertex vertex : logicalVertexList) {
if (vertex.getProcessorFunction() != null && vertex.getProcessorFunction().getOperatorType() == QueryFlowOuterClass.OperatorType.LABEL_VALUE) {
if (vertex.getProcessorFunction().getArgumentBuilder().getIntValue() != 0) {
labelIdList.add(vertex.getProcessorFunction().getArgumentBuilder().getIntValue());
}
} else {
vertex.getBeforeRequirementList().removeIf(vv -> {
if (vv.getReqType() == QueryFlowOuterClass.RequirementType.LABEL_START) {
List<Integer> intValueList = Lists.newArrayList(vv.getReqArgument().getIntValueListList());
intValueList.removeIf(labelIdList::contains);
if (intValueList.isEmpty()) {
return true;
}
vv.getReqArgumentBuilder().clearIntValueList().addAllIntValueList(intValueList);
}
return false;
});
}
}
}
use of com.alibaba.maxgraph.compiler.cost.CostMappingManager in project GraphScope by alibaba.
the class LogicalPlanBuilder method buildLabelValuePlan.
private void buildLabelValuePlan(LogicalQueryPlan queryPlan, ContextManager contextManager, GraphSchema schema, LogicalVertex outputVertex, TreeNodeLabelManager treeNodeLabelManager, VertexIdManager vertexIdManager, CostMappingManager costMappingManager, String field, TreeNode currNode) {
// Create field value here
String parentField = costMappingManager.getValueParent(field);
if (!StringUtils.isEmpty(parentField)) {
BaseTreeNode nextNode = (BaseTreeNode) currNode.getOutputNode();
nextNode.removeBeforeLabel(parentField);
// If the field is value field, process it and remove the label requirement in vertex
int labelIndex = treeNodeLabelManager.getLabelIndex(parentField);
TreeNode fieldValueTreeNode = costMappingManager.getComputeTreeByValue(parentField);
if (!(fieldValueTreeNode instanceof SourceTreeNode)) {
for (QueryFlowOuterClass.RequirementValue.Builder reqValue : outputVertex.getAfterRequirementList()) {
if (reqValue.getReqType() == QueryFlowOuterClass.RequirementType.LABEL_START) {
List<Integer> labelIndexList = reqValue.getReqArgumentBuilder().getIntValueListList().stream().filter(v -> v != labelIndex).collect(Collectors.toList());
reqValue.getReqArgumentBuilder().clearIntValueList().addAllIntValueList(labelIndexList);
}
}
TreeNode currentFilterTreeNode = TreeNodeUtils.buildSingleOutputNode(fieldValueTreeNode, schema);
// build filter plan, and use join direct filter vertex to filter left stream
LogicalSubQueryPlan fieldValuePlan = TreeNodeUtils.buildSubQueryPlan(currentFilterTreeNode, outputVertex, contextManager);
List<LogicalVertex> fieldValueVertexList = fieldValuePlan.getLogicalVertexList();
if (fieldValueVertexList.size() == 2) {
LogicalVertex fieldValueVertex = fieldValueVertexList.get(1);
ProcessorLabelValueFunction labelValueFunction = new ProcessorLabelValueFunction(labelIndex, fieldValueVertex);
LogicalVertex labelValueVertex = new LogicalUnaryVertex(vertexIdManager.getId(), labelValueFunction, outputVertex);
queryPlan.addLogicalVertex(labelValueVertex);
queryPlan.addLogicalEdge(outputVertex, labelValueVertex, LogicalEdge.shuffleByKey(labelIndex));
} else {
LogicalVertex fieldValueVertex = fieldValuePlan.getOutputVertex();
fieldValueVertex.getAfterRequirementList().add(QueryFlowOuterClass.RequirementValue.newBuilder().setReqType(QueryFlowOuterClass.RequirementType.LABEL_START).setReqArgument(Message.Value.newBuilder().addIntValueList(labelIndex)));
queryPlan.mergeLogicalQueryPlan(fieldValuePlan);
LogicalVertex outputKeyVertex = new LogicalUnaryVertex(vertexIdManager.getId(), new ProcessorFunction(QueryFlowOuterClass.OperatorType.KEY_MESSAGE), fieldValueVertex);
queryPlan.addLogicalVertex(outputKeyVertex);
queryPlan.addLogicalEdge(fieldValueVertex, outputKeyVertex, LogicalEdge.forwardEdge());
}
}
}
}
Aggregations