Ver código fonte

optimize FindKeyByField

baseline
ArcueidType 9 meses atrás
pai
commit
5babb13211
3 arquivos alterados com 16 adições e 7 exclusões
  1. +3
    -6
      db/db_impl.cc
  2. +10
    -1
      db/fields.cc
  3. +3
    -0
      db/fields.h

+ 3
- 6
db/db_impl.cc Ver arquivo

@ -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();
}

+ 10
- 1
db/fields.cc Ver arquivo

@ -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

+ 3
- 0
db/fields.h Ver arquivo

@ -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<std::string, std::string> _fields;
};

Carregando…
Cancelar
Salvar