private void checkRange(Source source, KeyRange range, int... expectedRows) { checkRange(source, KeySet.range(range), expectedRows); }
private void checkRange(Source source, KeySet keySet, int... expectedRows) { checkReadRange(source, keySet, 0, expectedRows); }
@Test public void limitRead() { checkRangeWithLimit( Source.BASE_TABLE, 2, KeyRange.closedClosed(Key.of("k3"), Key.of("k7")), 3, 4); checkRangeWithLimit( Source.BASE_TABLE, 0, KeyRange.closedClosed(Key.of("k3"), Key.of("k7")), 3, 4, 5, 6, 7); }
@Test public void limitReadUsingIndex() { checkRangeWithLimit(Source.INDEX, 2, KeyRange.closedClosed(Key.of("v3"), Key.of("v7")), 3, 4); checkRangeWithLimit( Source.DESC_INDEX, 2, KeyRange.closedClosed(Key.of("v7"), Key.of("v3")), 7, 6); }
@Test public void indexRangeReads() { checkRange(Source.INDEX, KeySet.singleKey(Key.of("v1")), 1); checkRange(Source.INDEX, KeyRange.closedOpen(Key.of("v3"), Key.of("v5")), 3, 4); checkRange(Source.INDEX, KeyRange.closedClosed(Key.of("v3"), Key.of("v5")), 3, 4, 5); checkRange(Source.INDEX, KeyRange.openClosed(Key.of("v3"), Key.of("v5")), 4, 5); checkRange(Source.INDEX, KeyRange.openOpen(Key.of("v3"), Key.of("v5")), 4); // Partial key specification. checkRange(Source.INDEX, KeyRange.closedClosed(Key.of("v7"), Key.of()), 7, 8, 9); checkRange(Source.INDEX, KeyRange.openClosed(Key.of("v7"), Key.of()), 8, 9); checkRange(Source.INDEX, KeyRange.closedOpen(Key.of(), Key.of("v11")), 0, 1, 10); checkRange(Source.INDEX, KeyRange.closedClosed(Key.of(), Key.of("v11")), 0, 1, 10, 11); // The following produce empty ranges. checkRange(Source.INDEX, KeyRange.closedOpen(Key.of("v7"), Key.of())); checkRange(Source.INDEX, KeyRange.openOpen(Key.of("v7"), Key.of())); checkRange(Source.INDEX, KeyRange.openOpen(Key.of(), Key.of("v11"))); checkRange(Source.INDEX, KeyRange.openClosed(Key.of(), Key.of("v11"))); // Prefix is component-wise, not string prefix. checkRange(Source.INDEX, KeyRange.prefix(Key.of("v1")), 1); checkRange( Source.INDEX, KeyRange.closedOpen(Key.of("v1"), Key.of("v2")), 1, 10, 11, 12, 13, 14); checkRange(Source.INDEX, KeySet.all(), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14); // Read from an index with DESC ordering. checkRange(Source.DESC_INDEX, KeySet.all(), 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); }
private void checkRangeWithLimit(Source source, long limit, KeyRange range, int... expectedRows) { checkReadRange(source, KeySet.range(range), limit, expectedRows); } }
@Test public void rangeReads() { checkRange(Source.BASE_TABLE, KeySet.singleKey(Key.of("k1")), 1); checkRange(Source.BASE_TABLE, KeyRange.closedOpen(Key.of("k3"), Key.of("k5")), 3, 4); checkRange(Source.BASE_TABLE, KeyRange.closedClosed(Key.of("k3"), Key.of("k5")), 3, 4, 5); checkRange(Source.BASE_TABLE, KeyRange.openClosed(Key.of("k3"), Key.of("k5")), 4, 5); checkRange(Source.BASE_TABLE, KeyRange.openOpen(Key.of("k3"), Key.of("k5")), 4); // Partial key specification. checkRange(Source.BASE_TABLE, KeyRange.closedClosed(Key.of("k7"), Key.of()), 7, 8, 9); checkRange(Source.BASE_TABLE, KeyRange.openClosed(Key.of("k7"), Key.of()), 8, 9); checkRange(Source.BASE_TABLE, KeyRange.closedOpen(Key.of(), Key.of("k11")), 0, 1, 10); checkRange(Source.BASE_TABLE, KeyRange.closedClosed(Key.of(), Key.of("k11")), 0, 1, 10, 11); // The following produce empty ranges. // TODO(user): Consider a multi-part key to illustrate partial key behavior. checkRange(Source.BASE_TABLE, KeyRange.closedOpen(Key.of("k7"), Key.of())); checkRange(Source.BASE_TABLE, KeyRange.openOpen(Key.of("k7"), Key.of())); checkRange(Source.BASE_TABLE, KeyRange.openOpen(Key.of(), Key.of("k11"))); checkRange(Source.BASE_TABLE, KeyRange.openClosed(Key.of(), Key.of("k11"))); // Prefix is component-wise, not string prefix. checkRange(Source.BASE_TABLE, KeyRange.prefix(Key.of("k1")), 1); checkRange( Source.BASE_TABLE, KeyRange.closedOpen(Key.of("k1"), Key.of("k2")), 1, 10, 11, 12, 13, 14); checkRange(Source.BASE_TABLE, KeySet.all(), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14); }
@Test public void indexMultiPointRead() { KeySet keys = KeySet.newBuilder().addKey(Key.of("v3")).addKey(Key.of("v5")).addKey(Key.of("v7")).build(); checkRange(Source.INDEX, keys, 3, 5, 7); }
@Test public void multiPointRead() { KeySet keys = KeySet.newBuilder().addKey(Key.of("k3")).addKey(Key.of("k5")).addKey(Key.of("k7")).build(); checkRange(Source.BASE_TABLE, keys, 3, 5, 7); }