package org.reldb.rel.v0.values; import java.util.ArrayList; import org.reldb.rel.v0.generator.Generator; /** A TupleIteratorCount is a TupleIterator that counts the occurrences of tuples. */ public class TupleIteratorCount extends TupleIterator { private ArrayList<ValueTuple> tupleSet; private ValueTuple current; private Generator generator; private long count; private int index; public TupleIteratorCount(TupleIterator source, Generator generator) { this.generator = generator; tupleSet = new ArrayList<ValueTuple>(); try { while (source.hasNext()) tupleSet.add(source.next()); } finally { source.close(); } count = 0; index = 0; } @Override public boolean hasNext() { if (index >= tupleSet.size()) return false; current = tupleSet.get(index); index++; for(int i=0; i<tupleSet.size(); i++) { if (current.equals(tupleSet.get(i))) count++; } return true; } @Override public ValueTuple next() { try { return createCountTuple().joinDisjoint(current); } finally { current = null; count = 0; } } public void close() { index = 0; } private ValueTuple createCountTuple() { Value[] value = new Value[1]; value[0] = ValueInteger.select(generator, count); return new ValueTuple(generator, value); } }