@java.lang.Override public Builder newBuilderForType() { return newBuilder(); }
/** * Adds a range to be looked up. * * @param start The beginning of the range (inclusive). Can be null to represent negative * infinity. * @param end The end of the range (exclusive). Can be null to represent positive infinity. */ public Query range(ByteString start, ByteString end) { RowRange.Builder rangeBuilder = RowRange.newBuilder(); if (start != null) { rangeBuilder.setStartKeyClosed(start); } if (end != null) { rangeBuilder.setEndKeyOpen(end); } builder.getRowsBuilder().addRowRanges(rangeBuilder.build()); return this; }
@Test public void multipleRangeBoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("a")) .setEndKeyOpen(ByteString.copyFromUtf8("m"))) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("q")) .setEndKeyOpen(ByteString.copyFromUtf8("z"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.create("a", "z")); }
@Test public void rowRangeTest() { Query query = Query.create(TABLE_ID) .range("simple-begin", "simple-end") .range(ByteString.copyFromUtf8("byte-begin"), ByteString.copyFromUtf8("byte-end")) .range(ByteStringRange.create("range-begin", "range-end")); Builder expectedProto = expectedProtoBuilder(); expectedProto .getRowsBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("simple-begin")) .setEndKeyOpen(ByteString.copyFromUtf8("simple-end"))) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("byte-begin")) .setEndKeyOpen(ByteString.copyFromUtf8("byte-end"))) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("range-begin")) .setEndKeyOpen(ByteString.copyFromUtf8("range-end"))); ReadRowsRequest actualProto = query.toProto(requestContext); assertThat(actualProto).isEqualTo(expectedProto.build()); }
@Test public void singleClosedClosedRangeBoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("a")) .setEndKeyClosed(ByteString.copyFromUtf8("b"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().startClosed("a").endClosed("b")); }
@Test public void singleRangeUnbounded1BoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges(RowRange.newBuilder().setStartKeyClosed(ByteString.copyFromUtf8("a"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().startClosed("a")); }
@Test public void singleRangeOpenClosedBoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("a")) .setEndKeyClosed(ByteString.copyFromUtf8("b"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().startOpen("a").endClosed("b")); }
@Test public void noSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("a")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("p")) .setEndKeyOpen(ByteString.copyFromUtf8("q"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE).build(); verifySplit(rowSet, splitPoints, rowSet); }
@Test public void singleOpenOpenRangeBoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("a")) .setEndKeyOpen(ByteString.copyFromUtf8("b"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().startOpen("a").endOpen("b")); }
@Test public void singleRangeUnbounded2BoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges(RowRange.newBuilder().setEndKeyClosed(ByteString.copyFromUtf8("z"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().endClosed("z")); }
@Test public void singleClosedOpenRangeBoundTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("a")) .setEndKeyOpen(ByteString.copyFromUtf8("b"))) .build(); ByteStringRange actual = RowSetUtil.getBound(rowSet); assertThat(actual).isEqualTo(ByteStringRange.unbounded().startClosed("a").endOpen("b")); }
@Test public void startOnSplitPointTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder().setStartKeyClosed(ByteString.copyFromUtf8("3-split"))) .build(); // Inclusive start on a split point should generate 2 segments SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("3-split")) .build(); verifySplit( rowSet, splitPoints, RowSet.newBuilder() .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("3-split")) .setEndKeyClosed(ByteString.copyFromUtf8("3-split"))) .build(), RowSet.newBuilder() .addRowRanges(RowRange.newBuilder().setStartKeyOpen(ByteString.copyFromUtf8("3-split"))) .build()); }
@Test public void unboundedRightOfSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder().setStartKeyOpen(ByteString.copyFromUtf8("5-range-start"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("3-split")) .build(); verifySplit( rowSet, splitPoints, null, RowSet.newBuilder() .addRowRanges( RowRange.newBuilder().setStartKeyOpen(ByteString.copyFromUtf8("5-range-start"))) .build()); }
@Test public void unboundedRangeLeftOfSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowRanges( RowRange.newBuilder().setEndKeyOpen(ByteString.copyFromUtf8("1-range-end"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("5-split")) .build(); verifySplit( rowSet, splitPoints, RowSet.newBuilder() .addRowRanges( RowRange.newBuilder().setEndKeyOpen(ByteString.copyFromUtf8("1-range-end"))) .build(), null); }
@Test public void rangeImmediatelyLeftOfSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("0-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("1-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("2-range-end"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("2-range-end")) .build(); verifySplit( rowSet, splitPoints, RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("0-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("1-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("2-range-end"))) .build(), null); }
@Test public void rangeRightOfSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("9-row-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("5-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("7-range-end"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("3-split")) .build(); verifySplit( rowSet, splitPoints, null, RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("9-row-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("5-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("7-range-end"))) .build()); }
@Test public void rangeLeftOfSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("0-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("1-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("2-range-end"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("3-split")) .build(); verifySplit( rowSet, splitPoints, RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("0-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("1-range-start")) .setEndKeyOpen(ByteString.copyFromUtf8("2-range-end"))) .build(), null); }
@Test public void rangeExactlyFitsSplitTest() { RowSet rowSet = RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("5-split")) .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("3-split")) .setEndKeyClosed(ByteString.copyFromUtf8("5-split"))) .build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("3-split")) .add(ByteString.copyFromUtf8("5-split")) .build(); verifySplit( rowSet, splitPoints, null, RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("5-split")) .addRowRanges( RowRange.newBuilder() .setStartKeyOpen(ByteString.copyFromUtf8("3-split")) .setEndKeyClosed(ByteString.copyFromUtf8("5-split"))) .build(), null); }
@Test public void splitEmptyTest() { RowSet rowSet = RowSet.newBuilder().build(); SortedSet<ByteString> splitPoints = ImmutableSortedSet.orderedBy(ByteStringComparator.INSTANCE) .add(ByteString.copyFromUtf8("a")) .build(); verifySplit( rowSet, splitPoints, RowSet.newBuilder() .addRowRanges(RowRange.newBuilder().setEndKeyClosed(ByteString.copyFromUtf8("a"))) .build(), RowSet.newBuilder() .addRowRanges(RowRange.newBuilder().setStartKeyOpen(ByteString.copyFromUtf8("a"))) .build()); }
@Test public void testFromProto() { ReadRowsRequest request = ReadRowsRequest.newBuilder() .setTableName(NameUtil.formatTableName(PROJECT_ID, INSTANCE_ID, TABLE_ID)) .setAppProfileId(APP_PROFILE_ID) .setFilter(RowFilter.newBuilder().setRowKeyRegexFilter(ByteString.copyFromUtf8(".*"))) .setRows( RowSet.newBuilder() .addRowKeys(ByteString.copyFromUtf8("row-key")) .addRowRanges( RowRange.newBuilder() .setStartKeyClosed(ByteString.copyFromUtf8("j")) .setEndKeyClosed(ByteString.copyFromUtf8("z")))) .build(); Query query = Query.fromProto(request); assertThat(query.toProto(requestContext)).isEqualTo(request); }