private void verifyRowsDeletedFromSweepQueue(List<SweepableCellsRow> rows) { ArgumentCaptor<RangeRequest> captor = ArgumentCaptor.forClass(RangeRequest.class); verify(spiedKvs, atLeast(0)).deleteRange(eq(SWEEP_QUEUE_TABLE), captor.capture()); List<RangeRequest> expectedRangesToDelete = rows.stream() .map(row -> RangeRequest.builder() .startRowInclusive(row) .endRowExclusive(RangeRequests.nextLexicographicName(row.persistToBytes())) .build()) .collect(Collectors.toList()); assertThat(captor.getAllValues()).hasSameElementsAs(expectedRangesToDelete); }
@Test public void testKeyValueEmptyRange() { putDirect("row1", "col1", "v1", 0); byte[] rowBytes = PtBytes.toBytes("row1"); ImmutableList<RowResult<Value>> list = ImmutableList.copyOf(keyValueService.getRange(TEST_TABLE, RangeRequest.builder().startRowInclusive(rowBytes).endRowExclusive(rowBytes).build(), 1)); assertTrue(list.isEmpty()); }
@JsonIgnore public Builder getBuilder() { return new Builder(reverse) .endRowExclusive(endExclusive) .startRowInclusive(startInclusive) .batchHint(batchHint) .retainColumns(columns); }
@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); }
@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); } };
private void validateTable(TableReference table, int limit, Transaction t1, Transaction t2) { RangeRequest.Builder builder = RangeRequest.builder().batchHint(limit); byte[] nextRowName = new byte[0]; while (nextRowName != null) { RangeRequest range = builder.startRowInclusive(nextRowName).build(); nextRowName = validateAndGetNextRowName(table, limit, t1, t2, range); } }
@Test public void startOnly() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).build(); WhereClauses whereClauses = WhereClauses.create("i", request); List<String> expectedClauses = ImmutableList.of("i.row_name >= ?"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START)); }
@Override protected Map<String, StringValue> getRangeSecondColumnOnlyFirstTwoResults( Transaction transaction, String startRowKey, String endRowKey) { SchemaApiTestV2Table table = tableFactory.getSchemaApiTestV2Table(transaction); RangeRequest rangeRequest = RangeRequest.builder() .startRowInclusive(SchemaApiTestTable.SchemaApiTestRow.of(startRowKey).persistToBytes()) .endRowExclusive(SchemaApiTestTable.SchemaApiTestRow.of(endRowKey).persistToBytes()) .build(); return table.getSmallRowRangeColumn2(rangeRequest, 2); }
@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); } };
@Test public void whereClausesNoColumns() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).endRowExclusive(END).build(); WhereClauses whereClauses = WhereClauses.create("i", request); List<String> expectedClauses = ImmutableList.of("i.row_name >= ?", "i.row_name < ?"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START, END)); }
private void setupTestRowsZeroOneAndTwoAndDeleteFrom(byte[] start, byte[] end, boolean reverse) { putTestDataForRowsZeroOneAndTwo(); RangeRequest range = RangeRequest.builder(reverse) .startRowInclusive(start) .endRowExclusive(end) .build(); keyValueService.deleteRange(TEST_TABLE, range); }
private RangeRequest getRangeRequest(boolean reverse, byte[] firstRow, int rowBatchSize) { return RangeRequest.builder(reverse) .startRowInclusive(firstRow) .batchHint(rowBatchSize) .build(); }
private RangeRequest computeRangeRequestForRows(byte[] startRowInclusive, byte[] endRowInclusive) { return RangeRequest.builder() .startRowInclusive(startRowInclusive) .endRowExclusive(RangeRequests.nextLexicographicName(endRowInclusive)) .retainColumns(ColumnSelection.all()) .build(); }
@Test public void whereClausesWithExtraClause() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).endRowExclusive(END).build(); String extraClause = "i.foo = bar"; WhereClauses whereClauses = WhereClauses.create("i", request, extraClause); List<String> expectedClauses = ImmutableList.of("i.row_name >= ?", "i.row_name < ?", extraClause); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START, END)); }
@Test public void whereClausesOneColumn() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).endRowExclusive(END).retainColumns( ColumnSelection.create(ImmutableList.of(COL1))).build(); WhereClauses whereClauses = WhereClauses.create("i", request); List<String> expectedClauses = ImmutableList.of("i.row_name >= ?", "i.row_name < ?", "i.col_name IN (?)"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START, END, COL1)); }
@Test public void withReverseRange() { RangeRequest request = RangeRequest.reverseBuilder().startRowInclusive(END).endRowExclusive(START).build(); WhereClauses whereClauses = WhereClauses.create("i", request); List<String> expectedClauses = ImmutableList.of("i.row_name <= ?", "i.row_name > ?"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(END, START)); }
@Test public void otherDeleteRangeDoesNotCountAsClearingTheTable() throws Exception { RangeRequest request = RangeRequest.builder().startRowInclusive(ROW).build(); kvs.deleteRange(TABLE, request); assertFalse(kvs.hasBeenCleared(TABLE)); } }
static RangeRequest metadataRangeRequestForTable(TableReference tableRef) { byte[] startRow = upperCaseTableReferenceToBytes(tableRef); byte[] endRow = lowerCaseTableReferenceToBytes(tableRef); return RangeRequest.builder() .startRowInclusive(startRow) .endRowExclusive(RangeRequests.nextLexicographicName(endRow)) .retainColumns(ImmutableSet.of(METADATA_COL)) .build(); }
@Test public void usesDifferentTableIdentifier() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).endRowExclusive(END).retainColumns( ColumnSelection.create(ImmutableList.of(COL1))).build(); WhereClauses whereClauses = WhereClauses.create("other", request); List<String> expectedClauses = ImmutableList.of( "other.row_name >= ?", "other.row_name < ?", "other.col_name IN (?)"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START, END, COL1)); }
@Test public void whereClausesMultiColumn() { RangeRequest request = RangeRequest.builder().startRowInclusive(START).endRowExclusive(END).retainColumns( ColumnSelection.create(ImmutableList.of(COL1, COL2, COL3))).build(); WhereClauses whereClauses = WhereClauses.create("i", request); List<String> expectedClauses = ImmutableList.of("i.row_name >= ?", "i.row_name < ?", "i.col_name IN (?,?,?)"); assertEquals(whereClauses.getClauses(), expectedClauses); checkWhereArguments(whereClauses, ImmutableList.of(START, END, COL1, COL2, COL3)); }