@Override public String toString() { ReadRowsRequest request = builder.build(); return MoreObjects.toStringHelper(this) .add("tableId", tableId) .add("keys", request.getRows().getRowKeysList()) .add("ranges", request.getRows().getRowRangesList()) .add("filter", request.getFilter()) .toString(); } }
@Override public int hashCode() { return Objects.hashCode(tableId, builder.build()); }
rows = client.readRowsAsync(rrr.build()).get(); if (rows == null || rows.isEmpty()) { return Status.NOT_FOUND;
rows = client.readRowsAsync(rrr.build()).get(); if (rows == null || rows.isEmpty()) { return Status.NOT_FOUND;
return builder.build();
/** * Split this query into multiple queries that logically combine into this query. This is intended * to be used by map reduce style frameworks like Beam to split a query across multiple workers. * * <p>Expected Usage: * * <pre>{@code * List<ByteString> splitPoints = ...; * List<Query> queryShards = myQuery.shard(splitPoints); * List<ApiFuture<List<Row>>> futures = new ArrayList(); * for (Query subQuery : queryShards) { * futures.add(dataClient.readRowsCallable().all().futureCall(subQuery)); * } * List<List<Row>> results = ApiFutures.allAsList(futures).get(); * }</pre> */ public List<Query> shard(SortedSet<ByteString> splitPoints) { Preconditions.checkState(builder.getRowsLimit() == 0, "Can't shard a query with a row limit"); List<RowSet> shardedRowSets = RowSetUtil.shard(builder.getRows(), splitPoints); List<Query> shards = Lists.newArrayListWithCapacity(shardedRowSets.size()); for (RowSet rowSet : shardedRowSets) { Query queryShard = new Query(tableId); queryShard.builder.mergeFrom(this.builder.build()); queryShard.builder.setRows(rowSet); shards.add(queryShard); } return shards; }
@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 @SuppressWarnings("all") public void readRowsExceptionTest() throws Exception { StatusRuntimeException exception = new StatusRuntimeException(Status.INVALID_ARGUMENT); mockBigtable.addException(exception); TableName tableName = TableName.of("[PROJECT]", "[INSTANCE]", "[TABLE]"); ReadRowsRequest request = ReadRowsRequest.newBuilder().setTableName(tableName.toString()).build(); MockStreamObserver<ReadRowsResponse> responseObserver = new MockStreamObserver<>(); ServerStreamingCallable<ReadRowsRequest, ReadRowsResponse> callable = client.readRowsCallable(); callable.serverStreamingCall(request, responseObserver); try { List<ReadRowsResponse> actualResponses = responseObserver.future().get(); Assert.fail("No exception thrown"); } catch (ExecutionException e) { Assert.assertTrue(e.getCause() instanceof InvalidArgumentException); InvalidArgumentException apiException = (InvalidArgumentException) e.getCause(); Assert.assertEquals(StatusCode.Code.INVALID_ARGUMENT, apiException.getStatusCode().getCode()); } }
@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); }
@Test @SuppressWarnings("all") public void readRowsTest() throws Exception { ByteString lastScannedRowKey = ByteString.copyFromUtf8("-126"); ReadRowsResponse expectedResponse = ReadRowsResponse.newBuilder().setLastScannedRowKey(lastScannedRowKey).build(); mockBigtable.addResponse(expectedResponse); TableName tableName = TableName.of("[PROJECT]", "[INSTANCE]", "[TABLE]"); ReadRowsRequest request = ReadRowsRequest.newBuilder().setTableName(tableName.toString()).build(); MockStreamObserver<ReadRowsResponse> responseObserver = new MockStreamObserver<>(); ServerStreamingCallable<ReadRowsRequest, ReadRowsResponse> callable = client.readRowsCallable(); callable.serverStreamingCall(request, responseObserver); List<ReadRowsResponse> actualResponses = responseObserver.future().get(); Assert.assertEquals(1, actualResponses.size()); Assert.assertEquals(expectedResponse, actualResponses.get(0)); }
@Test public void rowKeysTest() { Query query = Query.create(TABLE_ID) .rowKey("simple-string") .rowKey(ByteString.copyFromUtf8("byte-string")); ReadRowsRequest.Builder expectedProto = expectedProtoBuilder(); expectedProto .getRowsBuilder() .addRowKeys(ByteString.copyFromUtf8("simple-string")) .addRowKeys(ByteString.copyFromUtf8("byte-string")); ReadRowsRequest actualProto = query.toProto(requestContext); assertThat(actualProto).isEqualTo(expectedProto.build()); }
/** * Creates the request protobuf. This method is considered an internal implementation detail and * not meant to be used by applications. */ @InternalApi public ReadRowsRequest toProto(RequestContext requestContext) { String tableName = NameUtil.formatTableName( requestContext.getProjectId(), requestContext.getInstanceId(), tableId); return builder .setTableName(tableName) .setAppProfileId(requestContext.getAppProfileId()) .build(); }
ReadRowsRequest getExpectedRequest() { return requestBuilder.build(); } }
private void writeObject(ObjectOutputStream output) throws IOException { output.defaultWriteObject(); builder.build().writeTo(output); }
@Test public void filterTest() { Query query = Query.create(TABLE_ID).filter(FILTERS.key().regex(".*")); Builder expectedProto = expectedProtoBuilder() .setFilter(RowFilter.newBuilder().setRowKeyRegexFilter(ByteString.copyFromUtf8(".*"))); ReadRowsRequest actualProto = query.toProto(requestContext); assertThat(actualProto).isEqualTo(expectedProto.build()); }
@Test public void requestContextTest() { Query query = Query.create(TABLE_ID); ReadRowsRequest proto = query.toProto(requestContext); assertThat(proto).isEqualTo(expectedProtoBuilder().build()); }
@Test public void limitTest() { Query query = Query.create(TABLE_ID).limit(10); Builder expectedProto = expectedProtoBuilder().setRowsLimit(10); ReadRowsRequest actualProto = query.toProto(requestContext); assertThat(actualProto).isEqualTo(expectedProto.build()); }