Fixed an edge case that causes overflow when querying large string fields.

This commit is contained in:
Kishore Nallan 2018-06-08 20:59:14 +05:30
parent 0c765250d3
commit 6bb139399d
3 changed files with 40 additions and 2 deletions

View File

@ -16,7 +16,7 @@
#define TokenOffsetHeap std::priority_queue<TokenOffset, std::vector<TokenOffset>, TokenOffset>
const size_t WINDOW_SIZE = 10;
const uint8_t MAX_DISPLACEMENT = std::numeric_limits<uint8_t>::max();
const uint16_t MAX_DISPLACEMENT = std::numeric_limits<uint16_t>::max();
const uint16_t MAX_TOKENS_DISTANCE = 100;
struct TokenOffset {
@ -110,7 +110,7 @@ struct Match {
// heap now contains the first occurring offset of each token in the given document
uint16_t max_match = 0;
uint8_t min_displacement = MAX_DISPLACEMENT;
uint16_t min_displacement = MAX_DISPLACEMENT;
std::queue<TokenOffset> window;
uint16_t token_offset[WINDOW_SIZE] = { };

View File

@ -1889,6 +1889,42 @@ nlohmann::json get_prune_doc() {
return document;
}
TEST_F(CollectionTest, SearchLargeTextField) {
Collection *coll_large_text;
std::vector<field> fields = {field("text", field_types::STRING, false),
field("age", field_types::INT32, false),
};
std::vector<sort_by> sort_fields = { sort_by("age", "DESC") };
coll_large_text = collectionManager.get_collection("coll_large_text");
if(coll_large_text == nullptr) {
coll_large_text = collectionManager.create_collection("coll_large_text", fields, "age").get();
}
std::string json_line;
std::ifstream infile(std::string(ROOT_DIR)+"test/large_text_field.jsonl");
while (std::getline(infile, json_line)) {
coll_large_text->add(json_line);
}
infile.close();
Option<nlohmann::json> res_op = coll_large_text->search("eguilazer", {"text"}, "", {}, sort_fields, 0, 10);
ASSERT_TRUE(res_op.ok());
nlohmann::json results = res_op.get();
ASSERT_EQ(1, results["hits"].size());
res_op = coll_large_text->search("tristique", {"text"}, "", {}, sort_fields, 0, 10);
ASSERT_TRUE(res_op.ok());
results = res_op.get();
ASSERT_EQ(2, results["hits"].size());
collectionManager.drop_collection("coll_large_text");
}
TEST_F(CollectionTest, PruneFieldsFromDocument) {
nlohmann::json document = get_prune_doc();
Collection::prune_document(document, {"one", "two"}, spp::sparse_hash_set<std::string>());

View File

@ -0,0 +1,2 @@
{"age": 44, "text": "Fusce tellus orci, lacinia non egestas sit amet, vulputate in felis. Donec eu metus ac ligula sodales semper vitae ornare ante. Aenean viverra sollicitudin rhoncus. Fusce laoreet tincidunt dui, lacinia semper odio pellentesque ut. Sed arcu velit, lobortis nec nunc non, rutrum mollis diam. Morbi non felis tincidunt, ornare mauris facilisis, hendrerit erat. Proin feugiat commodo tincidunt. Quisque nec quam non odio elementum gravida. Cras porttitor fermentum sapien, non pulvinar tortor faucibus et. Praesent tristique nunc ac sem sagittis congue eu ut felis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras aliquet nunc vel leo scelerisque, eu finibus urna mattis. Phasellus eget sem eu urna dignissim rhoncus. Morbi sed tincidunt lectus. Fusce non euismod metus. Vivamus id faucibus eros. Aenean vestibulum quis mauris nec auctor. Nulla scelerisque, odio quis hendrerit blandit, enim elit scelerisque velit, eget rutrum arcu metus sed felis. Pellentesque augue ante, rhoncus vel purus et, fermentum facilisis erat. Maecenas tincidunt facilisis urna, vitae convallis erat sollicitudin eu. Maecenas nec euismod nisi, eget faucibus mauris. Nulla facilisi. Phasellus vitae sapien vehicula, fermentum nulla a, sollicitudin libero. Praesent volutpat, est non porttitor sagittis, felis nulla mollis nunc, vitae viverra magna arcu et augue. Cras volutpat, leo id imperdiet laoreet, lorem nisl efficitur nunc, at viverra ligula leo in felis. Nulla non tincidunt erat. Aliquam id ultricies augue. Nullam convallis interdum ex. Proin quis ipsum nec dui varius ullamcorper. Quisque id interdum nulla, in sagittis metus. Nullam tristique elementum enim non porttitor. Aliquam pretium, purus a ullamcorper sodales, dui nunc rhoncus enim, eget vestibulum urna lacus non lacus. Phasellus nec nisl hendrerit, finibus magna eu, varius augue. Praesent vehicula nisi nec neque tincidunt, pulvinar ornare nisl dignissim. Mauris lectus nisi, vulputate a ultrices et, gravida vel dui. Nulla non quam feugiat, eguilazer finibus metus eu."}
{"age": 22, "text": "Phasellus non tristique elit. Praesent non arcu id lectus accumsan venenatis at at justo. Sed convallis auctor neque, ut ullamcorper augue ullamcorper quis. Vestibulum pellentesque varius lectus nec semper. Vivamus non feugiat felis, id malesuada augue. Phasellus posuere est ut lacinia scelerisque. Donec feugiat varius turpis sit amet rhoncus. Donec massa turpis, viverra ut libero a, pretium ultricies nunc. Praesent faucibus ullamcorper ligula, vel tempus ipsum. Nunc magna risus, porta eget bibendum vitae, venenatis non nibh. Aliquam a nisi malesuada, venenatis elit venenatis, tempus libero. Sed dolor nulla, fermentum vel rhoncus at, sollicitudin id dolor. Sed dignissim quam vel porttitor ornare. Mauris at congue nulla, nec eleifend eros. Suspendisse ac felis vel lectus venenatis tincidunt nec ac enim. Quisque et lectus feugiat libero varius fermentum. Curabitur quis dapibus lectus. Praesent tincidunt id quam eu elementum. Proin quis magna eu lectus vestibulum fringilla. Quisque ut felis lectus. Nam vulputate nibh non odio convallis hendrerit. Mauris mollis tempor suscipit. Morbi luctus dui ac augue interdum tempor. Aenean sodales, sapien sed molestie blandit, nunc lorem pulvinar massa, vitae tincidunt quam quam id libero. Vivamus diam sem, volutpat facilisis rutrum quis, fermentum quis risus. Morbi sed pharetra quam. Morbi leo velit, fringilla id odio sit amet, bibendum egestas nunc. Nam elementum dolor pulvinar gravida pulvinar. Sed imperdiet libero eu tellus interdum consectetur. Maecenas in pulvinar odio. Integer malesuada blandit enim eu fermentum. Morbi tristique erat et lacus feugiat, a iaculis ligula pellentesque. Nullam ut luctus enim, nec molestie risus. Nullam venenatis ut velit ac lobortis. Aenean eget odio eleifend, laoreet felis vel, sagittis tellus. Nullam ex risus, dictum non dolor et, blandit accumsan ante. Etiam neque erat, efficitur vitae efficitur ut, ornare et leo. Aliquam erat volutpat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec at laoreet orci. Maecenas."}