use of com.alibaba.maxgraph.compiler.tree.source.SourceDelegateNode in project GraphScope by alibaba.
the class TreeBuilder method visitStoreStep.
private TreeNode visitStoreStep(StoreStep step, TreeNode prev) {
String sideEffectKey = checkNotNull(step.getSideEffectKey());
Traversal.Admin<?, ?> storeTraversal = ReflectionUtils.getFieldValue(StoreStep.class, step, "storeTraversal");
storeSubgraphKeyList.add(sideEffectKey);
boolean saveFlag = rootPathFlag;
rootPathFlag = false;
TreeNode storeTreeNode = null;
if (null != storeTraversal) {
storeTreeNode = travelTraversalAdmin(storeTraversal, new SourceDelegateNode(prev, schema));
}
rootPathFlag = saveFlag;
return new StoreTreeNode(prev, schema, sideEffectKey, storeTreeNode);
}
use of com.alibaba.maxgraph.compiler.tree.source.SourceDelegateNode in project GraphScope by alibaba.
the class OrderGlobalTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex delegateSourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(delegateSourceVertex);
TreeNodeLabelManager labelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
Message.OrderComparatorList.Builder comparatorList = Message.OrderComparatorList.newBuilder();
Set<String> propFillList = Sets.newHashSet();
Set<Integer> usedLabelIdList = Sets.newHashSet();
LogicalVertex lastJoinVertex = null;
LogicalVertex inputVertex = delegateSourceVertex;
for (int i = 0; i < treeNodeOrderList.size(); i++) {
Pair<TreeNode, Order> orderPair = treeNodeOrderList.get(i);
if (orderPair.getLeft() instanceof SourceDelegateNode) {
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(0).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
} else {
UnaryTreeNode unaryTreeNode = UnaryTreeNode.class.cast(orderPair.getLeft());
if (unaryTreeNode.getInputNode() instanceof SourceDelegateNode && ((unaryTreeNode instanceof SelectOneTreeNode && SelectOneTreeNode.class.cast(unaryTreeNode).getTraversalTreeNode() == null) || (unaryTreeNode instanceof ElementValueTreeNode && ElementValueTreeNode.class.cast(unaryTreeNode).getByPassTraversal() == null) || unaryTreeNode instanceof TokenTreeNode || (unaryTreeNode instanceof TraversalMapTreeNode && ((TraversalMapTreeNode) unaryTreeNode).getTraversalNode() instanceof ColumnTreeNode && ((ColumnTreeNode) ((TraversalMapTreeNode) unaryTreeNode).getTraversalNode()).getInputNode() instanceof SourceDelegateNode))) {
if (unaryTreeNode instanceof SelectOneTreeNode) {
int labelId = labelManager.getLabelIndex(SelectOneTreeNode.class.cast(unaryTreeNode).getSelectLabel());
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(labelId).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
usedLabelIdList.add(labelId);
} else if (unaryTreeNode instanceof TokenTreeNode) {
int labelId = labelManager.getLabelIndex(TokenTreeNode.class.cast(unaryTreeNode).getToken().getAccessor());
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(labelId).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
} else if (unaryTreeNode instanceof ElementValueTreeNode) {
String propKey = ElementValueTreeNode.class.cast(unaryTreeNode).getPropKeyList().iterator().next();
propFillList.add(propKey);
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(CompilerUtils.getPropertyId(schema, propKey)).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
} else {
TraversalMapTreeNode traversalMapTreeNode = TraversalMapTreeNode.class.cast(unaryTreeNode);
ColumnTreeNode columnTreeNode = (ColumnTreeNode) traversalMapTreeNode.getTraversalNode();
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(labelManager.getLabelIndex(columnTreeNode.getColumn().name())).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
}
} else {
TreeNode compareTreeNode = TreeNodeUtils.buildSingleOutputNode(orderPair.getLeft(), schema);
Pair<LogicalQueryPlan, Integer> planLabelPair = TreeNodeUtils.buildSubQueryWithLabel(compareTreeNode, inputVertex, contextManager);
inputVertex = planLabelPair.getLeft().getOutputVertex();
logicalSubQueryPlan.mergeLogicalQueryPlan(planLabelPair.getLeft());
comparatorList.addOrderComparator(Message.OrderComparator.newBuilder().setPropId(planLabelPair.getRight()).setOrderType(Message.OrderType.valueOf(StringUtils.upperCase(orderPair.getRight().name()))).build());
usedLabelIdList.add(planLabelPair.getRight());
}
}
}
if (!propFillList.isEmpty() && getInputNode().getOutputValueType() instanceof VertexValueType) {
LogicalVertex propFillInputVertex = logicalSubQueryPlan.getOutputVertex();
ProcessorFunction propFillFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.PROP_FILL, Message.Value.newBuilder().addAllIntValueList(propFillList.stream().map(v -> CompilerUtils.getPropertyId(schema, v)).collect(Collectors.toSet())));
LogicalVertex propFillVertex = new LogicalUnaryVertex(vertexIdManager.getId(), propFillFunction, true, propFillInputVertex);
LogicalEdge logicalEdge;
if (propFillInputVertex.isPropLocalFlag()) {
logicalEdge = new LogicalEdge(EdgeShuffleType.FORWARD);
} else {
logicalEdge = new LogicalEdge(EdgeShuffleType.SHUFFLE_BY_KEY);
}
logicalSubQueryPlan.addLogicalVertex(propFillVertex);
logicalSubQueryPlan.addLogicalEdge(propFillInputVertex, propFillVertex, logicalEdge);
}
Message.Value.Builder argumentBuilder = Message.Value.newBuilder().setPayload(comparatorList.build().toByteString());
if (orderFlag) {
argumentBuilder.setBoolValue(true).setIntValue(labelManager.getLabelIndex(orderFlagLabel));
}
argumentBuilder.setBoolFlag(partitionIdFlag).setLongValue(SHUFFLE_THRESHOLD).setOrderFlag(orderKeyFlag);
ProcessorFunction orderFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.ORDER, argumentBuilder, rangeLimit);
orderFunction.getUsedLabelList().addAll(usedLabelIdList);
LogicalVertex outputVertex = logicalSubQueryPlan.getOutputVertex();
LogicalVertex orderVertex = new LogicalUnaryVertex(vertexIdManager.getId(), orderFunction, false, outputVertex);
logicalSubQueryPlan.addLogicalVertex(orderVertex);
logicalSubQueryPlan.addLogicalEdge(outputVertex, orderVertex, new LogicalEdge());
addUsedLabelAndRequirement(orderVertex, labelManager);
setFinishVertex(orderVertex, labelManager);
return logicalSubQueryPlan;
}
use of com.alibaba.maxgraph.compiler.tree.source.SourceDelegateNode in project GraphScope by alibaba.
the class DedupGlobalTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
LogicalSubQueryPlan logicalSubQueryPlan = new LogicalSubQueryPlan(contextManager);
LogicalVertex sourceVertex = getInputNode().getOutputVertex();
logicalSubQueryPlan.addLogicalVertex(sourceVertex);
QueryFlowOuterClass.OperatorType dedupType = getUseKeyOperator(QueryFlowOuterClass.OperatorType.DEDUP);
if (null == dedupTreeNode || dedupTreeNode instanceof SourceDelegateNode) {
ProcessorFunction dedupFunction = new ProcessorFunction(dedupType);
LogicalVertex dedupVertex = new LogicalUnaryVertex(contextManager.getVertexIdManager().getId(), dedupFunction, isPropLocalFlag(), sourceVertex);
logicalSubQueryPlan.addLogicalVertex(dedupVertex);
logicalSubQueryPlan.addLogicalEdge(sourceVertex, dedupVertex, new LogicalEdge());
} else {
UnaryTreeNode unaryDedupTreeNode = UnaryTreeNode.class.cast(dedupTreeNode);
if (unaryDedupTreeNode.getInputNode() instanceof SourceDelegateNode && ((unaryDedupTreeNode instanceof ElementValueTreeNode && ElementValueTreeNode.class.cast(unaryDedupTreeNode).getByPassTraversal() == null) || unaryDedupTreeNode instanceof SelectOneTreeNode || unaryDedupTreeNode instanceof TokenTreeNode)) {
// id()/label() has been converted to select one tree node
Message.Value.Builder argumentBuilder = Message.Value.newBuilder();
Set<Integer> usedLabelList = Sets.newHashSet();
if (unaryDedupTreeNode instanceof ElementValueTreeNode) {
String propKey = ((ElementValueTreeNode) unaryDedupTreeNode).getPropKeyList().iterator().next();
int propId = SchemaUtils.getPropId(propKey, schema);
argumentBuilder.setIntValue(propId);
} else if (unaryDedupTreeNode instanceof TokenTreeNode) {
T token = ((TokenTreeNode) unaryDedupTreeNode).getToken();
argumentBuilder.setIntValue(contextManager.getTreeNodeLabelManager().getLabelIndex(token.getAccessor()));
} else {
String label = ((SelectOneTreeNode) unaryDedupTreeNode).getSelectLabel();
argumentBuilder.setIntValue(contextManager.getTreeNodeLabelManager().getLabelIndex(label));
usedLabelList.add(contextManager.getTreeNodeLabelManager().getLabelIndex(label));
}
ProcessorFunction dedupFunction = new ProcessorFunction(dedupType, argumentBuilder);
LogicalVertex dedupVertex = new LogicalUnaryVertex(contextManager.getVertexIdManager().getId(), dedupFunction, isPropLocalFlag(), sourceVertex);
logicalSubQueryPlan.addLogicalVertex(dedupVertex);
logicalSubQueryPlan.addLogicalEdge(sourceVertex, dedupVertex, new LogicalEdge());
} else {
TreeNode currentDedupNode = TreeNodeUtils.buildSingleOutputNode(dedupTreeNode, schema);
Pair<LogicalQueryPlan, Integer> planLabelPair = TreeNodeUtils.buildSubQueryWithLabel(currentDedupNode, sourceVertex, contextManager);
logicalSubQueryPlan.mergeLogicalQueryPlan(planLabelPair.getLeft());
LogicalVertex dedupInputVertex = logicalSubQueryPlan.getOutputVertex();
ProcessorFunction dedupFunction = new ProcessorFunction(dedupType, Message.Value.newBuilder().setIntValue(planLabelPair.getRight()));
dedupFunction.getUsedLabelList().add(planLabelPair.getRight());
LogicalVertex dedupVertex = new LogicalUnaryVertex(contextManager.getVertexIdManager().getId(), dedupFunction, isPropLocalFlag(), dedupInputVertex);
logicalSubQueryPlan.addLogicalVertex(dedupVertex);
logicalSubQueryPlan.addLogicalEdge(dedupInputVertex, dedupVertex, new LogicalEdge());
}
}
LogicalVertex dedupVertex = logicalSubQueryPlan.getOutputVertex();
addUsedLabelAndRequirement(dedupVertex, contextManager.getTreeNodeLabelManager());
setFinishVertex(dedupVertex, contextManager.getTreeNodeLabelManager());
return logicalSubQueryPlan;
}
use of com.alibaba.maxgraph.compiler.tree.source.SourceDelegateNode in project GraphScope by alibaba.
the class SelectTreeNode method buildLogicalQueryPlan.
@Override
public LogicalSubQueryPlan buildLogicalQueryPlan(ContextManager contextManager) {
TreeNodeLabelManager labelManager = contextManager.getTreeNodeLabelManager();
VertexIdManager vertexIdManager = contextManager.getVertexIdManager();
Set<String> labelStartList = (Set<String>) this.beforeRequirementList.get(QueryFlowOuterClass.RequirementType.LABEL_START);
if (!traversalTreeNodeList.isEmpty() && null != labelStartList && !labelStartList.isEmpty()) {
for (int i = 0; i < selectKeyList.size(); i++) {
String selectKey = selectKeyList.get(i);
TreeNode selectTreeNode = traversalTreeNodeList.get(i % traversalTreeNodeList.size());
if (!(selectTreeNode instanceof SourceDelegateNode)) {
labelStartList.remove(selectKey);
}
}
}
if (null == labelStartList || labelStartList.isEmpty()) {
this.beforeRequirementList.remove(QueryFlowOuterClass.RequirementType.LABEL_START);
}
if (!contextManager.getCostModelManager().hasBestPath()) {
Map<String, Integer> labelIndexList = labelManager.getLabelIndexList();
if (traversalTreeNodeList.isEmpty()) {
Set<String> selectKeySet = Sets.newHashSet();
Message.Value.Builder argumentBuilder = Message.Value.newBuilder().setBoolValue(true).setIntValue(pop == null ? Message.PopType.POP_EMPTY.getNumber() : Message.PopType.valueOf(StringUtils.upperCase(pop.name())).getNumber());
List<Integer> selectKeyIdList = Lists.newArrayList();
for (String selectKey : selectKeyList) {
if (selectKeySet.contains(selectKey)) {
continue;
}
selectKeySet.add(selectKey);
if (!labelIndexList.containsKey(selectKey)) {
argumentBuilder.setBoolValue(false);
break;
}
selectKeyIdList.add(labelIndexList.get(selectKey));
}
argumentBuilder.addAllIntValueList(selectKeyIdList).addAllStrValueList(selectKeyIdList.stream().map(v -> labelManager.getLabelName(v)).collect(Collectors.toList()));
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.SELECT, argumentBuilder);
return parseSingleUnaryVertex(vertexIdManager, labelManager, processorFunction, contextManager);
} else {
LogicalSubQueryPlan logicalSubQueryPlan = parseJoinQueryPlan(contextManager, vertexIdManager, labelManager, labelIndexList);
LogicalVertex outputVertex = logicalSubQueryPlan.getOutputVertex();
addUsedLabelAndRequirement(outputVertex, labelManager);
setFinishVertex(outputVertex, labelManager);
return logicalSubQueryPlan;
}
} else {
Map<String, Integer> labelIndexList = labelManager.getLabelIndexList();
Set<String> selectKeySet = Sets.newHashSet();
Message.Value.Builder argumentBuilder = Message.Value.newBuilder().setBoolValue(true).setIntValue(pop == null ? Message.PopType.POP_EMPTY.getNumber() : Message.PopType.valueOf(StringUtils.upperCase(pop.name())).getNumber());
List<Integer> selectKeyIdList = Lists.newArrayList();
for (String selectKey : selectKeyList) {
if (selectKeySet.contains(selectKey)) {
continue;
}
selectKeySet.add(selectKey);
if (!labelIndexList.containsKey(selectKey)) {
argumentBuilder.setBoolValue(false);
break;
}
selectKeyIdList.add(labelIndexList.get(selectKey));
}
argumentBuilder.addAllIntValueList(selectKeyIdList).addAllStrValueList(selectKeyIdList.stream().map(v -> contextManager.getTreeNodeLabelManager().getLabelName(v)).collect(Collectors.toList()));
ProcessorFunction processorFunction = new ProcessorFunction(QueryFlowOuterClass.OperatorType.SELECT, argumentBuilder);
return parseSingleUnaryVertex(contextManager.getVertexIdManager(), contextManager.getTreeNodeLabelManager(), processorFunction, contextManager);
}
}
use of com.alibaba.maxgraph.compiler.tree.source.SourceDelegateNode in project GraphScope by alibaba.
the class TreeBuilder method visitStoreStep.
private TreeNode visitStoreStep(AggregateLocalStep step, TreeNode prev) {
String sideEffectKey = checkNotNull(step.getSideEffectKey());
Traversal.Admin<?, ?> storeTraversal = ReflectionUtils.getFieldValue(AggregateLocalStep.class, step, "storeTraversal");
storeSubgraphKeyList.add(sideEffectKey);
boolean saveFlag = rootPathFlag;
rootPathFlag = false;
TreeNode storeTreeNode = null;
if (null != storeTraversal) {
storeTreeNode = travelTraversalAdmin(storeTraversal, new SourceDelegateNode(prev, schema));
}
rootPathFlag = saveFlag;
return new StoreTreeNode(prev, schema, sideEffectKey, storeTreeNode);
}
Aggregations