/** * Assumes that ORDER BY is ABOVE the first construction node */ private IQTree getFirstNonQueryModifierTree(IQ query) { // Non-final IQTree iqTree = query.getTree(); while (iqTree.getRootNode() instanceof QueryModifierNode) { iqTree = ((UnaryIQTree) iqTree).getChild(); } return iqTree; }
private IQTree trimRootFilter(IQTree tree) { return tree.getRootNode() instanceof FilterNode ? ((UnaryIQTree) tree).getChild() : tree; }
private IntermediateQuery liftBinding(IntermediateQuery query) throws EmptyQueryException { IQ iq = iqConverter.convert(query); return iqConverter.convert(iq.liftBinding(), query.getDBMetadata(), query.getExecutorRegistry()); } }
@Override public IntermediateQuery convert(IQ query, DBMetadata dbMetadata, ExecutorRegistry executorRegistry) throws EmptyQueryException { if (query.getTree().isDeclaredAsEmpty()) throw new EmptyQueryException(); IntermediateQueryBuilder queryBuilder = iqFactory.createIQBuilder(dbMetadata, executorRegistry); IQTree topTree = query.getTree(); QueryNode rootNode = topTree.getRootNode(); queryBuilder.init(query.getProjectionAtom(), rootNode); insertChildren(rootNode, topTree.getChildren(), queryBuilder); return queryBuilder.build(); }
@Override public boolean equals(Object otherObject) { return (otherObject instanceof IQ) && projectionAtom.equals(((IQ) otherObject).getProjectionAtom()) && tree.isEquivalentTo(((IQ) otherObject).getTree()); }
private IQTree liftBindingAfterPropagatingCondition(IQTree childIQTree, VariableGenerator variableGenerator, IQProperties currentIQProperties) { IQTree liftedChildIQTree = childIQTree.liftBinding(variableGenerator); QueryNode childRoot = liftedChildIQTree.getRootNode(); if (childRoot instanceof ConstructionNode) return liftBinding((ConstructionNode) childRoot, (UnaryIQTree) liftedChildIQTree, currentIQProperties, variableGenerator); else if (liftedChildIQTree.isDeclaredAsEmpty()) { return liftedChildIQTree; } else return iqFactory.createUnaryIQTree(this, liftedChildIQTree, currentIQProperties.declareLifted()); }
@Override public IQTree liftBinding(IQTree childIQTree, VariableGenerator variableGenerator, IQProperties currentIQProperties) { IQTree liftedChildIQTree = childIQTree.liftBinding(variableGenerator); QueryNode liftedChildRoot = liftedChildIQTree.getRootNode(); if (liftedChildRoot instanceof ConstructionNode) return liftBinding((ConstructionNode) liftedChildRoot, (UnaryIQTree) liftedChildIQTree, currentIQProperties); else if (liftedChildIQTree.isDeclaredAsEmpty()) { return iqFactory.createEmptyNode(projectedVariables); } else return iqFactory.createUnaryIQTree(this, liftedChildIQTree, currentIQProperties.declareLifted()); }
@Override public IntermediateQuery transform(IntermediateQuery originalQuery) { DistinctVariableOnlyDataAtom transformedProjectionDataAtom = transformProjectionAtom(originalQuery.getProjectionAtom()); IntermediateQueryBuilder builder = convertToBuilderAndTransform(originalQuery, nodeTransformer, transformedProjectionDataAtom); return builder.build(); }
public ImmutableSet<Variable> getKnownVariables() { return definition.getTree().getKnownVariables(); }
private void copyChildren(IntermediateQuery sourceQuery, QueryNode sourceParent, IntermediateQueryBuilder builder, QueryNode targetParent) { for (QueryNode child : sourceQuery.getChildren(sourceParent)) { builder.addChild( targetParent, child, sourceQuery.getOptionalPosition( sourceParent, child )); copyChildren(sourceQuery, child, builder, child); } } }
private void insertChildTree(QueryNode parent, QueryNode child, IQTree childTree, IntermediateQueryBuilder queryBuilder, int position) { if (parent instanceof BinaryOrderedOperatorNode) { queryBuilder.addChild(parent, child, (position == 0)? LEFT : RIGHT); } else { queryBuilder.addChild(parent, child); } insertChildren(child, childTree.getChildren(), queryBuilder); } }
@Override public ImmutableSet<ImmutableSubstitution<NonVariableTerm>> getPossibleVariableDefinitions(IQTree child) { return child.getPossibleVariableDefinitions(); }
default IQTree transform(IQTree tree) { return tree.acceptTransformer(this); } }
@Override public VariableNullability getVariableNullability(IQTree child) { return child.getVariableNullability(); }
@Override public boolean isConstructed(Variable variable, IQTree child) { return child.isConstructed(variable); }
@Override public IQTree transformNonStandardLeafNode(LeafIQTree leafNode) { return leafNode.acceptNodeTransformer(nodeTransformer); }
@Override public IntermediateQuery transform(IntermediateQuery originalQuery) { DistinctVariableOnlyDataAtom transformedProjectionDataAtom = transformProjectionAtom(originalQuery.getProjectionAtom()); IntermediateQueryBuilder builder = convertToBuilderAndTransform(originalQuery, nodeTransformer, transformedProjectionDataAtom); return builder.build(); }
/** * Move ORDER BY above the highest construction node (required by Datalog) */ private IQ liftOrderBy(IQ iq) { IQTree topNonQueryModifierTree = getFirstNonQueryModifierTree(iq); if ((topNonQueryModifierTree instanceof UnaryIQTree) && (((UnaryIQTree) topNonQueryModifierTree).getChild().getRootNode() instanceof OrderByNode)) { return orderByLifter.liftOrderBy(iq); } return iq; } }
@Override public ImmutableSet<ImmutableSubstitution<NonVariableTerm>> getPossibleVariableDefinitions(IQTree child) { return child.getPossibleVariableDefinitions(); }
@Override public boolean isConstructed(Variable variable, IQTree child) { return child.isConstructed(variable); }