private IntermediateQuery liftBinding(IntermediateQuery query) throws EmptyQueryException { IQ iq = iqConverter.convert(query); return iqConverter.convert(iq.liftBinding(), query.getDBMetadata(), query.getExecutorRegistry()); } }
@Override public IntermediateQuery optimize(IntermediateQuery query) throws EmptyQueryException { IQ initialIQ = iqConverter.convert(query); IQ liftedIQ = optimizer.optimize(initialIQ); return iqConverter.convert(liftedIQ, query.getDBMetadata(), query.getExecutorRegistry()); } }
private IntermediateQuery liftUnionsAboveCn(IntermediateQuery query) { if(query.getChildren(query.getRootNode()).isEmpty()){ return query; } IntermediateQueryBuilder builder = iqFactory.createIQBuilder( query.getDBMetadata(), query.getExecutorRegistry() ); lift(builder, query.getRootNode(), Optional.empty(), query, query.getRootNode(), query.getProjectionAtom()); return builder.build(); }
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()); } }
@Override public IntermediateQuery enforceRootCn(IntermediateQuery query) { QueryNode root = query.getRootNode(); if(root instanceof ConstructionNode){ return query; } IntermediateQueryBuilder builder = iqFactory.createIQBuilder( query.getDBMetadata(), query.getExecutorRegistry() ); ConstructionNode rootCn = iqFactory.createConstructionNode(query.getVariables(root)); builder.init(query.getProjectionAtom(), rootCn); builder.addChild(rootCn, root); builder.appendSubtree(root, query); return builder.build(); }