@Override public Value value(final QueryContext qc) throws QueryException { final FItem getKey = checkArity(exprs[1], 1, qc); final long k = Math.min(toLong(exprs[2], qc), Integer.MAX_VALUE); if (k < 1) return Empty.SEQ; final Iter iter = exprs[0].iter(qc); final MinHeap<Item, Item> heap = new MinHeap<>( new Comparator<Item>() { @Override public int compare(final Item it1, final Item it2) { try { return OpV.LT.eval(it1, it2, sc.collation, sc, info) ? -1 : 1; } catch (final QueryException qe) { throw new QueryRTException(qe); } } }); try { for (Item it; (it = iter.next()) != null; ) { heap.insert(checkNoEmpty(getKey.invokeItem(qc, info, it)), it); if (heap.size() > k) heap.removeMin(); } } catch (final QueryRTException ex) { throw ex.getCause(); } final ValueBuilder vb = new ValueBuilder(); while (!heap.isEmpty()) vb.addFront(heap.removeMin()); return vb.value(); }
@Override public Value value(final QueryContext qc) throws QueryException { final FItem f = checkArity(exprs[1], 1, qc); final Iter iter = exprs[0].iter(qc); Item it = iter.next(); if (it == null) return Empty.SEQ; final Value v1 = f.invokeValue(qc, info, it); it = iter.next(); if (it == null) return v1; final ValueBuilder vb = new ValueBuilder().add(v1); do { vb.add(f.invokeValue(qc, info, it)); } while ((it = iter.next()) != null); return vb.value(); }