@Override protected TokenBackedBasicResultsPage<RowResult<Set<Long>>, byte[]> getNextPage(TokenBackedBasicResultsPage<RowResult<Set<Long>>, byte[]> previous) { byte[] startRow = previous.getTokenForNextPage(); RangeRequest newRange = rangeRequest.getBuilder().startRowInclusive(startRow).build(); return getPageWithTimestamps(tableRef, newRange, timestamp); } };
@Override protected TokenBackedBasicResultsPage<RowResult<Value>, byte[]> getNextPage(TokenBackedBasicResultsPage<RowResult<Value>, byte[]> previous) { byte[] startRow = previous.getTokenForNextPage(); RangeRequest newRange = rangeRequest.getBuilder().startRowInclusive(startRow).build(); return getPageWithValues(tableRef, newRange, timestamp); } };
public BatchingVisitableView<KvDynamicColumnsRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, KvDynamicColumnsRowResult>() { @Override public KvDynamicColumnsRowResult apply(RowResult<byte[]> input) { return KvDynamicColumnsRowResult.of(input); } }); }
public BatchingVisitableView<KeyValueRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, KeyValueRowResult>() { @Override public KeyValueRowResult apply(RowResult<byte[]> input) { return KeyValueRowResult.of(input); } }); }
public BatchingVisitableView<CreatedIdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, CreatedIdxRowResult>() { @Override public CreatedIdxRowResult apply(RowResult<byte[]> input) { return CreatedIdxRowResult.of(input); } }); }
public BatchingVisitableView<SweepPriorityRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, SweepPriorityRowResult>() { @Override public SweepPriorityRowResult apply(RowResult<byte[]> input) { return SweepPriorityRowResult.of(input); } }); }
public BatchingVisitableView<CookiesIdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, CookiesIdxRowResult>() { @Override public CookiesIdxRowResult apply(RowResult<byte[]> input) { return CookiesIdxRowResult.of(input); } }); }
public BatchingVisitableView<MetadataRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, MetadataRowResult>() { @Override public MetadataRowResult apply(RowResult<byte[]> input) { return MetadataRowResult.of(input); } }); }
public BatchingVisitableView<UserBirthdaysIdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, UserBirthdaysIdxRowResult>() { @Override public UserBirthdaysIdxRowResult apply(RowResult<byte[]> input) { return UserBirthdaysIdxRowResult.of(input); } }); }
public BatchingVisitableView<KvRowsRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, KvRowsRowResult>() { @Override public KvRowsRowResult apply(RowResult<byte[]> input) { return KvRowsRowResult.of(input); } }); }
@Override public ClosableIterator<RowResult<Value>> getBatch(int batchSize, @Nullable byte[] lastToken) { RangeRequest.Builder newRange = range.getBuilder(); if (lastToken != null) { newRange.startRowInclusive(RangeRequests.getNextStartRow(range.isReverse(), lastToken)); } newRange.batchHint(batchSize); return keyValueService.getRange(tableRef, newRange.build(), timestamp); }
private void verifyRanges(Transaction readOnlyTransaction) { // verify each set of reads to ensure they are the same. for (Entry<TableReference, ConcurrentMap<RangeRequest, byte[]>> tableAndRange : rangeEndByTable.entrySet()) { TableReference table = tableAndRange.getKey(); Map<RangeRequest, byte[]> rangeEnds = tableAndRange.getValue(); for (Entry<RangeRequest, byte[]> rangeAndRangeEndEntry : rangeEnds.entrySet()) { RangeRequest range = rangeAndRangeEndEntry.getKey(); byte[] rangeEnd = rangeAndRangeEndEntry.getValue(); if (rangeEnd.length != 0 && !RangeRequests.isTerminalRow(range.isReverse(), rangeEnd)) { range = range.getBuilder() .endRowExclusive(RangeRequests.getNextStartRow(range.isReverse(), rangeEnd)) .build(); } ConcurrentNavigableMap<Cell, byte[]> writes = writesByTable.get(table); BatchingVisitableView<RowResult<byte[]>> bv = BatchingVisitableView.of( readOnlyTransaction.getRange(table, range)); NavigableMap<Cell, ByteBuffer> readsInRange = Maps.transformValues( getReadsInRange(table, range), ByteBuffer::wrap); if (!bv.transformBatch(input -> filterWritesFromRows(input, writes)).isEqual(readsInRange.entrySet())) { handleTransactionConflict(table); } } } }
@Test public void testRangesTransactionColumnSelection() { Transaction t = startTransaction(); put(t, "row1", "col1", "v1"); t.commit(); RangeRequest range1 = RangeRequest.builder().batchHint(3).build(); RangeRequest range2 = range1.getBuilder().retainColumns(ColumnSelection.create(ImmutableSet.of(PtBytes.toBytes("col1")))).build(); t = startTransaction(); Iterable<BatchingVisitable<RowResult<byte[]>>> ranges = t.getRanges(TEST_TABLE, Iterables.limit(Iterables.cycle(range1, range2), 1000)); for (BatchingVisitable<RowResult<byte[]>> batchingVisitable : ranges) { final List<RowResult<byte[]>> list = BatchingVisitables.copyToList(batchingVisitable); assertEquals(1, list.size()); assertEquals(1, list.get(0).getColumns().size()); } RangeRequest range3 = range1.getBuilder().retainColumns(ColumnSelection.create(ImmutableSet.of(PtBytes.toBytes("col2")))).build(); verifyAllGetRangesImplsRangeSizes(t, range3, 0); }
public BatchingVisitableView<Index1IdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, Index1IdxRowResult>() { @Override public Index1IdxRowResult apply(RowResult<byte[]> input) { return Index1IdxRowResult.of(input); } }); }
public BatchingVisitableView<Index2IdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, Index2IdxRowResult>() { @Override public Index2IdxRowResult apply(RowResult<byte[]> input) { return Index2IdxRowResult.of(input); } }); }
public BatchingVisitableView<RangeScanTestRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, RangeScanTestRowResult>() { @Override public RangeScanTestRowResult apply(RowResult<byte[]> input) { return RangeScanTestRowResult.of(input); } }); }
public BatchingVisitableView<Index3IdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, Index3IdxRowResult>() { @Override public Index3IdxRowResult apply(RowResult<byte[]> input) { return Index3IdxRowResult.of(input); } }); }
public BatchingVisitableView<GenericRangeScanTestRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, GenericRangeScanTestRowResult>() { @Override public GenericRangeScanTestRowResult apply(RowResult<byte[]> input) { return GenericRangeScanTestRowResult.of(input); } }); }
public BatchingVisitableView<Index4IdxRowResult> getRange(RangeRequest range) { if (range.getColumnNames().isEmpty()) { range = range.getBuilder().retainColumns(allColumns).build(); } return BatchingVisitables.transform(t.getRange(tableRef, range), new Function<RowResult<byte[]>, Index4IdxRowResult>() { @Override public Index4IdxRowResult apply(RowResult<byte[]> input) { return Index4IdxRowResult.of(input); } }); }
private byte[] copyOneTransactionInternal(RangeRequest range, long rangeId, Transaction readT, Transaction writeT) { final long maxBytes = TransactionConstants.WARN_LEVEL_FOR_QUEUED_BYTES / 2; byte[] start = getCheckpoint(rangeId, writeT); if (start == null) { return null; } RangeRequest.Builder builder = range.getBuilder().startRowInclusive(start); if (builder.isInvalidRange()) { return null; } RangeRequest rangeToUse = builder.build(); BatchingVisitable<RowResult<byte[]>> bv = readT.getRange(srcTable, rangeToUse); byte[] lastRow = internalCopyRange(bv, maxBytes, writeT); byte[] nextRow = getNextRowName(lastRow); checkpointer.checkpoint(srcTable.getQualifiedName(), rangeId, nextRow, writeT); return lastRow; }