private boolean hasSelectDistinctStatement(DatalogProgram query) { boolean toReturn = false; if (query.getQueryModifiers().hasModifiers()) { toReturn = query.getQueryModifiers().isDistinct(); } return toReturn; }
/*** * This expands all Join that can be directly added as conjuncts to a * query's body. Nested Join trees inside left joins are not touched. * * @param query * @return */ public static void unfoldJoinTrees(CQIE query) { unfoldJoinTrees(query.getBody(), true); }
public static DatalogProgram program(Collection<CQIE> rules){ DatalogProgram datalogProgram = DATALOG_FACTORY.getDatalogProgram(); datalogProgram.appendRule(rules); return datalogProgram; }
private boolean hasOrderByClause(DatalogProgram query) { boolean toReturn = false; if (query.getQueryModifiers().hasModifiers()) { final List<OrderCondition> conditions = query.getQueryModifiers() .getSortConditions(); toReturn = (!conditions.isEmpty()); } return toReturn; }
@Override public DatalogProgram getDatalogProgram(MutableQueryModifiers modifiers, Collection<CQIE> rules) { DatalogProgram p = new DatalogProgramImpl(); p.appendRule(rules); p.getQueryModifiers().copy(modifiers); return p; }
public int getMaxQuerySizeAfterRewriting() { int toReturn = Integer.MIN_VALUE; if( sizesCollected() ){ List<CQIE> rules = programAfterRewriting.getRules(); for (CQIE rule : rules) { int querySize = getBodySize(rule.getBody()); if (querySize > toReturn) { toReturn = querySize; } } } return toReturn; }
private void appendRule(Function head, List<Function> body) { CQIE rule = datalogFactory.getCQIE(head, body); program.appendRule(rule); }
public void foldJoinTrees(CQIE query) { foldJoinTrees(query.getBody(), false); }
public static void addMinimalEqualityToLeftJoin(CQIE query) { for (Function f : query.getBody()) { if (f.isAlgebraFunction()) { addMinimalEqualityToLeftJoin(f); } } }
/*** * Adds a trivial equality to a LeftJoin in case the left join doesn't have * at least one boolean condition. This is necessary to have syntactically * correct LeftJoins in SQL. */ public void addMinimalEqualityToLeftOrNestedInnerJoin(CQIE query) { for (Function f : query.getBody()) { if (f.isAlgebraFunction()) { addMinimalEqualityToLeftOrNestedInnerJoin(f); } } }
@Override public DatalogProgram clone() { DatalogProgramImpl clone = new DatalogProgramImpl(); for (CQIE query : rules) { clone.appendRule(query.clone()); } clone.modifiers = modifiers.clone(); return clone; }
@Override public DatalogProgram getDatalogProgram(MutableQueryModifiers modifiers) { DatalogProgram p = new DatalogProgramImpl(); p.getQueryModifiers().copy(modifiers); return p; }
/** * Normalizations of the Datalog program requirend by the Datalog to SQL translator */ private void normalizeRule(CQIE cq) { DatalogNormalizer.foldJoinTrees(cq); DatalogNormalizer.addMinimalEqualityToLeftJoin(cq); }
@Override public boolean hasModifiers() { return modifiers.hasModifiers(); } }
@Override public Function f(Function firstAtom, Function secondAtom) { return DATALOG_FACTORY.getSPARQLJoin(firstAtom, secondAtom, TRUE_EQ); } }, firstAtom);
/** * Rule-level variable generator. */ public VariableGenerator(CQIE initialRule) { count = 0; knownVariables = initialRule.getReferencedVariables(); }
private void subscribeHeadTerms(Function head) { if (head instanceof ListenableFunction) { EventGeneratingList<Term> headterms = ((ListenableFunction)head).getTerms(); headterms.addListener(this); } else if (!(head instanceof ImmutableFunctionalTerm)) { throw new RuntimeException("Unknown type of function: not listenable nor immutable: " + head); } }
@Override public String toString() { if (dependencies != null) return dependencies.toString(); return "(empty)"; } }
public static void foldJoinTrees(CQIE query) { foldJoinTrees(query.getBody(), false); }
@Override public DatalogProgram clone() { DatalogProgramImpl clone = new DatalogProgramImpl(); for (CQIE query : rules) { clone.appendRule(query.clone()); } clone.modifiers = modifiers.clone(); return clone; }