Skip to content

Commit 4808d65

Browse files
authored
feat(bigtable): implement PrepareQuery in DataConnectionImpl (#15661)
* feat(bigtable): implement PrepareQuery in DataConnectionImpl
1 parent f3d1a89 commit 4808d65

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

google/cloud/bigtable/internal/data_connection_impl.cc

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -619,8 +619,29 @@ DataConnectionImpl::AsyncReadRow(std::string const& table_name,
619619
}
620620

621621
StatusOr<bigtable::PreparedQuery> DataConnectionImpl::PrepareQuery(
622-
bigtable::PrepareQueryParams const&) {
623-
return Status(StatusCode::kUnimplemented, "not implemented");
622+
bigtable::PrepareQueryParams const& params) {
623+
auto current = google::cloud::internal::SaveCurrentOptions();
624+
google::bigtable::v2::PrepareQueryRequest request;
625+
request.set_instance_name(params.instance.FullName());
626+
request.set_app_profile_id(app_profile_id(*current));
627+
request.set_query(params.sql_statement.sql());
628+
for (auto const& p : params.sql_statement.params()) {
629+
(*request.mutable_param_types())[p.first] = p.second.type();
630+
}
631+
auto response = google::cloud::internal::RetryLoop(
632+
retry_policy(*current), backoff_policy(*current),
633+
Idempotency::kNonIdempotent,
634+
[this](grpc::ClientContext& context, Options const& options,
635+
google::bigtable::v2::PrepareQueryRequest const& request) {
636+
return stub_->PrepareQuery(context, options, request);
637+
},
638+
*current, request, __func__);
639+
if (!response) {
640+
return std::move(response).status();
641+
}
642+
return bigtable::PreparedQuery(background_->cq(), params.instance,
643+
std::move(params.sql_statement),
644+
*std::move(response));
624645
}
625646

626647
future<StatusOr<bigtable::PreparedQuery>> DataConnectionImpl::AsyncPrepareQuery(

google/cloud/bigtable/internal/data_connection_impl_test.cc

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2730,13 +2730,45 @@ TEST_F(DataConnectionTest, ExecuteQuery) {
27302730
StatusIs(StatusCode::kUnimplemented));
27312731
}
27322732

2733-
TEST_F(DataConnectionTest, PrepareQuery) {
2734-
auto conn = TestConnection(std::make_shared<MockBigtableStub>());
2733+
TEST_F(DataConnectionTest, PrepareQuerySuccess) {
2734+
auto mock = std::make_shared<MockBigtableStub>();
2735+
EXPECT_CALL(*mock, PrepareQuery)
2736+
.WillOnce([](grpc::ClientContext&, Options const&,
2737+
v2::PrepareQueryRequest const& request) {
2738+
EXPECT_EQ(kAppProfile, request.app_profile_id());
2739+
EXPECT_EQ("projects/the-project/instances/the-instance",
2740+
request.instance_name());
2741+
EXPECT_EQ("SELECT * FROM the-table", request.query());
2742+
v2::PrepareQueryResponse response;
2743+
return response;
2744+
});
2745+
2746+
auto conn = TestConnection(std::move(mock));
27352747
internal::OptionsSpan span(CallOptions());
2736-
EXPECT_THAT(conn->PrepareQuery(bigtable::PrepareQueryParams{
2737-
bigtable::InstanceResource(google::cloud::Project(""), ""),
2738-
bigtable::SqlStatement("")}),
2739-
StatusIs(StatusCode::kUnimplemented));
2748+
auto params = bigtable::PrepareQueryParams{
2749+
bigtable::InstanceResource(google::cloud::Project("the-project"),
2750+
"the-instance"),
2751+
bigtable::SqlStatement("SELECT * FROM the-table")};
2752+
auto prepared_query = conn->PrepareQuery(params);
2753+
ASSERT_STATUS_OK(prepared_query);
2754+
EXPECT_EQ(prepared_query->instance(), params.instance);
2755+
EXPECT_EQ(prepared_query->sql_statement(), params.sql_statement);
2756+
}
2757+
2758+
TEST_F(DataConnectionTest, PrepareQueryPermanentError) {
2759+
auto mock = std::make_shared<MockBigtableStub>();
2760+
EXPECT_CALL(*mock, PrepareQuery)
2761+
.WillOnce(
2762+
[](grpc::ClientContext&, Options const&,
2763+
v2::PrepareQueryRequest const&) { return PermanentError(); });
2764+
2765+
auto conn = TestConnection(std::move(mock));
2766+
internal::OptionsSpan span(CallOptions());
2767+
auto result = conn->PrepareQuery(bigtable::PrepareQueryParams{
2768+
bigtable::InstanceResource(google::cloud::Project("the-project"),
2769+
"the-instance"),
2770+
bigtable::SqlStatement("SELECT * FROM the-table")});
2771+
EXPECT_THAT(result, StatusIs(StatusCode::kPermissionDenied));
27402772
}
27412773

27422774
} // namespace

0 commit comments

Comments
 (0)