From 5babb13211efcc9302fab8024d1f991e8fbd64bd Mon Sep 17 00:00:00 2001 From: ArcueidType <981354012@qq.com> Date: Wed, 4 Dec 2024 11:22:41 +0800 Subject: [PATCH] optimize FindKeyByField --- db/db_impl.cc | 9 +++------ db/fields.cc | 11 ++++++++++- db/fields.h | 3 +++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/db/db_impl.cc b/db/db_impl.cc index 27ede80..97b43ae 100644 --- a/db/db_impl.cc +++ b/db/db_impl.cc @@ -1220,13 +1220,10 @@ std::vector DBImpl::FindKeysByField(Field &field) { iter->SeekToFirst(); while (iter->Valid()) { std::string key = iter->key().ToString(); - FieldArray field_array = iter->fields().GetFieldArray(); + Fields fields = iter->fields(); - for (const auto& field_db : field_array) { - if (field_db.first == field.first && - field_db.second == field.second) { - keys.push_back(key); - } + if (fields.find(field.first) == field.second) { + keys.emplace_back(key); } iter->Next(); } diff --git a/db/fields.cc b/db/fields.cc index 3622439..1281627 100644 --- a/db/fields.cc +++ b/db/fields.cc @@ -64,10 +64,19 @@ namespace leveldb { FieldArray field_array; for (const auto& _field : this->_fields) { - field_array.push_back(Field(_field.first, _field.second)); + field_array.emplace_back(_field.first, _field.second); } return field_array; } + std::string Fields::find(const std::string& field_name) const { + auto it = this->_fields.find(field_name); + if (it == this->_fields.end()) { + return ""; + } + return it->second; + } + + } // namespace leveldb \ No newline at end of file diff --git a/db/fields.h b/db/fields.h index 127000c..9cfc5a9 100644 --- a/db/fields.h +++ b/db/fields.h @@ -32,6 +32,9 @@ namespace leveldb { // 将Fields编码为存入LevelDB的Value std::string Serialize() const; + + // 通过field_name得到相应的字段值 + std::string find(const std::string& field_name) const; private: std::map _fields; };