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