From 97394c146aca6284b02061ddca52c5aa514a485b Mon Sep 17 00:00:00 2001 From: kishorenc Date: Mon, 14 Sep 2020 07:12:21 +0530 Subject: [PATCH] Allow `:=` filter syntax for non-string fields. Though it makes no difference. --- src/collection.cpp | 7 +++++++ src/typesense_server_utils.cpp | 2 +- test/collection_test.cpp | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/collection.cpp b/src/collection.cpp index 5d4a9218..f37800ec 100644 --- a/src/collection.cpp +++ b/src/collection.cpp @@ -542,6 +542,13 @@ Option Collection::search(const std::string & query, const std:: std::string & raw_value = expression_parts[1]; filter f; + // skip past optional `:=` operator, which has no meaning for non-string fields + if(!_field.is_string() && raw_value[0] == '=') { + size_t filter_value_index = 0; + while(raw_value[++filter_value_index] == ' '); + raw_value = raw_value.substr(filter_value_index); + } + if(_field.is_integer() || _field.is_float()) { // could be a single value or a list if(raw_value[0] == '[' && raw_value[raw_value.size() - 1] == ']') { diff --git a/src/typesense_server_utils.cpp b/src/typesense_server_utils.cpp index 5b747ffd..640e5864 100644 --- a/src/typesense_server_utils.cpp +++ b/src/typesense_server_utils.cpp @@ -57,7 +57,7 @@ void catch_crash(int sig) { Option fetch_file_contents(const std::string & file_path) { if(!file_exists(file_path)) { - return Option(404, "File does not exist."); + return Option(404, std::string("File does not exist at: ") + file_path); } std::ifstream infile(file_path); diff --git a/test/collection_test.cpp b/test/collection_test.cpp index 917cece2..91c55e56 100644 --- a/test/collection_test.cpp +++ b/test/collection_test.cpp @@ -1056,6 +1056,13 @@ TEST_F(CollectionTest, FilterOnNumericFields) { results = coll_array_fields->search("Jeremy", query_fields, "age:24", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); ASSERT_EQ(1, results["hits"].size()); + // alternative `:=` syntax + results = coll_array_fields->search("Jeremy", query_fields, "age:=24", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); + ASSERT_EQ(1, results["hits"].size()); + + results = coll_array_fields->search("Jeremy", query_fields, "age:= 24", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); + ASSERT_EQ(1, results["hits"].size()); + // Searching a number against an int32 array field results = coll_array_fields->search("Jeremy", query_fields, "years:>2002", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); ASSERT_EQ(3, results["hits"].size()); @@ -1103,6 +1110,10 @@ TEST_F(CollectionTest, FilterOnNumericFields) { ASSERT_STREQ(id.c_str(), result_id.c_str()); } + // alternative `:=` syntax + results = coll_array_fields->search("Jeremy", query_fields, "age:= [21, 24, 63]", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); + ASSERT_EQ(3, results["hits"].size()); + // multiple search values against an int32 array field - also use extra padding between symbols results = coll_array_fields->search("Jeremy", query_fields, "years : [ 2015, 1985 , 1999]", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); ASSERT_EQ(4, results["hits"].size()); @@ -1460,6 +1471,10 @@ TEST_F(CollectionTest, QueryBoolFields) { ASSERT_STREQ(id.c_str(), result_id.c_str()); } + // alternative `:=` syntax + results = coll_bool->search("the", query_fields, "popular:=true", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); + ASSERT_EQ(3, results["hits"].size()); + results = coll_bool->search("the", query_fields, "popular:false", facets, sort_fields, 0, 10, 1, FREQUENCY, false).get(); ASSERT_EQ(2, results["hits"].size());