/** * Recursive */ private void insertChildren(QueryNode parentNode, ImmutableList<IQTree> childrenTrees, IntermediateQueryBuilder queryBuilder) { AtomicInteger i = new AtomicInteger(0); childrenTrees.stream() .map(IQTree::getRootNode) .map(n -> queryBuilder.contains(n) ? n.clone() : n) .forEach(t -> insertChildTree(parentNode, t, childrenTrees.get(i.get()), queryBuilder, i.getAndIncrement())); }
@Override public void addSubTree(IntermediateQuery subQuery, QueryNode subQueryTopNode, QueryNode localTopNode) throws IllegalTreeUpdateException { Queue<QueryNode> localParents = new LinkedList<>(); localParents.add(localTopNode); Map<QueryNode, QueryNode> localToExternalNodeMap = new HashMap<>(); localToExternalNodeMap.put(localTopNode, subQueryTopNode); while(!localParents.isEmpty()) { QueryNode localParent = localParents.poll(); QueryNode externalParent = localToExternalNodeMap.get(localParent); for (QueryNode externalChild : subQuery.getChildren(externalParent)) { QueryNode localChild = externalChild.clone(); localToExternalNodeMap.put(localChild, externalChild); localParents.add(localChild); addChild(localParent, localChild, subQuery.getOptionalPosition(externalParent, externalChild), false); } } }
@Override public void addSubTree(IntermediateQuery subQuery, QueryNode subQueryTopNode, QueryNode localTopNode) throws IllegalTreeUpdateException { Queue<QueryNode> localParents = new LinkedList<>(); localParents.add(localTopNode); Map<QueryNode, QueryNode> localToExternalNodeMap = new HashMap<>(); localToExternalNodeMap.put(localTopNode, subQueryTopNode); while(!localParents.isEmpty()) { QueryNode localParent = localParents.poll(); QueryNode externalParent = localToExternalNodeMap.get(localParent); for (QueryNode externalChild : subQuery.getChildren(externalParent)) { QueryNode localChild = externalChild.clone(); localToExternalNodeMap.put(localChild, externalChild); localParents.add(localChild); addChild(localParent, localChild, subQuery.getOptionalPosition(externalParent, externalChild), false); } } }
/** * TODO: find a better name */ private static QueryNode getNodeToInsert(Transformation transformation, QueryTreeComponent treeComponent) { QueryNode possiblyTransformedNode = transformation.getTransformedNode(); return treeComponent.contains(possiblyTransformedNode) ? possiblyTransformedNode.clone() : possiblyTransformedNode; }
/** * Recursive */ private void insertIQChildren(QueryNode parentNode, ImmutableList<IQTree> childrenTrees) { ImmutableList<QueryNode> newChildren = childrenTrees.stream() .map(IQTree::getRootNode) .map(n -> contains(n) ? n.clone() : n) .collect(ImmutableCollectors.toList()); if (parentNode instanceof BinaryOrderedOperatorNode) { addChild(parentNode, newChildren.get(0), Optional.of(LEFT), false); addChild(parentNode, newChildren.get(1), Optional.of(RIGHT), false); } else { newChildren .forEach(c -> addChild(parentNode, c, Optional.empty(),false)); } IntStream.range(0, childrenTrees.size()) .forEach(i -> insertIQChildren(newChildren.get(i), childrenTrees.get(i).getChildren())); }
@Override public QueryNode replaceSubTreeByIQ(QueryNode subTreeRoot, IQTree replacingSubTree) { QueryNode iqRoot = replacingSubTree.getRootNode(); QueryNode newSubTreeRoot = contains(iqRoot) ? iqRoot.clone() : iqRoot; replaceSubTree(subTreeRoot, newSubTreeRoot); insertIQChildren(newSubTreeRoot, replacingSubTree.getChildren()); return newSubTreeRoot; }