소스 검색

fields v2.1: add possibly feasible ktypevalue/ktypedeletion parse in FindKeysByFields function

main
VirgilZhu 9 달 전
부모
커밋
075e6a0205
2개의 변경된 파일55개의 추가작업 그리고 4개의 파일을 삭제
  1. BIN
      1
  2. +55
    -4
      db/fields.cpp

+ 55
- 4
db/fields.cpp 파일 보기

@ -1,9 +1,9 @@
#include "fields.h"
#include "util/coding.h"
#include <iostream> #include <iostream>
#include <utility> #include <utility>
#include "fields.h"
#include "util/coding.h"
#include "dbformat.h"
namespace leveldb { namespace leveldb {
@ -163,24 +163,75 @@ std::string& Fields::operator[](const std::string& field_name) {
} }
/* 通过若干个字段查询 Key */ /* 通过若干个字段查询 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;
//}
std::vector<std::string> Fields::FindKeysByFields(leveldb::DB* db, const FieldArray& fields) { std::vector<std::string> Fields::FindKeysByFields(leveldb::DB* db, const FieldArray& fields) {
Fields to_fields = Fields(fields); Fields to_fields = Fields(fields);
to_fields.Fields::SortFields(); to_fields.Fields::SortFields();
FieldArray search_fields_ = to_fields.fields_; FieldArray search_fields_ = to_fields.fields_;
std::vector<std::string> find_keys; std::vector<std::string> find_keys;
std::vector<std::string> deleted_keys;
Iterator* it = db->NewIterator(leveldb::ReadOptions()); Iterator* it = db->NewIterator(leveldb::ReadOptions());
for (it->SeekToFirst(); it->Valid(); it->Next()) { for (it->SeekToFirst(); it->Valid(); it->Next()) {
Slice iter_key_slice = it->key(); Slice iter_key_slice = it->key();
const char* p = iter_key_slice.data();
const char* limit = p + iter_key_slice.size();
// const char* limit = p + 5;
uint32_t key_length;
const char* key_ptr = GetVarint32Ptr(p, limit, &key_length);
iter_key_slice = Slice(p, iter_key_slice.size() - 8);
Slice iter_key_for_parse; Slice iter_key_for_parse;
if (!GetLengthPrefixedSlice(&iter_key_slice, &iter_key_for_parse)) { if (!GetLengthPrefixedSlice(&iter_key_slice, &iter_key_for_parse)) {
continue; continue;
} }
std::string iter_key = iter_key_for_parse.ToString(); std::string iter_key = iter_key_for_parse.ToString();
if (std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()){
if (std::find(deleted_keys.begin(), deleted_keys.end(), iter_key) != deleted_keys.end()
|| std::find(find_keys.begin(), find_keys.end(), iter_key) != find_keys.end()) {
continue;
}
const uint64_t tag = DecodeFixed64(key_ptr + key_length - 8);
if ((tag & 0xff) == kTypeDeletion) {
deleted_keys.emplace_back(iter_key);
continue; continue;
} }

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