Search in sources :

Example 1 with CostMappingManager

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;
            });
        }
    }
}
Also used : TreeNodeLabelManager(com.alibaba.maxgraph.compiler.tree.TreeNodeLabelManager) CostMappingManager(com.alibaba.maxgraph.compiler.cost.CostMappingManager) RowFieldManager(com.alibaba.maxgraph.compiler.cost.RowFieldManager) CostModelManager(com.alibaba.maxgraph.compiler.cost.CostModelManager) RowField(com.alibaba.maxgraph.compiler.cost.RowField)

Example 2 with CostMappingManager

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());
            }
        }
    }
}
Also used : BaseTreeNode(com.alibaba.maxgraph.compiler.tree.BaseTreeNode) GraphSchema(com.alibaba.maxgraph.compiler.api.schema.GraphSchema) SourceTreeNode(com.alibaba.maxgraph.compiler.tree.source.SourceTreeNode) ProcessorLabelValueFunction(com.alibaba.maxgraph.compiler.logical.function.ProcessorLabelValueFunction) CompilerUtils(com.alibaba.maxgraph.compiler.utils.CompilerUtils) Set(java.util.Set) ContextManager(com.alibaba.maxgraph.compiler.optimizer.ContextManager) TreeNodeUtils(com.alibaba.maxgraph.compiler.utils.TreeNodeUtils) CostMappingManager(com.alibaba.maxgraph.compiler.cost.CostMappingManager) Message(com.alibaba.maxgraph.Message) ProcessorFunction(com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction) StringUtils(org.apache.commons.lang3.StringUtils) Collectors(java.util.stream.Collectors) CostModelManager(com.alibaba.maxgraph.compiler.cost.CostModelManager) Sets(com.google.common.collect.Sets) RowField(com.alibaba.maxgraph.compiler.cost.RowField) QueryFlowOuterClass(com.alibaba.maxgraph.QueryFlowOuterClass) TreeManager(com.alibaba.maxgraph.compiler.tree.TreeManager) List(java.util.List) Lists(com.google.common.collect.Lists) RowFieldManager(com.alibaba.maxgraph.compiler.cost.RowFieldManager) TreeNodeLabelManager(com.alibaba.maxgraph.compiler.tree.TreeNodeLabelManager) TreeNode(com.alibaba.maxgraph.compiler.tree.TreeNode) ProcessorFunction(com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction) SourceTreeNode(com.alibaba.maxgraph.compiler.tree.source.SourceTreeNode) BaseTreeNode(com.alibaba.maxgraph.compiler.tree.BaseTreeNode) SourceTreeNode(com.alibaba.maxgraph.compiler.tree.source.SourceTreeNode) TreeNode(com.alibaba.maxgraph.compiler.tree.TreeNode) BaseTreeNode(com.alibaba.maxgraph.compiler.tree.BaseTreeNode) ProcessorLabelValueFunction(com.alibaba.maxgraph.compiler.logical.function.ProcessorLabelValueFunction)

Aggregations

CostMappingManager (com.alibaba.maxgraph.compiler.cost.CostMappingManager)2 CostModelManager (com.alibaba.maxgraph.compiler.cost.CostModelManager)2 RowField (com.alibaba.maxgraph.compiler.cost.RowField)2 RowFieldManager (com.alibaba.maxgraph.compiler.cost.RowFieldManager)2 TreeNodeLabelManager (com.alibaba.maxgraph.compiler.tree.TreeNodeLabelManager)2 Message (com.alibaba.maxgraph.Message)1 QueryFlowOuterClass (com.alibaba.maxgraph.QueryFlowOuterClass)1 GraphSchema (com.alibaba.maxgraph.compiler.api.schema.GraphSchema)1 ProcessorFunction (com.alibaba.maxgraph.compiler.logical.function.ProcessorFunction)1 ProcessorLabelValueFunction (com.alibaba.maxgraph.compiler.logical.function.ProcessorLabelValueFunction)1 ContextManager (com.alibaba.maxgraph.compiler.optimizer.ContextManager)1 BaseTreeNode (com.alibaba.maxgraph.compiler.tree.BaseTreeNode)1 TreeManager (com.alibaba.maxgraph.compiler.tree.TreeManager)1 TreeNode (com.alibaba.maxgraph.compiler.tree.TreeNode)1 SourceTreeNode (com.alibaba.maxgraph.compiler.tree.source.SourceTreeNode)1 CompilerUtils (com.alibaba.maxgraph.compiler.utils.CompilerUtils)1 TreeNodeUtils (com.alibaba.maxgraph.compiler.utils.TreeNodeUtils)1 Lists (com.google.common.collect.Lists)1 Sets (com.google.common.collect.Sets)1 List (java.util.List)1