| 31 | } |
| 32 | |
| 33 | @Override |
| 34 | public Iter iter(final QueryContext qc) throws QueryException { |
| 35 | final int el = exprs.length - 1; |
| 36 | for(int e = 0; e < el; e++) { |
| 37 | final Iter input = exprs[e].iter(qc); |
| 38 | final long size = input.size(); |
| 39 | // size is known, results exist: return items iterator |
| 40 | if(size > 0) return input; |
| 41 | // unknown result size: retrieve first item |
| 42 | if(size < 0) { |
| 43 | final Item item = qc.next(input); |
| 44 | if(item != null) return new Iter() { |
| 45 | boolean next; |
| 46 | |
| 47 | @Override |
| 48 | public Item next() throws QueryException { |
| 49 | if(next) return qc.next(input); |
| 50 | next = true; |
| 51 | return item; |
| 52 | } |
| 53 | }; |
| 54 | } |
| 55 | } |
| 56 | return exprs[el].iter(qc); |
| 57 | } |
| 58 | |
| 59 | @Override |
| 60 | public Value value(final QueryContext qc) throws QueryException { |