From 192b00e71fb3fa64ad70f1f1b99503183635cc1a Mon Sep 17 00:00:00 2001 From: Kishore Nallan Date: Tue, 2 Jan 2018 21:32:40 +0530 Subject: [PATCH] Address API review comments. 1. Move document specific actions under /documents 2. Document creation echoes the full document 3. Collections summary returns full detail on each each collection 4. Collections summary endpoint has no nested root attribute 5. When collection or document is deleted, the whole entity is returned in response --- include/collection.h | 2 +- src/api.cpp | 79 +++++++++--------- src/collection.cpp | 20 +++-- src/main/typesense_server.cpp | 16 ++-- test/collection_test.cpp | 152 +++++++++++++++++----------------- 5 files changed, 139 insertions(+), 130 deletions(-) diff --git a/include/collection.h b/include/collection.h index 6bb74366..83353fc0 100644 --- a/include/collection.h +++ b/include/collection.h @@ -92,7 +92,7 @@ public: std::string get_token_ranking_field(); - Option add(const std::string & json_str); + Option add(const std::string & json_str); Option search(std::string query, const std::vector search_fields, const std::string & simple_filter_query, const std::vector & facet_fields, diff --git a/src/api.cpp b/src/api.cpp index 8560064c..1d525e77 100644 --- a/src/api.cpp +++ b/src/api.cpp @@ -7,6 +7,28 @@ #include "collection.h" #include "collection_manager.h" +nlohmann::json collection_summary_json(Collection *collection) { + nlohmann::json json_response; + + json_response["name"] = collection->get_name(); + json_response["num_documents"] = collection->get_num_documents(); + + const std::vector & coll_fields = collection->get_fields(); + nlohmann::json fields_arr; + + for(const field & coll_field: coll_fields) { + nlohmann::json field_json; + field_json[fields::name] = coll_field.name; + field_json[fields::type] = coll_field.type; + field_json[fields::facet] = coll_field.facet; + fields_arr.push_back(field_json); + } + + json_response["fields"] = fields_arr; + json_response["token_ranking_field"] = collection->get_token_ranking_field(); + return json_response; +} + bool handle_authentication(const route_path & rpath, const std::string & auth_key) { CollectionManager & collectionManager = CollectionManager::get_instance(); if(rpath.handler == get_search) { @@ -19,14 +41,11 @@ bool handle_authentication(const route_path & rpath, const std::string & auth_ke void get_collections(http_req & req, http_res & res) { CollectionManager & collectionManager = CollectionManager::get_instance(); std::vector collections = collectionManager.get_collections(); - nlohmann::json json_response; - json_response["data"] = nlohmann::json::array(); + nlohmann::json json_response = nlohmann::json::array(); for(Collection* collection: collections) { - nlohmann::json collection_map; - collection_map["name"] = collection->get_name(); - collection_map["num_documents"] = collection->get_num_documents(); - json_response["collections"].push_back(collection_map); + nlohmann::json collection_json = collection_summary_json(collection); + json_response.push_back(collection_json); } res.send_200(json_response.dump()); @@ -109,15 +128,16 @@ void del_drop_collection(http_req & req, http_res & res) { std::string doc_id = req.params["id"]; CollectionManager & collectionManager = CollectionManager::get_instance(); + Collection* collection = collectionManager.get_collection(req.params["collection"]); + nlohmann::json collection_json = collection_summary_json(collection); + Option drop_result = collectionManager.drop_collection(req.params["collection"]); if(!drop_result.ok()) { return res.send(drop_result.code(), drop_result.error()); } - nlohmann::json json_response; - json_response["collection"] = req.params["collection"]; - res.send_200(json_response.dump()); + res.send_200(collection_json.dump()); } void get_search(http_req & req, http_res & res) { @@ -257,25 +277,7 @@ void get_collection_summary(http_req & req, http_res & res) { return res.send_404(); } - nlohmann::json json_response; - - json_response["name"] = collection->get_name(); - json_response["num_documents"] = collection->get_num_documents(); - - const std::vector & coll_fields = collection->get_fields(); - nlohmann::json fields_arr; - - for(const field & coll_field: coll_fields) { - nlohmann::json field_json; - field_json[fields::name] = coll_field.name; - field_json[fields::type] = coll_field.type; - field_json[fields::facet] = coll_field.facet; - fields_arr.push_back(field_json); - } - - json_response["fields"] = fields_arr; - json_response["token_ranking_field"] = collection->get_token_ranking_field(); - + nlohmann::json json_response = collection_summary_json(collection); res.send_200(json_response.dump()); } @@ -331,14 +333,12 @@ void post_add_document(http_req & req, http_res & res) { return res.send_404(); } - Option inserted_id_op = collection->add(req.body); + Option inserted_doc_op = collection->add(req.body); - if(!inserted_id_op.ok()) { - res.send(inserted_id_op.code(), inserted_id_op.error()); + if(!inserted_doc_op.ok()) { + res.send(inserted_doc_op.code(), inserted_doc_op.error()); } else { - nlohmann::json json_response; - json_response["id"] = inserted_id_op.get(); - res.send_201(json_response.dump()); + res.send_201(inserted_doc_op.get().dump()); } } @@ -369,14 +369,19 @@ void del_remove_document(http_req & req, http_res & res) { return res.send_404(); } + Option doc_option = collection->get(doc_id); + + if(!doc_option.ok()) { + return res.send(doc_option.code(), doc_option.error()); + } + Option deleted_id_op = collection->remove(doc_id); if(!deleted_id_op.ok()) { res.send(deleted_id_op.code(), deleted_id_op.error()); } else { - nlohmann::json json_response; - json_response["id"] = deleted_id_op.get(); - res.send_200(json_response.dump()); + nlohmann::json doc = doc_option.get(); + res.send_200(doc.dump()); } } diff --git a/src/collection.cpp b/src/collection.cpp index 6bcfe60d..1395cd04 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -64,12 +64,12 @@ void Collection::increment_next_seq_id_field() { next_seq_id++; } -Option Collection::add(const std::string & json_str) { +Option Collection::add(const std::string & json_str) { nlohmann::json document; try { document = nlohmann::json::parse(json_str); } catch(...) { - return Option(400, "Bad JSON."); + return Option(400, "Bad JSON."); } uint32_t seq_id = get_next_seq_id(); @@ -78,7 +78,7 @@ Option Collection::add(const std::string & json_str) { if(document.count("id") == 0) { document["id"] = seq_id_str; } else if(!document["id"].is_string()) { - return Option(400, "Document's `id` field should be a string."); + return Option(400, "Document's `id` field should be a string."); } std::string doc_id = document["id"]; @@ -86,13 +86,13 @@ Option Collection::add(const std::string & json_str) { const Option & index_memory_op = index_in_memory(document, seq_id); if(!index_memory_op.ok()) { - return Option(index_memory_op.code(), index_memory_op.error()); + return Option(index_memory_op.code(), index_memory_op.error()); } store->insert(get_doc_id_key(document["id"]), seq_id_str); store->insert(get_seq_id_key(seq_id), document.dump()); - return Option(doc_id); + return Option(document); } Option Collection::validate_index_in_memory(const nlohmann::json &document, uint32_t seq_id) { @@ -503,13 +503,17 @@ Option Collection::search(std::string query, const std::vectorget(seq_id_key, value); + nlohmann::json wrapper_doc; nlohmann::json document; + try { document = nlohmann::json::parse(value); } catch(...) { return Option(500, "Error while parsing stored document."); } + wrapper_doc["document"] = document; + // highlight query words in the result const std::string & field_name = search_fields[search_fields.size() - field_order_kv.first]; field search_field = search_schema.at(field_name); @@ -576,11 +580,11 @@ Option Collection::search(std::string query, const std::vectorget("/collections", get_collections); server->del("/collections/:collection", del_drop_collection); server->get("/collections/:collection", get_collection_summary); - server->get("/collections/:collection/export", get_collection_export, true); // document management - server->post("/collections/:collection", post_add_document); - server->get("/collections/:collection/search", get_search); - server->get("/collections/:collection/:id", get_fetch_document); - server->del("/collections/:collection/:id", del_remove_document); + server->post("/collections/:collection/documents", post_add_document); + server->get("/collections/:collection/documents/search", get_search); + server->get("/collections/:collection/documents/:id", get_fetch_document); + server->get("/collections/:collection/documents/export", get_collection_export, true); + server->del("/collections/:collection/documents/:id", del_remove_document); // replication server->get("/replication/updates", get_replication_updates, true); @@ -47,11 +47,11 @@ void replica_server_routes() { // collection management server->get("/collections", get_collections); server->get("/collections/:collection", get_collection_summary); - server->get("/collections/:collection/export", get_collection_export, true); // document management - server->get("/collections/:collection/search", get_search); - server->get("/collections/:collection/:id", get_fetch_document); + server->get("/collections/:collection/documents/search", get_search); + server->get("/collections/:collection/documents/:id", get_fetch_document); + server->get("/collections/:collection/export", get_collection_export, true); // replication server->get("/replication/updates", get_replication_updates, true); diff --git a/test/collection_test.cpp b/test/collection_test.cpp index a4c133c8..01ea9885 100644 --- a/test/collection_test.cpp +++ b/test/collection_test.cpp @@ -94,7 +94,7 @@ TEST_F(CollectionTest, ExactSearchShouldBeStable) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -110,7 +110,7 @@ TEST_F(CollectionTest, ExactSearchShouldBeStable) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } } @@ -135,7 +135,7 @@ TEST_F(CollectionTest, ExactPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -150,7 +150,7 @@ TEST_F(CollectionTest, ExactPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -164,7 +164,7 @@ TEST_F(CollectionTest, ExactPhraseSearch) { for(size_t i = 0; i < 3; i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } } @@ -180,7 +180,7 @@ TEST_F(CollectionTest, SkipUnindexedTokensDuringPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -191,7 +191,7 @@ TEST_F(CollectionTest, SkipUnindexedTokensDuringPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -203,7 +203,7 @@ TEST_F(CollectionTest, SkipUnindexedTokensDuringPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); std::string id = ids.at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -225,7 +225,7 @@ TEST_F(CollectionTest, PartialPhraseSearch) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -240,7 +240,7 @@ TEST_F(CollectionTest, QueryWithTypo) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -253,7 +253,7 @@ TEST_F(CollectionTest, QueryWithTypo) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -267,7 +267,7 @@ TEST_F(CollectionTest, TypoTokenRankedByScoreAndFrequency) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -278,7 +278,7 @@ TEST_F(CollectionTest, TypoTokenRankedByScoreAndFrequency) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -287,7 +287,7 @@ TEST_F(CollectionTest, TypoTokenRankedByScoreAndFrequency) { results = collection->search("loox", query_fields, "", facets, sort_fields, 1, 1, 1, FREQUENCY, false).get(); ASSERT_EQ(5, results["found"].get()); ASSERT_EQ(1, results["hits"].size()); - std::string solo_id = results["hits"].at(0)["id"]; + std::string solo_id = results["hits"].at(0)["document"]["id"]; ASSERT_STREQ("22", solo_id.c_str()); results = collection->search("loox", query_fields, "", facets, sort_fields, 1, 2, 1, FREQUENCY, false).get(); @@ -302,7 +302,7 @@ TEST_F(CollectionTest, TypoTokenRankedByScoreAndFrequency) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -313,7 +313,7 @@ TEST_F(CollectionTest, TypoTokenRankedByScoreAndFrequency) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -330,7 +330,7 @@ TEST_F(CollectionTest, TextContainingAnActualTypo) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -344,7 +344,7 @@ TEST_F(CollectionTest, TextContainingAnActualTypo) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -359,7 +359,7 @@ TEST_F(CollectionTest, Pagination) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -372,7 +372,7 @@ TEST_F(CollectionTest, Pagination) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -385,7 +385,7 @@ TEST_F(CollectionTest, Pagination) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -399,7 +399,7 @@ TEST_F(CollectionTest, PrefixSearching) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -410,7 +410,7 @@ TEST_F(CollectionTest, PrefixSearching) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -421,7 +421,7 @@ TEST_F(CollectionTest, PrefixSearching) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -433,7 +433,7 @@ TEST_F(CollectionTest, PrefixSearching) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -444,7 +444,7 @@ TEST_F(CollectionTest, PrefixSearching) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -463,7 +463,7 @@ TEST_F(CollectionTest, PrefixSearching) { // prefix with a typo results = collection->search("late propx", query_fields, "", facets, sort_fields, 2, 1, 1, FREQUENCY, true).get(); ASSERT_EQ(1, results["hits"].size()); - ASSERT_EQ("16", results["hits"].at(0)["id"]); + ASSERT_EQ("16", results["hits"].at(0)["document"]["id"]); } TEST_F(CollectionTest, MultipleFields) { @@ -499,7 +499,7 @@ TEST_F(CollectionTest, MultipleFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -514,7 +514,7 @@ TEST_F(CollectionTest, MultipleFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -530,7 +530,7 @@ TEST_F(CollectionTest, MultipleFields) { ids = {"6", "1", "7"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -542,7 +542,7 @@ TEST_F(CollectionTest, MultipleFields) { ids = {"7", "6", "1"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -554,7 +554,7 @@ TEST_F(CollectionTest, MultipleFields) { ids = {"6"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -644,7 +644,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -657,7 +657,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -675,7 +675,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ids = {"1", "0", "2"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -686,7 +686,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ids = {"3"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -698,7 +698,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ids = {"4"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -710,7 +710,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ids = {"3", "0", "2"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -722,7 +722,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ids = {"3", "1", "4", "0"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -735,7 +735,7 @@ TEST_F(CollectionTest, FilterOnNumericFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -783,7 +783,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -796,7 +796,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); //? } @@ -809,7 +809,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -821,7 +821,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { ids = {"1", "2"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -833,7 +833,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { ids = {"1"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -845,7 +845,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { ids = {"2", "0"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -857,7 +857,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { ids = {"2", "4", "0"}; for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -878,7 +878,7 @@ TEST_F(CollectionTest, FilterOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -920,7 +920,7 @@ TEST_F(CollectionTest, SortOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); EXPECT_STREQ(id.c_str(), result_id.c_str()); } @@ -933,7 +933,7 @@ TEST_F(CollectionTest, SortOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); EXPECT_STREQ(id.c_str(), result_id.c_str()); } @@ -948,7 +948,7 @@ TEST_F(CollectionTest, SortOnFloatFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); EXPECT_STREQ(id.c_str(), result_id.c_str()); } @@ -977,7 +977,7 @@ TEST_F(CollectionTest, QueryBoolFields) { std::string json_line; while (std::getline(infile, json_line)) { - Option op = coll_bool->add(json_line); + coll_bool->add(json_line); } infile.close(); @@ -992,7 +992,7 @@ TEST_F(CollectionTest, QueryBoolFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1005,7 +1005,7 @@ TEST_F(CollectionTest, QueryBoolFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1017,7 +1017,7 @@ TEST_F(CollectionTest, QueryBoolFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1035,7 +1035,7 @@ TEST_F(CollectionTest, QueryBoolFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1078,7 +1078,7 @@ TEST_F(CollectionTest, FilterOnTextFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1090,7 +1090,7 @@ TEST_F(CollectionTest, FilterOnTextFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1103,7 +1103,7 @@ TEST_F(CollectionTest, FilterOnTextFields) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1297,7 +1297,7 @@ TEST_F(CollectionTest, SortingOrder) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1311,7 +1311,7 @@ TEST_F(CollectionTest, SortingOrder) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1326,7 +1326,7 @@ TEST_F(CollectionTest, SortingOrder) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1341,7 +1341,7 @@ TEST_F(CollectionTest, SortingOrder) { for(size_t i = 0; i < results["hits"].size(); i++) { nlohmann::json result = results["hits"].at(i); - std::string result_id = result["id"]; + std::string result_id = result["document"]["id"]; std::string id = ids.at(i); ASSERT_STREQ(id.c_str(), result_id.c_str()); } @@ -1422,23 +1422,23 @@ TEST_F(CollectionTest, IndexingWithBadData) { sample_collection = collectionManager.create_collection("sample_collection", fields, "age").get(); } - const Option & search_fields_missing_op1 = sample_collection->add("{\"namezz\": \"foo\", \"age\": 29, \"average\": 78}"); + const Option & search_fields_missing_op1 = sample_collection->add("{\"namezz\": \"foo\", \"age\": 29, \"average\": 78}"); ASSERT_FALSE(search_fields_missing_op1.ok()); ASSERT_STREQ("Field `tags` has been declared in the schema, but is not found in the document.", search_fields_missing_op1.error().c_str()); - const Option & search_fields_missing_op2 = sample_collection->add("{\"namez\": \"foo\", \"tags\": [], \"age\": 34, \"average\": 78}"); + const Option & search_fields_missing_op2 = sample_collection->add("{\"namez\": \"foo\", \"tags\": [], \"age\": 34, \"average\": 78}"); ASSERT_FALSE(search_fields_missing_op2.ok()); ASSERT_STREQ("Field `name` has been declared in the schema, but is not found in the document.", search_fields_missing_op2.error().c_str()); - const Option & facet_fields_missing_op1 = sample_collection->add("{\"name\": \"foo\", \"age\": 34, \"average\": 78}"); + const Option & facet_fields_missing_op1 = sample_collection->add("{\"name\": \"foo\", \"age\": 34, \"average\": 78}"); ASSERT_FALSE(facet_fields_missing_op1.ok()); ASSERT_STREQ("Field `tags` has been declared in the schema, but is not found in the document.", facet_fields_missing_op1.error().c_str()); const char *doc_str = "{\"name\": \"foo\", \"age\": 34, \"avg\": 78, \"tags\": [\"red\", \"blue\"]}"; - const Option & sort_fields_missing_op1 = sample_collection->add(doc_str); + const Option & sort_fields_missing_op1 = sample_collection->add(doc_str); ASSERT_FALSE(sort_fields_missing_op1.ok()); ASSERT_STREQ("Field `average` has been declared in the schema, but is not found in the document.", sort_fields_missing_op1.error().c_str()); @@ -1446,37 +1446,37 @@ TEST_F(CollectionTest, IndexingWithBadData) { // Handle type errors doc_str = "{\"name\": \"foo\", \"age\": 34, \"tags\": 22, \"average\": 78}"; - const Option & bad_facet_field_op = sample_collection->add(doc_str); + const Option & bad_facet_field_op = sample_collection->add(doc_str); ASSERT_FALSE(bad_facet_field_op.ok()); ASSERT_STREQ("Field `tags` must be a string array.", bad_facet_field_op.error().c_str()); doc_str = "{\"name\": \"foo\", \"age\": 34, \"tags\": [], \"average\": 34}"; - const Option & empty_facet_field_op = sample_collection->add(doc_str); + const Option & empty_facet_field_op = sample_collection->add(doc_str); ASSERT_TRUE(empty_facet_field_op.ok()); doc_str = "{\"name\": \"foo\", \"age\": \"34\", \"tags\": [], \"average\": 34 }"; - const Option & bad_token_ranking_field_op1 = sample_collection->add(doc_str); + const Option & bad_token_ranking_field_op1 = sample_collection->add(doc_str); ASSERT_FALSE(bad_token_ranking_field_op1.ok()); ASSERT_STREQ("Token ranking field `age` must be a number.", bad_token_ranking_field_op1.error().c_str()); doc_str = "{\"name\": \"foo\", \"age\": 343234324234233234, \"tags\": [], \"average\": 34 }"; - const Option & bad_token_ranking_field_op2 = sample_collection->add(doc_str); + const Option & bad_token_ranking_field_op2 = sample_collection->add(doc_str); ASSERT_FALSE(bad_token_ranking_field_op2.ok()); ASSERT_STREQ("Token ranking field `age` exceeds maximum value of int32.", bad_token_ranking_field_op2.error().c_str()); doc_str = "{\"name\": \"foo\", \"tags\": [], \"average\": 34 }"; - const Option & bad_token_ranking_field_op3 = sample_collection->add(doc_str); + const Option & bad_token_ranking_field_op3 = sample_collection->add(doc_str); ASSERT_FALSE(bad_token_ranking_field_op3.ok()); ASSERT_STREQ("Field `age` has been declared as a token ranking field, but is not found in the document.", bad_token_ranking_field_op3.error().c_str()); doc_str = "{\"name\": \"foo\", \"age\": 34, \"tags\": [], \"average\": \"34\"}"; - const Option & bad_rank_field_op = sample_collection->add(doc_str); + const Option & bad_rank_field_op = sample_collection->add(doc_str); ASSERT_FALSE(bad_rank_field_op.ok()); ASSERT_STREQ("Field `average` must be an int32.", bad_rank_field_op.error().c_str()); doc_str = "{\"name\": \"foo\", \"age\": asdadasd, \"tags\": [], \"average\": 34 }"; - const Option & bad_token_ranking_field_op4 = sample_collection->add(doc_str); + const Option & bad_token_ranking_field_op4 = sample_collection->add(doc_str); ASSERT_FALSE(bad_token_ranking_field_op4.ok()); ASSERT_STREQ("Bad JSON.", bad_token_ranking_field_op4.error().c_str()); @@ -1526,7 +1526,7 @@ TEST_F(CollectionTest, IdFieldShouldBeAString) { doc["tags"] = nlohmann::json::array(); doc["tags"].push_back("tag1"); - Option inserted_id_op = coll1->add(doc.dump()); + Option inserted_id_op = coll1->add(doc.dump()); ASSERT_FALSE(inserted_id_op.ok()); ASSERT_STREQ("Document's `id` field should be a string.", inserted_id_op.error().c_str()); @@ -1551,7 +1551,7 @@ TEST_F(CollectionTest, AnIntegerCanBePassedToAFloatField) { doc["name"] = "Jane"; doc["average"] = 98; - Option inserted_id_op = coll1->add(doc.dump()); + Option inserted_id_op = coll1->add(doc.dump()); EXPECT_TRUE(inserted_id_op.ok()); collectionManager.drop_collection("coll1"); }