#260 fix get_workers_by_account()

This commit is contained in:
Vlad Dobromyslov 2022-02-08 09:38:17 +03:00
parent 6bcea17f28
commit 9c7c3d2e14
3 changed files with 38 additions and 26 deletions

View file

@ -200,7 +200,7 @@ public:
// Workers // Workers
vector<optional<worker_object>> get_workers(const vector<worker_id_type> &witness_ids) const; vector<optional<worker_object>> get_workers(const vector<worker_id_type> &witness_ids) const;
fc::optional<worker_object> get_worker_by_account(const std::string account_id_or_name) const; vector<worker_object> get_workers_by_account(const std::string account_id_or_name) const;
// Votes // Votes
vector<variant> lookup_vote_ids(const vector<vote_id_type> &votes) const; vector<variant> lookup_vote_ids(const vector<vote_id_type> &votes) const;
@ -1927,8 +1927,8 @@ vector<optional<worker_object>> database_api::get_workers(const vector<worker_id
return my->get_workers(worker_ids); return my->get_workers(worker_ids);
} }
fc::optional<worker_object> database_api::get_worker_by_account(const std::string account_id_or_name) const { vector<worker_object> database_api::get_workers_by_account(const std::string account_id_or_name) const {
return my->get_worker_by_account(account_id_or_name); return my->get_workers_by_account(account_id_or_name);
} }
vector<optional<worker_object>> database_api_impl::get_workers(const vector<worker_id_type> &worker_ids) const { vector<optional<worker_object>> database_api_impl::get_workers(const vector<worker_id_type> &worker_ids) const {
@ -1943,13 +1943,18 @@ vector<optional<worker_object>> database_api_impl::get_workers(const vector<work
return result; return result;
} }
fc::optional<worker_object> database_api_impl::get_worker_by_account(const std::string account_id_or_name) const { vector<worker_object> database_api_impl::get_workers_by_account(const std::string account_id_or_name) const {
const auto &idx = _db.get_index_type<worker_index>().indices().get<by_account>(); const auto &idx = _db.get_index_type<worker_index>().indices().get<by_account>();
const account_id_type account = get_account_from_string(account_id_or_name)->id; const account_id_type account = get_account_from_string(account_id_or_name)->id;
auto itr = idx.find(account); auto itr = idx.find(account);
if (itr != idx.end()) vector<worker_object> result;
return *itr;
return {}; 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 //! Fill voters_info
const auto& committee_member_object = get_committee_member_by_account(owner_account_id); 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& 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); const auto& son_object = get_son_by_account(owner_account_id);
//! Info for committee member voters //! 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 //! Info for worker voters
if(worker_object) { result.voters_for_workers.reserve(worker_objects.size());
const auto& for_worker_voters = get_voters_by_id(worker_object->vote_for); result.voters_against_workers.reserve(worker_objects.size());
result.voters_for_worker.vote_id = worker_object->vote_for; for(const auto& worker_object : worker_objects) {
result.voters_for_worker.voters.reserve(for_worker_voters.size()); 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) { 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_for_workers.emplace_back(std::move(voters_for_worker));
result.voters_against_worker.vote_id = worker_object->vote_against;
result.voters_against_worker.voters.reserve(against_worker_voters.size()); 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) { 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 //! Info for son voters

View file

@ -725,7 +725,7 @@ public:
* @param account_id_or_name The ID or name of the account whose worker should be retrieved * @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 * @return The worker object or null if the account does not have a worker
*/ */
fc::optional<worker_object> get_worker_by_account(const std::string account_id_or_name) const; vector<worker_object> get_workers_by_account(const std::string account_id_or_name) const;
/////////// ///////////
// Votes // // Votes //
@ -1116,7 +1116,7 @@ FC_API(graphene::app::database_api,
// Workers // Workers
(get_workers) (get_workers)
(get_worker_by_account) (get_workers_by_account)
// Votes // Votes
(lookup_vote_ids) (lookup_vote_ids)

View file

@ -19,11 +19,11 @@ namespace graphene { namespace chain {
* @ingroup object * @ingroup object
*/ */
struct voters_info { struct voters_info {
voters_info_object voters_for_committee_member; voters_info_object voters_for_committee_member;
voters_info_object voters_for_witness; voters_info_object voters_for_witness;
voters_info_object voters_for_worker; vector<voters_info_object> voters_for_workers;
voters_info_object voters_against_worker; vector<voters_info_object> voters_against_workers;
voters_info_object voters_for_son; voters_info_object voters_for_son;
}; };
} } // graphene::chain } } // graphene::chain
@ -35,6 +35,6 @@ FC_REFLECT( graphene::chain::voters_info_object,
FC_REFLECT( graphene::chain::voters_info, FC_REFLECT( graphene::chain::voters_info,
(voters_for_committee_member) (voters_for_committee_member)
(voters_for_witness) (voters_for_witness)
(voters_for_worker) (voters_for_workers)
(voters_against_worker) (voters_against_workers)
(voters_for_son) ) (voters_for_son) )