/** * Appends a definition under the union node after renaming it. */ private void appendDefinition(IntermediateQueryBuilder queryBuilder, UnionNode unionNode, IntermediateQuery definition, InjectiveVar2VarSubstitution renamingSubstitution) { QueryNodeRenamer nodeRenamer = new QueryNodeRenamer(iqFactory, renamingSubstitution); ImmutableList<QueryNode> originalNodesInTopDownOrder = definition.getNodesInTopDownOrder(); /** * Renames all the nodes (new objects) and maps them to original nodes */ ImmutableMap<QueryNode, QueryNode> renamedNodeMap = originalNodesInTopDownOrder.stream() .map(n -> new AbstractMap.SimpleEntry<>(n, n.acceptNodeTransformer(nodeRenamer))) .collect(ImmutableCollectors.toMap()); /** * Adds the renamed root of the definition */ queryBuilder.addChild(unionNode, renamedNodeMap.get(definition.getRootNode())); /** * Add the other renamed nodes */ originalNodesInTopDownOrder.stream() .skip(1) .forEach(node -> queryBuilder.addChild( renamedNodeMap.get(definition.getParent(node) .orElseThrow(()-> new IllegalStateException("Unknown parent"))), renamedNodeMap.get(node), definition.getOptionalPosition(node))); }
/** * TODO: explain * <p> * TODO: avoid the use of a recursive method. Use a stack instead. */ protected IntermediateQueryBuilder convertToBuilderAndTransform(IntermediateQuery originalQuery, HomogeneousQueryNodeTransformer nodeTransformer, DistinctVariableOnlyDataAtom transformedProjectionAtom) { IntermediateQueryBuilder queryBuilder = originalQuery.newBuilder(); // Clone the original root node and apply the transformer if available. QueryNode originalRootNode = originalQuery.getRootNode(); QueryNode newRootNode; newRootNode = originalRootNode.acceptNodeTransformer(nodeTransformer); queryBuilder.init(transformedProjectionAtom, newRootNode); return copyChildrenNodesToBuilder(originalQuery, queryBuilder, originalRootNode, newRootNode, nodeTransformer); }
/** * TODO: explain * <p> * TODO: avoid the use of a recursive method. Use a stack instead. */ protected IntermediateQueryBuilder convertToBuilderAndTransform(IntermediateQuery originalQuery, HomogeneousQueryNodeTransformer nodeTransformer, DistinctVariableOnlyDataAtom transformedProjectionAtom) { IntermediateQueryBuilder queryBuilder = originalQuery.newBuilder(); // Clone the original root node and apply the transformer if available. QueryNode originalRootNode = originalQuery.getRootNode(); QueryNode newRootNode; newRootNode = originalRootNode.acceptNodeTransformer(nodeTransformer); queryBuilder.init(transformedProjectionAtom, newRootNode); return copyChildrenNodesToBuilder(originalQuery, queryBuilder, originalRootNode, newRootNode, nodeTransformer); }
/** * TODO: replace this implementation by a non-recursive one. */ private IntermediateQueryBuilder copyChildrenNodesToBuilder(final IntermediateQuery originalQuery, IntermediateQueryBuilder queryBuilder, final QueryNode originalParentNode, final QueryNode newParentNode, HomogeneousQueryNodeTransformer nodeTransformer) { for (QueryNode originalChildNode : originalQuery.getChildren(originalParentNode)) { QueryNode newChildNode; newChildNode = originalChildNode.acceptNodeTransformer(nodeTransformer); Optional<BinaryOrderedOperatorNode.ArgumentPosition> optionalPosition = originalQuery.getOptionalPosition(originalParentNode, originalChildNode); queryBuilder.addChild(newParentNode, newChildNode, optionalPosition); // Recursive call queryBuilder = copyChildrenNodesToBuilder(originalQuery, queryBuilder, originalChildNode, newChildNode, nodeTransformer); } return queryBuilder; }
/** * TODO: replace this implementation by a non-recursive one. */ private IntermediateQueryBuilder copyChildrenNodesToBuilder(final IntermediateQuery originalQuery, IntermediateQueryBuilder queryBuilder, final QueryNode originalParentNode, final QueryNode newParentNode, HomogeneousQueryNodeTransformer nodeTransformer) { for (QueryNode originalChildNode : originalQuery.getChildren(originalParentNode)) { QueryNode newChildNode; newChildNode = originalChildNode.acceptNodeTransformer(nodeTransformer); Optional<BinaryOrderedOperatorNode.ArgumentPosition> optionalPosition = originalQuery.getOptionalPosition(originalParentNode, originalChildNode); queryBuilder.addChild(newParentNode, newChildNode, optionalPosition); // Recursive call queryBuilder = copyChildrenNodesToBuilder(originalQuery, queryBuilder, originalChildNode, newChildNode, nodeTransformer); } return queryBuilder; }