private OrderByNode.OrderComparator convertComparator(OrderByNode.OrderComparator comparator, ImmutableSubstitution<ImmutableTerm> substitution) { NonGroundTerm term = comparator.getTerm(); if (term instanceof Variable) return comparator; Optional<Variable> correspondingVariable = substitution.getImmutableMap().entrySet().stream() .filter(e -> e.getValue().equals(term)) .map(Map.Entry::getKey) .findFirst(); return correspondingVariable .map(v -> iqFactory.createOrderComparator(v, comparator.isAscending())) .orElseThrow(() -> new MinorOntopInternalBugException("The order condition " + term + " is not projected by the construction node with " + substitution + " and therefore" + "cannot be translated into the internal Datalog-like structure")); } }
@Override public OrderByNode transform(OrderByNode orderByNode) { ImmutableList<OrderByNode.OrderComparator> newComparators = orderByNode.getComparators().stream() .map(c -> iqFactory.createOrderComparator( renamingSubstitution.applyToNonGroundTerm(c.getTerm()), c.isAscending())) .collect(ImmutableCollectors.toList()); return iqFactory.createOrderByNode(newComparators); }
private OrderByNode applySubstitution(ImmutableSubstitution<? extends ImmutableTerm> substitution) { ImmutableList<OrderComparator> newComparators = comparators.stream() .flatMap(c -> Stream.of(substitution.apply(c.getTerm())) .filter(t -> t instanceof NonGroundTerm) .map(t -> iqFactory.createOrderComparator((NonGroundTerm) t, c.isAscending()))) .collect(ImmutableCollectors.toList()); return iqFactory.createOrderByNode(newComparators); }
@Override public ImmutableSet<Variable> getLocalVariables() { return comparators.stream() .flatMap(c -> c.getTerm().getVariableStream()) .collect(ImmutableCollectors.toSet()); }
private static void convertOrderComparator(OrderByNode.OrderComparator comparator, MutableQueryModifiers queryModifiers) { NonGroundTerm term = comparator.getTerm(); if (term instanceof Variable) queryModifiers.addOrderCondition((Variable) term, comparator.isAscending() ? OrderCondition.ORDER_ASCENDING : OrderCondition.ORDER_DESCENDING); else // TODO: throw a better exception throw new IllegalArgumentException("The Datalog representation only supports variable in order conditions"); }
@Override public boolean equals(Object other) { return other instanceof OrderByNode.OrderComparator && ((OrderByNode.OrderComparator) other).getTerm().equals(term) && ((OrderByNode.OrderComparator) other).isAscending() == isAscending; }