@Override public IntermediateQuery transform(IntermediateQuery originalQuery) { DistinctVariableOnlyDataAtom transformedProjectionDataAtom = transformProjectionAtom(originalQuery.getProjectionAtom()); IntermediateQueryBuilder builder = convertToBuilderAndTransform(originalQuery, nodeTransformer, transformedProjectionDataAtom); return builder.build(); }
/** * 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); }
@Override public IntermediateQuery transform(IntermediateQuery originalQuery) { DistinctVariableOnlyDataAtom transformedProjectionDataAtom = transformProjectionAtom(originalQuery.getProjectionAtom()); IntermediateQueryBuilder builder = convertToBuilderAndTransform(originalQuery, nodeTransformer, transformedProjectionDataAtom); return builder.build(); }
/** * 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; }