From 9c7c3d2e14ef183b2c261c9ac52fc2d837394f88 Mon Sep 17 00:00:00 2001 From: Vlad Dobromyslov Date: Tue, 8 Feb 2022 09:38:17 +0300 Subject: [PATCH] #260 fix get_workers_by_account() --- libraries/app/database_api.cpp | 46 ++++++++++++------- .../app/include/graphene/app/database_api.hpp | 4 +- .../include/graphene/chain/voters_info.hpp | 14 +++--- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index 563228b3..682c7b97 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -200,7 +200,7 @@ public: // Workers vector> get_workers(const vector &witness_ids) const; - fc::optional get_worker_by_account(const std::string account_id_or_name) const; + vector get_workers_by_account(const std::string account_id_or_name) const; // Votes vector lookup_vote_ids(const vector &votes) const; @@ -1927,8 +1927,8 @@ vector> database_api::get_workers(const vectorget_workers(worker_ids); } -fc::optional database_api::get_worker_by_account(const std::string account_id_or_name) const { - return my->get_worker_by_account(account_id_or_name); +vector database_api::get_workers_by_account(const std::string account_id_or_name) const { + return my->get_workers_by_account(account_id_or_name); } vector> database_api_impl::get_workers(const vector &worker_ids) const { @@ -1943,13 +1943,18 @@ vector> database_api_impl::get_workers(const vector database_api_impl::get_worker_by_account(const std::string account_id_or_name) const { +vector database_api_impl::get_workers_by_account(const std::string account_id_or_name) const { const auto &idx = _db.get_index_type().indices().get(); const account_id_type account = get_account_from_string(account_id_or_name)->id; auto itr = idx.find(account); - if (itr != idx.end()) - return *itr; - return {}; + vector result; + + if (itr != idx.end() && itr->worker_account == account) { + result.emplace_back(*itr); + ++itr; + } + + return result; } ////////////////////////////////////////////////////////////////////// @@ -2213,7 +2218,7 @@ voters_info database_api_impl::get_voters(const string &account_name_or_id) cons //! Fill voters_info const auto& committee_member_object = get_committee_member_by_account(owner_account_id); const auto& witness_object = get_witness_by_account(owner_account_id); - const auto& worker_object = get_worker_by_account(owner_account_id); + const auto& worker_objects = get_workers_by_account(owner_account_id); const auto& son_object = get_son_by_account(owner_account_id); //! Info for committee member voters @@ -2237,19 +2242,26 @@ voters_info database_api_impl::get_voters(const string &account_name_or_id) cons } //! Info for worker voters - if(worker_object) { - const auto& for_worker_voters = get_voters_by_id(worker_object->vote_for); - result.voters_for_worker.vote_id = worker_object->vote_for; - result.voters_for_worker.voters.reserve(for_worker_voters.size()); + result.voters_for_workers.reserve(worker_objects.size()); + result.voters_against_workers.reserve(worker_objects.size()); + for(const auto& worker_object : worker_objects) { + voters_info_object voters_for_worker; + const auto& for_worker_voters = get_voters_by_id(worker_object.vote_for); + voters_for_worker.vote_id = worker_object.vote_for; + voters_for_worker.voters.reserve(for_worker_voters.size()); for(const auto& voter: for_worker_voters) { - result.voters_for_worker.voters.emplace_back(voter.get_id()); + voters_for_worker.voters.emplace_back(voter.get_id()); } - const auto& against_worker_voters = get_voters_by_id(worker_object->vote_against); - result.voters_against_worker.vote_id = worker_object->vote_against; - result.voters_against_worker.voters.reserve(against_worker_voters.size()); + result.voters_for_workers.emplace_back(std::move(voters_for_worker)); + + voters_info_object voters_against_worker; + const auto& against_worker_voters = get_voters_by_id(worker_object.vote_against); + voters_against_worker.vote_id = worker_object.vote_against; + voters_against_worker.voters.reserve(against_worker_voters.size()); for(const auto& voter: against_worker_voters) { - result.voters_against_worker.voters.emplace_back(voter.get_id()); + voters_against_worker.voters.emplace_back(voter.get_id()); } + result.voters_against_workers.emplace_back(std::move(voters_against_worker)); } //! Info for son voters diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index 836aa632..0c9d10f2 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -725,7 +725,7 @@ public: * @param account_id_or_name The ID or name of the account whose worker should be retrieved * @return The worker object or null if the account does not have a worker */ - fc::optional get_worker_by_account(const std::string account_id_or_name) const; + vector get_workers_by_account(const std::string account_id_or_name) const; /////////// // Votes // @@ -1116,7 +1116,7 @@ FC_API(graphene::app::database_api, // Workers (get_workers) - (get_worker_by_account) + (get_workers_by_account) // Votes (lookup_vote_ids) diff --git a/libraries/chain/include/graphene/chain/voters_info.hpp b/libraries/chain/include/graphene/chain/voters_info.hpp index 5bd09a11..4225732e 100644 --- a/libraries/chain/include/graphene/chain/voters_info.hpp +++ b/libraries/chain/include/graphene/chain/voters_info.hpp @@ -19,11 +19,11 @@ namespace graphene { namespace chain { * @ingroup object */ struct voters_info { - voters_info_object voters_for_committee_member; - voters_info_object voters_for_witness; - voters_info_object voters_for_worker; - voters_info_object voters_against_worker; - voters_info_object voters_for_son; + voters_info_object voters_for_committee_member; + voters_info_object voters_for_witness; + vector voters_for_workers; + vector voters_against_workers; + voters_info_object voters_for_son; }; } } // graphene::chain @@ -35,6 +35,6 @@ FC_REFLECT( graphene::chain::voters_info_object, FC_REFLECT( graphene::chain::voters_info, (voters_for_committee_member) (voters_for_witness) - (voters_for_worker) - (voters_against_worker) + (voters_for_workers) + (voters_against_workers) (voters_for_son) ) \ No newline at end of file