Skip to content
Snippets Groups Projects

ENH: Support FIND and COUNT queries

Merged Florian Spreckelsen requested to merge f-query into dev
1 unresolved thread
2 files
+ 12
2
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 50
29
@@ -96,6 +96,8 @@ using caosdb::entity::v1alpha1::MultiTransactionRequest;
using caosdb::entity::v1alpha1::MultiTransactionResponse;
using WrappedResponseCase =
caosdb::entity::v1alpha1::TransactionResponse::WrappedResponseCase;
using QueryResponseCase =
caosdb::entity::v1alpha1::RetrieveResponse::QueryResponseCase;
using caosdb::utility::get_arena;
using grpc::ClientAsyncResponseReader;
using ProtoEntity = caosdb::entity::v1alpha1::Entity;
@@ -131,28 +133,8 @@ auto ResultSet::end() const -> ResultSet::iterator {
return ResultSet::iterator(this, Size());
}
MultiResultSet::MultiResultSet(MultiTransactionResponse *response) {
auto *responses = response->mutable_responses();
for (auto sub_response : *responses) {
switch (sub_response.wrapped_response_case()) {
case WrappedResponseCase::kRetrieveResponse:
this->entities.push_back(std::make_unique<Entity>(
sub_response.mutable_retrieve_response()->release_entity()));
break;
case WrappedResponseCase::kInsertResponse:
this->entities.push_back(
std::make_unique<Entity>(sub_response.release_insert_response()));
break;
case WrappedResponseCase::kDeleteResponse:
this->entities.push_back(
std::make_unique<Entity>(sub_response.release_insert_response()));
break;
default:
// TODO(tf) Updates
break;
}
}
}
MultiResultSet::MultiResultSet(std::vector<std::unique_ptr<Entity>> result_set)
: entities(std::move(result_set)) {}
[[nodiscard]] auto UniqueResult::GetEntity() const -> const Entity & {
const Entity *result = this->entity.get();
@@ -166,6 +148,7 @@ Transaction::Transaction(
response(google::protobuf::Arena::CreateMessage<MultiTransactionResponse>(
get_arena())) {
this->service_stub = std::move(service_stub);
this->query_count = -1;
}
auto Transaction::RetrieveById(const std::string &id) noexcept -> StatusCode {
@@ -197,7 +180,7 @@ auto Transaction::DeleteById(const std::string &id) noexcept -> StatusCode {
auto *sub_request = this->request->add_requests();
sub_request->mutable_delete_request()->set_id(id);
this->status = TransactionStatus::READY();
this->status = TransactionStatus::GO_ON();
return this->status.GetCode();
}
@@ -300,12 +283,29 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus {
auto *responses = this->response->mutable_responses(0);
switch (responses->wrapped_response_case()) {
case WrappedResponseCase::kRetrieveResponse: {
auto *entity = responses->mutable_retrieve_response()->release_entity();
if (!entity->errors().empty()) {
this->status = TransactionStatus::TRANSACTION_ERROR(
"The request returned with errors.");
auto *retrieve_response = responses->mutable_retrieve_response();
switch (retrieve_response->query_response_case()) {
case QueryResponseCase::kEntity: {
auto *entity = retrieve_response->release_entity();
if (!entity->errors().empty()) {
this->status = TransactionStatus::TRANSACTION_ERROR(
"The request returned with errors.");
}
this->result_set = std::make_unique<UniqueResult>(entity);
} break;
case QueryResponseCase::kSelectResult: {
// TODO(tf) Select queries
} break;
case QueryResponseCase::kCountResult: {
this->query_count = retrieve_response->count_result();
std::vector<std::unique_ptr<Entity>> entities;
this->result_set =
std::make_unique<MultiResultSet>(std::move(entities));
} break;
default:
// TODO(tf) Error
break;
}
this->result_set = std::make_unique<UniqueResult>(entity);
} break;
case WrappedResponseCase::kUpdateResponse: {
auto *updatedIdResponse = responses->mutable_update_response();
@@ -336,7 +336,28 @@ auto Transaction::WaitForIt() const noexcept -> TransactionStatus {
break;
}
} else {
this->result_set = std::make_unique<MultiResultSet>(this->response);
auto *responses = this->response->mutable_responses();
std::vector<std::unique_ptr<Entity>> entities;
for (auto sub_response : *responses) {
switch (sub_response.wrapped_response_case()) {
case WrappedResponseCase::kRetrieveResponse:
entities.push_back(std::make_unique<Entity>(
sub_response.mutable_retrieve_response()->release_entity()));
break;
case WrappedResponseCase::kInsertResponse:
entities.push_back(
std::make_unique<Entity>(sub_response.release_insert_response()));
break;
case WrappedResponseCase::kDeleteResponse:
entities.push_back(
std::make_unique<Entity>(sub_response.release_insert_response()));
break;
default:
// TODO(tf) Updates
break;
}
}
this->result_set = std::make_unique<MultiResultSet>(std::move(entities));
}
return this->status;
Loading