@Override public boolean isVariableUsedSomewhereElse(IntermediateQuery query, QueryNode originNode, Variable variable) { return query.getNodesInTopDownOrder().stream() .filter(n -> n != originNode) .anyMatch(n -> n.getLocalVariables().contains(variable)); } }
@Override public boolean isVariableUsedSomewhereElse(IntermediateQuery query, QueryNode originNode, Variable variable) { return query.getNodesInTopDownOrder().stream() .filter(n -> n != originNode) .anyMatch(n -> n.getLocalVariables().contains(variable)); } }
private Optional<GroundTermRemovalFromDataNodeProposal> makeProposal(IntermediateQuery query) { ImmutableList.Builder<DataNode> dataNodesToSimplifyBuilder = ImmutableList.builder(); for (QueryNode node : query.getNodesInTopDownOrder()) { if (node instanceof DataNode) { DataNode dataNode = (DataNode) node; if (dataNode.getProjectionAtom().containsGroundTerms()) { dataNodesToSimplifyBuilder.add(dataNode); } } } ImmutableList<DataNode> dataNodesToSimplify = dataNodesToSimplifyBuilder.build(); if (dataNodesToSimplify.isEmpty()) { return Optional.empty(); } else { GroundTermRemovalFromDataNodeProposal proposal = new GroundTermRemovalFromDataNodeProposalImpl( dataNodesToSimplify); return Optional.of(proposal); } }
/** * Can be optimized by reducing after each iteration the set of union nodes to be reviewed */ private IntermediateQuery pushAboveUnions(IntermediateQuery query) throws EmptyQueryException { boolean fixPointReached; do { fixPointReached = true; for (QueryNode node : query.getNodesInTopDownOrder()) { if (node instanceof UnionNode) { Optional<PushUpBooleanExpressionProposal> proposal = makeProposalForUnionNode((UnionNode) node, query); if (proposal.isPresent()) { query = ((PushUpBooleanExpressionResults) query.applyProposal(proposal.get())).getResultingQuery(); fixPointReached = false; } } } } while (!fixPointReached); return query; }
/** * Appends the first definition which is known to BE SAFE. * * Side-effect on the queryBuilder * */ private static void appendFirstDefinition(IntermediateQueryBuilder queryBuilder, UnionNode topUnionNode, IntermediateQuery subQuery) { // First add the root of the sub-query queryBuilder.addChild(topUnionNode, subQuery.getRootNode()); subQuery.getNodesInTopDownOrder().stream() .skip(1) .forEach(node -> queryBuilder.addChild( subQuery.getParent(node).orElseThrow(()-> new IllegalStateException("Unknown parent")), node, subQuery.getOptionalPosition(node))); }
/** * Can be optimized by reducing after each iteration the set of union nodes to be reviewed */ private IntermediateQuery pushAboveUnions(IntermediateQuery query) throws EmptyQueryException { boolean fixPointReached; do { fixPointReached = true; for (QueryNode node : query.getNodesInTopDownOrder()) { if (node instanceof UnionNode) { Optional<PushUpBooleanExpressionProposal> proposal = makeProposalForUnionNode((UnionNode) node, query); if (proposal.isPresent()) { query = ((PushUpBooleanExpressionResults) query.applyProposal(proposal.get())).getResultingQuery(); fixPointReached = false; } } } } while (!fixPointReached); return query; }
/** * 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))); }
@Override public void validate(IntermediateQuery query) throws InvalidIntermediateQueryException { validateProjectedVariables(query); QueryNodeVisitor visitor = createVisitor(query); /* * May throw an InvalidIntermediateQueryException */ query.getNodesInTopDownOrder() .forEach(n -> n.acceptVisitor(visitor)); }
@Override public void validate(IntermediateQuery query) throws InvalidIntermediateQueryException { validateProjectedVariables(query); QueryNodeVisitor visitor = createVisitor(query); /* * May throw an InvalidIntermediateQueryException */ query.getNodesInTopDownOrder() .forEach(n -> n.acceptVisitor(visitor)); }