default IQTree transform(IQTree tree) { return tree.acceptTransformer(this); } }
protected IQTree transformBinaryNonCommutativeNode(BinaryNonCommutativeOperatorNode rootNode, IQTree leftChild, IQTree rightChild) { return iqFactory.createBinaryNonCommutativeIQTree( rootNode, leftChild.acceptTransformer(this), rightChild.acceptTransformer(this) ); } }
protected IQTree transformUnaryNode(UnaryOperatorNode rootNode, IQTree child) { return iqFactory.createUnaryIQTree(rootNode, child.acceptTransformer(this)); }
protected IQTree transformNaryCommutativeNode(NaryOperatorNode rootNode, ImmutableList<IQTree> children) { return iqFactory.createNaryIQTree( rootNode, children.stream() .map(t -> t.acceptTransformer(this)) .collect(ImmutableCollectors.toList()) ); }
private IQTree optimize(IQTree tree) { QueryMergingTransformer transformer = createTransformer(tree.getKnownVariables()); return tree.acceptTransformer(transformer); }
@Override // merge consecutive unions public IQTree transformUnion(IQTree tree, UnionNode rootNode, ImmutableList<IQTree> children) { ImmutableList<IQTree> transformedChildren = children.stream() .map(t -> t.acceptTransformer(this)) .collect(ImmutableCollectors.toList()); ImmutableList<IQTree> unionGrandChildren = transformedChildren.stream() .filter(t -> t.getRootNode() instanceof UnionNode) .flatMap(t -> t.getChildren().stream()) .collect(ImmutableCollectors.toList()); return iqFactory.createNaryIQTree( rootNode, Stream.concat( transformedChildren.stream() .filter(t -> !(t.getRootNode() instanceof UnionNode)), unionGrandChildren.stream() ).collect(ImmutableCollectors.toList()) ); } }
if (!currentBGP.isEmpty()) builderChildren.addAll(transformBGP(currentBGP)); builderChildren.add(child.acceptTransformer(this));
@Override public IQ rewrite(IQ query) throws EmptyQueryException { return iqFactory.createIQ(query.getProjectionAtom(), query.getTree().acceptTransformer(new BasicGraphPatternTransformer(iqFactory) { @Override protected ImmutableList<IntensionalDataNode> transformBGP(ImmutableList<IntensionalDataNode> triplePatterns) { // optimise with Sigma ABox dependencies ArrayList<IntensionalDataNode> list = new ArrayList<>(triplePatterns); // this loop has to remain sequential (no streams) for (int i = 0; i < list.size(); i++) { ImmutableSet<DataAtom> derived = inclusionDependencyTools.chaseAtom(list.get(i).getProjectionAtom(), sigma); if (!derived.isEmpty()) { for (int j = 0; j < list.size(); j++) if (i != j && derived.contains(list.get(j).getProjectionAtom())) { list.remove(j); j--; } } } return ImmutableList.copyOf(list); } })); } }
/** * TODO: why a fix point? */ @Override public IQ optimize(IQ query) { TreeTransformer treeTransformer = new TreeTransformer(query.getVariableGenerator()); IQ prev; do { prev = query; query = iqFactory.createIQ( query.getProjectionAtom(), query.getTree().acceptTransformer(treeTransformer) ); } while (!prev.equals(query)); return query; } }
@Override public IQ transform(IQ originalQuery) { QueryNodeRenamer nodeTransformer = new QueryNodeRenamer(iqFactory, renamingSubstitution, atomFactory); HomogeneousIQTreeVisitingTransformer iqTransformer = new HomogeneousIQTreeVisitingTransformer(nodeTransformer, iqFactory); IQTree newIQTree = originalQuery.getTree().acceptTransformer(iqTransformer); DistinctVariableOnlyDataAtom newProjectionAtom = transformProjectionAtom(originalQuery.getProjectionAtom()); return iqFactory.createIQ(newProjectionAtom, newIQTree); } }
@Override public IQTree transformConstruction(IQTree tree, ConstructionNode rootCn, IQTree child) { IQTree transformedChild = child.acceptTransformer(this); QueryNode transformedChildRoot = transformedChild.getRootNode(); // if the child is a union, lift it if (transformedChildRoot instanceof UnionNode) { return iqFactory.createNaryIQTree( iqFactory.createUnionNode(rootCn.getVariables()), transformedChild.getChildren().stream() .map(t -> iqFactory.createUnaryIQTree(rootCn, t)) .collect(ImmutableCollectors.toList()) ); } // if the child is a construction node, merge it if (transformedChildRoot instanceof ConstructionNode) { return rootCn.liftBinding( transformedChild, variableGenerator, iqFactory.createIQProperties() ); } return iqFactory.createUnaryIQTree(rootCn, transformedChild); }
query.getProjectionAtom().getArguments()); IQTree optimisedTree = convertedIQ.getTree().acceptTransformer(new DefaultRecursiveIQTreeVisitingTransformer(iqFactory) { @Override public IQTree transformUnion(IQTree tree, UnionNode rootNode, ImmutableList<IQTree> children) {