/** * Predicates not having a DatabaseRelationDefinition are ignored */ private ImmutableMultimap<DatabaseRelationDefinition, DataNode> extractDataNodeMap(IntermediateQuery query, InnerJoinNode joinNode) { DBMetadata dbMetadata = query.getDBMetadata(); return query.getChildren(joinNode).stream() .filter(c -> c instanceof DataNode) .map(c -> (DataNode) c) .map(c -> getDatabaseRelationByName(dbMetadata, c.getProjectionAtom().getPredicate()) .map(r -> new SimpleEntry<DatabaseRelationDefinition, DataNode>(r, c))) .filter(Optional::isPresent) .map(Optional::get) .collect(ImmutableCollectors.toMultimap()); }
@Override public boolean isVariableNullable(IntermediateQuery query, Variable variable) { if (!getVariables().contains(variable)) throw new IllegalArgumentException("The variable " + variable + " is not projected by " + this); DBMetadata metadata = query.getDBMetadata(); DataAtom atom = getProjectionAtom(); RelationID relationId = Relation2Predicate.createRelationFromPredicateName( metadata.getQuotedIDFactory(), atom.getPredicate()); RelationDefinition relation = metadata.getRelation(relationId); if (relation == null) throw new MissingRelationForExtensionalDataNodeException("Bug: required relation for " + this + " not found"); ImmutableList<? extends VariableOrGroundTerm> arguments = atom.getArguments(); // NB: DB column indexes start at 1. return IntStream.range(1, arguments.size() + 1) .filter(i -> arguments.get(i - 1).equals(variable)) .mapToObj(relation::getAttribute) .allMatch(Attribute::canNull); }
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(); }
query.getDBMetadata(), variableGenerator);
query, query.getDBMetadata());
query, query.getDBMetadata());
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(); }