private void pickOrdering(Stack<OrderingItem> buf) { OrderingItem rhs = buf.pop(); OrderingItem lhs = buf.pop(); switch (rhs.operator) { case AND: if (lhs.ordering == null) { lhs.ordering = rhs.ordering; } else if (rhs.ordering == null) { // empty } else { lhs.ordering = pickOrdering(lhs.ordering, rhs.ordering, true); } break; case OR: if (lhs.ordering != null && rhs.ordering != null) { lhs.ordering = pickOrdering(lhs.ordering, rhs.ordering, false); } else { lhs.ordering = null; } break; default: lhs.ordering = null; } buf.push(lhs); }
public OrderingSpecification getOrdering(int order) { Stack<OrderingItem> buf = new Stack<>(); for (NodeItem item : items) { if (!buf.isEmpty()) { while (buf.peek().operator > item.operator) { pickOrdering(buf); } } buf.push(new OrderingItem(item.operator, item.node.getOrdering(order))); } while (buf.size() > 1) { pickOrdering(buf); } return buf.pop().ordering; }