@Override public NodeCentricOptimizationResults<N> apply(SubstitutionPropagationProposal<N> proposal, IntermediateQuery query, QueryTreeComponent treeComponent) throws InvalidQueryOptimizationProposalException { N focusNode = proposal.getFocusNode(); IQTree propagatedSubTree = propagate(iqConverter.convertTree(query, focusNode), proposal.getSubstitution()); treeComponent.replaceSubTreeByIQ(focusNode, propagatedSubTree); return new NodeCentricOptimizationResultsImpl<>(query, Optional.of(propagatedSubTree.getRootNode())); }
private IQ normalizeIQ(IntermediateQuery intermediateQuery) { // Trick for pushing down expressions under unions: // - there the context may be concrete enough for evaluating certain expressions // - useful for dealing with SPARQL EBVs for instance IntermediateQuery pushedDownQuery = pushDownExpressionOptimizer.optimize(intermediateQuery); log.debug("New query after pushing down the boolean expressions (temporary): \n" + pushedDownQuery); IQ flattenIQ = unionFlattener.optimize(iqConverter.convert(pushedDownQuery)); log.debug("New query after flattening the union: \n" + flattenIQ); IQTree treeAfterPullOut = optimizerFactory.createEETransformer(flattenIQ.getVariableGenerator()).transform(flattenIQ.getTree()); log.debug("Query tree after pulling out equalities: \n" + treeAfterPullOut); // Pulling up is needed when filtering conditions appear above a data atom on the left // (causes problems to the IQ2DatalogConverter) try { IntermediateQuery queryAfterPullUp = pullUpExpressionOptimizer.optimize(iqConverter.convert( iqFactory.createIQ(flattenIQ.getProjectionAtom(), treeAfterPullOut), intermediateQuery.getDBMetadata(), intermediateQuery.getExecutorRegistry())); log.debug("New query after pulling up the boolean expressions: \n" + queryAfterPullUp); return iqConverter.convert(queryAfterPullUp); } catch (EmptyQueryException e) { // Not expected throw new MinorOntopInternalBugException(e.getMessage()); } }
IntermediateQuery intermediateQuery = iqConverter.convert(unfoldedIQ, dbMetadata, executorRegistry);