소스 검색

fields v2: add FindKeysByFields Function

main
VirgilZhu 8 달 전
부모
커밋
04d5574577
4개의 변경된 파일42개의 추가작업 그리고 0개의 파일을 삭제
  1. BIN
      1
  2. +3
    -0
      README.md
  3. +36
    -0
      db/fields.cpp
  4. +3
    -0
      db/fields.h

+ 3
- 0
README.md 파일 보기

@ -120,6 +120,9 @@
std::string operator[](const std::string& field_name) const;
/* 重载运算符 [] 用于修改字段值 */
std::string& operator[](const std::string& field_name);
/* 通过若干个字段查询 Key */
static std::vector<std::string> FindKeysByFields(leveldb::DB* db, const FieldArray& fields);
};
```

+ 36
- 0
db/fields.cpp 파일 보기

@ -162,4 +162,40 @@ std::string& Fields::operator[](const std::string& field_name) {
return fields_.back().second;
}
/* 通过若干个字段查询 Key */
std::vector<std::string> Fields::FindKeysByFields(leveldb::DB* db, const FieldArray& fields) {
Fields to_fields = Fields(fields);
to_fields.Fields::SortFields();
FieldArray search_fields_ = to_fields.fields_;
std::vector<std::string> find_keys;
Iterator* it = db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) {
Slice iter_key_slice = it->key();
Slice iter_key_for_parse;
if (!GetLengthPrefixedSlice(&iter_key_slice, &iter_key_for_parse)) {
continue;
}
std::string iter_key = iter_key_for_parse.ToString();
if (std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()){
continue;
}
FieldArray iter_fields_ = Fields::ParseValue(it->value().ToString()).fields_;
if (iter_fields_ == search_fields_ ||
std::includes(iter_fields_.begin(), iter_fields_.end(),
search_fields_.begin(), search_fields_.end())) {
find_keys.emplace_back(iter_key);
}
}
assert(it->status().ok());
delete it;
return find_keys;
}
} // namespace leveldb

+ 3
- 0
db/fields.h 파일 보기

@ -56,6 +56,9 @@ class Fields {
std::string operator[](const std::string& field_name) const;
/* 重载运算符 [] 用于修改字段值 */
std::string& operator[](const std::string& field_name);
/* 通过若干个字段查询 Key */
static std::vector<std::string> FindKeysByFields(leveldb::DB* db, const FieldArray& fields);
};
} // namespace leveldb

불러오는 중...
취소
저장