IndexedTupleSource getIterator() throws TeiidComponentException, TeiidProcessingException { if (this.iterator == null) { if (this.buffer != null) { iterator = buffer.createIndexedTupleSource(); } else { // return a TupleBatch tuplesource iterator BatchIterator bi = new BatchIterator(this.source); if (this.collector != null) { bi.setBuffer(this.collector.getTupleBuffer(), implicitBuffer == ImplicitBuffer.ON_MARK); if (implicitBuffer == ImplicitBuffer.NONE) { bi.getBuffer().setForwardOnly(true); } this.collector = null; } else if (implicitBuffer != ImplicitBuffer.NONE) { bi.setBuffer(createSourceTupleBuffer(), implicitBuffer == ImplicitBuffer.ON_MARK); } this.iterator = bi; } } return this.iterator; }
@Override protected List<?> finalRow() throws TeiidComponentException, TeiidProcessingException { if (this.buffer != null && this.getCurrentIndex() <= this.buffer.getRowCount()) { batch = this.buffer.getBatch(this.getCurrentIndex()); } while (available() < 1) { if (done) { return null; } batch = source.nextBatch(); done = batch.getTerminationFlag(); if (buffer != null && (!saveOnMark || mark) && !buffer.isForwardOnly()) { buffer.addTupleBatch(batch, true); } if (done && buffer != null) { this.buffer.close(); } } return getCurrentTuple(); }
@Override public void mark() throws TeiidComponentException { super.mark(); if (this.buffer != null && saveOnMark && this.getCurrentIndex() > this.buffer.getRowCount()) { this.buffer.purge(); } mark = true; saveTuple(this.currentTuple); }
@Test public void testReadAhead() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), }, 2)); BufferManager bm = BufferManagerFactory.getStandaloneBufferManager(); TupleBuffer tb = bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR); bi.setBuffer(tb, false); //$NON-NLS-1$ bi.nextTuple(); assertEquals(1, bi.available()); assertEquals(2, bi.getBuffer().getRowCount()); bi.readAhead(100); assertEquals(4, bi.getBuffer().getRowCount()); //shouldn't keep reading bi.readAhead(3); assertEquals(4, bi.getBuffer().getRowCount()); bi.readAhead(5); assertEquals(6, bi.getBuffer().getRowCount()); bi.readAhead(8); //does nothing for (int i = 0; i < 5; i++) { assertNotNull(bi.nextTuple()); } assertNull(bi.nextTuple()); }
@Test public void testReset() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(1), Arrays.asList(1) }, 1)); BufferManager bm = BufferManagerFactory.getStandaloneBufferManager(); bi.setBuffer(bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR), true); //$NON-NLS-1$ bi.mark(); bi.nextTuple(); bi.nextTuple(); bi.reset(); bi.nextTuple(); }
@Test public void testDisableSave() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), Arrays.asList(1), }, 2)); BufferManager bm = BufferManagerFactory.getStandaloneBufferManager(); TupleBuffer tb = bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR); bi.setBuffer(tb, false); //$NON-NLS-1$ bi.setPosition(2); assertTrue(bi.hasNext()); tb.setForwardOnly(true); bi.setPosition(1); bi.disableSave(); for (int i = 0; i < 6; i++) { assertNotNull(bi.nextTuple()); } assertNull(bi.nextTuple()); assertEquals(0, tb.getManagedRowCount()); }
this.buffer.setForwardOnly(true); } else { ts = new BatchIterator(this.source);
public long available() { if (batch != null && batch.containsRow(getCurrentIndex())) { return batch.getEndRow() - getCurrentIndex() + 1; } return 0; }
BatchIterator iterator = new BatchIterator(selectNode); assertEquals("Rows don't match at " + i, expected[i], iterator.nextTuple()); //$NON-NLS-1$ break; } catch (BlockedException e) { assertFalse(iterator.hasNext());
public long getIncrementalRowCount(boolean low) { if (this.buffer != null) { return this.buffer.getRowCount(); } if (this.collector != null) { return this.collector.getTupleBuffer().getRowCount(); } if (sortUtility == null) { if (this.iterator instanceof BatchIterator) { TupleBuffer tb = ((BatchIterator)this.iterator).getBuffer(); if (tb != null) { return tb.getRowCount(); } //TODO: should estimate the rows } //TODO: should estimate the rows based upon what is being fed into the sort } return low?0:Long.MAX_VALUE; }
/** * Pro-actively pull batches for later use. * There are unfortunately quite a few cases to cover here. */ protected void prefetch(long limit) throws TeiidComponentException, TeiidProcessingException { if (!open) { return; } if (this.buffer == null) { if (this.sortUtility != null) { return; } if (this.iterator != null) { ((BatchIterator)this.iterator).readAhead(limit); return; } if (source.hasBuffer()) { this.buffer = source.getBuffer(-1); return; } if (collector == null) { collector = new BatchCollector(source, source.getBufferManager(), source.getContext(), false); } if (collector.getTupleBuffer() != null && collector.getTupleBuffer().getManagedRowCount() >= limit) { return; } this.buffer = collector.collectTuples(true); } }
@Override protected List<?> getCurrentTuple() throws TeiidComponentException, BlockedException, TeiidProcessingException { List<?> tuple = super.getCurrentTuple(); saveTuple(tuple); return tuple; }
@Test public void testReadAheadMark() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(1), BufferManager bm = BufferManagerFactory.getStandaloneBufferManager(); TupleBuffer tb = bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR); bi.setBuffer(tb, true); //$NON-NLS-1$ bi.nextTuple(); assertEquals(1, bi.available()); assertEquals(0, bi.getBuffer().getRowCount()); bi.readAhead(100); assertEquals(4, bi.getBuffer().getRowCount()); bi.readAhead(2); assertEquals(4, bi.getBuffer().getRowCount()); bi.readAhead(5); assertEquals(6, bi.getBuffer().getRowCount()); bi.readAhead(8); //does nothing for (int i = 0; i < 6; i++) { assertNotNull(bi.nextTuple()); assertNull(bi.nextTuple());
@Test public void testReset1() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(2), Arrays.asList(3) }, 2)); BufferManager bm = BufferManagerFactory.getStandaloneBufferManager(); TupleBuffer tb = bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR); bi.setBuffer(tb, true); //$NON-NLS-1$ bi.nextTuple(); bi.mark(); bi.nextTuple(); bi.reset(); assertEquals(2, bi.getCurrentIndex()); assertEquals(2, bi.nextTuple().get(0)); }
this.buffer.setForwardOnly(true); } else { ts = new BatchIterator(this.source);
public long available() { if (batch != null && batch.containsRow(getCurrentIndex())) { return batch.getEndRow() - getCurrentIndex() + 1; } return 0; }
public long getIncrementalRowCount(boolean low) { if (this.buffer != null) { return this.buffer.getRowCount(); } if (this.collector != null) { return this.collector.getTupleBuffer().getRowCount(); } if (sortUtility == null) { if (this.iterator instanceof BatchIterator) { TupleBuffer tb = ((BatchIterator)this.iterator).getBuffer(); if (tb != null) { return tb.getRowCount(); } //TODO: should estimate the rows } //TODO: should estimate the rows based upon what is being fed into the sort } return low?0:Long.MAX_VALUE; }
/** * Pro-actively pull batches for later use. * There are unfortunately quite a few cases to cover here. */ protected void prefetch(long limit) throws TeiidComponentException, TeiidProcessingException { if (!open) { return; } if (this.buffer == null) { if (this.sortUtility != null) { return; } if (this.iterator != null) { ((BatchIterator)this.iterator).readAhead(limit); return; } if (source.hasBuffer()) { this.buffer = source.getBuffer(-1); return; } if (collector == null) { collector = new BatchCollector(source, source.getBufferManager(), source.getContext(), false); } if (collector.getTupleBuffer() != null && collector.getTupleBuffer().getManagedRowCount() >= limit) { return; } this.buffer = collector.collectTuples(true); } }
@Override protected List<?> getCurrentTuple() throws TeiidComponentException, BlockedException, TeiidProcessingException { List<?> tuple = super.getCurrentTuple(); saveTuple(tuple); return tuple; }
@Test public void testNoSaveForwardOnly() throws Exception { BatchIterator bi = new BatchIterator(new FakeRelationalNode(1, new List[] { Arrays.asList(1), Arrays.asList(1), TupleBuffer tb = bm.createTupleBuffer(Arrays.asList(new ElementSymbol("x", null, DataTypeManager.DefaultDataClasses.INTEGER)), "test", TupleSourceType.PROCESSOR); tb.setForwardOnly(true); bi.setBuffer(tb, false); //$NON-NLS-1$ assertEquals(3, bi.getBuffer().getManagedRowCount()); bi.nextTuple(); assertEquals(2, bi.available()); assertEquals(0, bi.getBuffer().getManagedRowCount()); for (int i = 0; i < 2; i++) { assertNotNull(bi.nextTuple()); assertEquals(0, bi.getBuffer().getManagedRowCount()); bi.readAhead(3); assertEquals(2, bi.getBuffer().getManagedRowCount()); for (int i = 0; i < 4; i++) { assertNotNull(bi.nextTuple()); assertEquals(0, bi.getBuffer().getManagedRowCount()); assertNull(bi.nextTuple()); assertEquals(0, bi.getBuffer().getManagedRowCount());