diff options
Diffstat (limited to 'icing/query/advanced_query_parser')
-rw-r--r-- | icing/query/advanced_query_parser/query-visitor.cc | 18 | ||||
-rw-r--r-- | icing/query/advanced_query_parser/query-visitor.h | 31 | ||||
-rw-r--r-- | icing/query/advanced_query_parser/query-visitor_test.cc | 296 |
3 files changed, 191 insertions, 154 deletions
diff --git a/icing/query/advanced_query_parser/query-visitor.cc b/icing/query/advanced_query_parser/query-visitor.cc index 910d722..fbd4504 100644 --- a/icing/query/advanced_query_parser/query-visitor.cc +++ b/icing/query/advanced_query_parser/query-visitor.cc @@ -366,5 +366,23 @@ void QueryVisitor::VisitNaryOperator(const NaryOperatorNode* node) { pending_values_.push(std::move(pending_value)); } +libtextclassifier3::StatusOr<QueryResults> QueryVisitor::ConsumeResults() && { + if (has_pending_error()) { + return std::move(pending_error_); + } + if (pending_values_.size() != 1) { + return absl_ports::InvalidArgumentError( + "Visitor does not contain a single root iterator."); + } + auto iterator_or = RetrieveIterator(); + if (!iterator_or.ok()) { + return std::move(iterator_or).status(); + } + QueryResults results; + results.root_iterator = std::move(iterator_or).ValueOrDie(); + results.features_in_use = std::move(features_); + return results; +} + } // namespace lib } // namespace icing diff --git a/icing/query/advanced_query_parser/query-visitor.h b/icing/query/advanced_query_parser/query-visitor.h index 8bba7ea..c6b7d8e 100644 --- a/icing/query/advanced_query_parser/query-visitor.h +++ b/icing/query/advanced_query_parser/query-visitor.h @@ -26,10 +26,11 @@ #include "icing/index/iterator/doc-hit-info-iterator.h" #include "icing/index/numeric/numeric-index.h" #include "icing/query/advanced_query_parser/abstract-syntax-tree.h" +#include "icing/query/query-features.h" +#include "icing/query/query-results.h" #include "icing/schema/schema-store.h" #include "icing/store/document-store.h" #include "icing/transform/normalizer.h" -#include "icing/query/query-features.h" namespace icing { namespace lib { @@ -60,27 +61,10 @@ class QueryVisitor : public AbstractSyntaxTreeVisitor { void VisitNaryOperator(const NaryOperatorNode* node) override; // RETURNS: - // - the DocHitInfoIterator that is the root of the query iterator tree + // - the QueryResults reflecting the AST that was visited // - INVALID_ARGUMENT if the AST does not conform to supported expressions // - NOT_FOUND if the AST refers to a property that does not exist - libtextclassifier3::StatusOr<std::unique_ptr<DocHitInfoIterator>> root() && { - if (has_pending_error()) { - return pending_error_; - } - if (pending_values_.size() != 1) { - return absl_ports::InvalidArgumentError( - "Visitor does not contain a single root iterator."); - } - auto iterator_or = RetrieveIterator(); - if (!iterator_or.ok()) { - pending_error_ = std::move(iterator_or).status(); - return pending_error_; - } - return std::move(iterator_or).ValueOrDie(); - } - - // Returns the set of features used in the query. - const std::unordered_set<Feature>& features() const { return features_; } + libtextclassifier3::StatusOr<QueryResults> ConsumeResults() &&; private: // A holder for intermediate results when processing child nodes. @@ -185,15 +169,16 @@ class QueryVisitor : public AbstractSyntaxTreeVisitor { std::stack<PendingValue> pending_values_; libtextclassifier3::Status pending_error_; + // Set of features invoked in the query. + std::unordered_set<Feature> features_; + Index& index_; // Does not own! const NumericIndex<int64_t>& numeric_index_; // Does not own! const DocumentStore& document_store_; // Does not own! const SchemaStore& schema_store_; // Does not own! const Normalizer& normalizer_; // Does not own! - TermMatchType::Code match_type_; - // Set of features invoked in the query. - std::unordered_set<Feature> features_; + TermMatchType::Code match_type_; }; } // namespace lib diff --git a/icing/query/advanced_query_parser/query-visitor_test.cc b/icing/query/advanced_query_parser/query-visitor_test.cc index 2f816a8..2b5117b 100644 --- a/icing/query/advanced_query_parser/query-visitor_test.cc +++ b/icing/query/advanced_query_parser/query-visitor_test.cc @@ -146,10 +146,11 @@ TEST_F(QueryVisitorTest, SimpleLessThan) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -176,10 +177,11 @@ TEST_F(QueryVisitorTest, SimpleLessThanEq) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -206,10 +208,12 @@ TEST_F(QueryVisitorTest, SimpleEqual) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } TEST_F(QueryVisitorTest, SimpleGreaterThanEq) { @@ -235,10 +239,11 @@ TEST_F(QueryVisitorTest, SimpleGreaterThanEq) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId1)); } @@ -265,10 +270,12 @@ TEST_F(QueryVisitorTest, SimpleGreaterThan) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } // TODO(b/208654892) Properly handle negative numbers in query expressions. @@ -296,10 +303,12 @@ TEST_F(QueryVisitorTest, DISABLED_IntMinLessThanEqual) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId0)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId0)); } TEST_F(QueryVisitorTest, IntMaxGreaterThanEqual) { @@ -326,10 +335,12 @@ TEST_F(QueryVisitorTest, IntMaxGreaterThanEqual) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId1)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId1)); } TEST_F(QueryVisitorTest, NestedPropertyLessThan) { @@ -357,10 +368,11 @@ TEST_F(QueryVisitorTest, NestedPropertyLessThan) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kNumericSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kNumericSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -372,7 +384,7 @@ TEST_F(QueryVisitorTest, IntParsingError) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -384,7 +396,7 @@ TEST_F(QueryVisitorTest, NotEqualsUnsupported) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::UNIMPLEMENTED)); } @@ -427,7 +439,7 @@ TEST_F(QueryVisitorTest, LessThanTooManyOperandsInvalid) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -449,7 +461,7 @@ TEST_F(QueryVisitorTest, LessThanTooFewOperandsInvalid) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -480,7 +492,7 @@ TEST_F(QueryVisitorTest, LessThanNonExistentPropertyNotFound) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::NOT_FOUND)); } @@ -488,7 +500,7 @@ TEST_F(QueryVisitorTest, NeverVisitedReturnsInvalid) { QueryVisitor query_visitor(index_.get(), numeric_index_.get(), document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -517,7 +529,7 @@ TEST_F(QueryVisitorTest, DISABLED_IntMinLessThanInvalid) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -545,7 +557,7 @@ TEST_F(QueryVisitorTest, IntMaxGreaterThanInvalid) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(std::move(query_visitor).root(), + EXPECT_THAT(std::move(query_visitor).ConsumeResults(), StatusIs(libtextclassifier3::StatusCode::INVALID_ARGUMENT)); } @@ -574,9 +586,9 @@ TEST_F(QueryVisitorTest, SingleTerm) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -605,10 +617,11 @@ TEST_F(QueryVisitorTest, SingleVerbatimTerm) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -650,10 +663,12 @@ TEST_F(QueryVisitorTest, VerbatimTermEscapingQuote) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } // 2. How does a user represent a escape char (\) that immediately precedes the @@ -687,10 +702,12 @@ TEST_F(QueryVisitorTest, VerbatimTermEscapingEscape) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId1)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId1)); } // 3. How do we handle other escaped chars? @@ -726,10 +743,12 @@ TEST_F(QueryVisitorTest, VerbatimTermEscapingNonSpecialChar) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId0)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId0)); // Issue a query for the verbatim token `foobar\y`. query = R"("foobar\\y")"; @@ -738,10 +757,12 @@ TEST_F(QueryVisitorTest, VerbatimTermEscapingNonSpecialChar) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_two); - EXPECT_THAT(query_visitor_two.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_two).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_two).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } // This isn't a special case, but is fairly useful for demonstrating. There are @@ -778,10 +799,12 @@ TEST_F(QueryVisitorTest, VerbatimTermNewLine) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId0)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId0)); // Now, issue a query for the verbatim token `foobar\n`. query = R"("foobar\\n")"; @@ -790,10 +813,12 @@ TEST_F(QueryVisitorTest, VerbatimTermNewLine) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_two); - EXPECT_THAT(query_visitor_two.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_two).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_two).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } TEST_F(QueryVisitorTest, VerbatimTermEscapingComplex) { @@ -824,10 +849,12 @@ TEST_F(QueryVisitorTest, VerbatimTermEscapingComplex) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), ElementsAre(kVerbatimSearchFeature)); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId0)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, + ElementsAre(kVerbatimSearchFeature)); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId0)); } TEST_F(QueryVisitorTest, SingleMinusTerm) { @@ -866,10 +893,11 @@ TEST_F(QueryVisitorTest, SingleMinusTerm) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } TEST_F(QueryVisitorTest, SingleNotTerm) { @@ -908,10 +936,11 @@ TEST_F(QueryVisitorTest, SingleNotTerm) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } TEST_F(QueryVisitorTest, ImplicitAndTerms) { Index::Editor editor = index_->Edit(kDocumentId0, kSectionId1, @@ -937,10 +966,11 @@ TEST_F(QueryVisitorTest, ImplicitAndTerms) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId1)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId1)); } TEST_F(QueryVisitorTest, ExplicitAndTerms) { @@ -967,10 +997,11 @@ TEST_F(QueryVisitorTest, ExplicitAndTerms) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId1)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId1)); } TEST_F(QueryVisitorTest, OrTerms) { @@ -997,10 +1028,10 @@ TEST_F(QueryVisitorTest, OrTerms) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId0)); } @@ -1030,10 +1061,10 @@ TEST_F(QueryVisitorTest, AndOrTermPrecedence) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId1)); // Should be interpreted like `(bar OR baz) foo` @@ -1043,10 +1074,10 @@ TEST_F(QueryVisitorTest, AndOrTermPrecedence) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_two); - EXPECT_THAT(query_visitor_two.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_two).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_two).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId1)); query = "(bar OR baz) foo"; @@ -1055,10 +1086,10 @@ TEST_F(QueryVisitorTest, AndOrTermPrecedence) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_three); - EXPECT_THAT(query_visitor_three.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_three).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_three).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId1)); } @@ -1103,10 +1134,10 @@ TEST_F(QueryVisitorTest, AndOrNotPrecedence) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId2, kDocumentId0)); query = "foo NOT (bar OR baz)"; @@ -1115,10 +1146,11 @@ TEST_F(QueryVisitorTest, AndOrNotPrecedence) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_two); - EXPECT_THAT(query_visitor_two.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_two).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId0)); + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_two).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId0)); } TEST_F(QueryVisitorTest, PropertyFilter) { @@ -1169,10 +1201,10 @@ TEST_F(QueryVisitorTest, PropertyFilter) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -1224,10 +1256,10 @@ TEST_F(QueryVisitorTest, PropertyFilterWithGrouping) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), ElementsAre(kDocumentId1, kDocumentId0)); } @@ -1279,10 +1311,11 @@ TEST_F(QueryVisitorTest, PropertyFilterWithNot) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor); - EXPECT_THAT(query_visitor.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(std::unique_ptr<DocHitInfoIterator> root_iterator, - std::move(query_visitor).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(QueryResults query_results, + std::move(query_visitor).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); query = "NOT prop1:(foo OR bar)"; ICING_ASSERT_OK_AND_ASSIGN(root_node, ParseQueryHelper(query)); @@ -1290,10 +1323,11 @@ TEST_F(QueryVisitorTest, PropertyFilterWithNot) { document_store_.get(), schema_store_.get(), normalizer_.get(), TERM_MATCH_PREFIX); root_node->Accept(&query_visitor_two); - EXPECT_THAT(query_visitor_two.features(), IsEmpty()); - ICING_ASSERT_OK_AND_ASSIGN(root_iterator, - std::move(query_visitor_two).root()); - EXPECT_THAT(GetDocumentIds(root_iterator.get()), ElementsAre(kDocumentId2)); + ICING_ASSERT_OK_AND_ASSIGN(query_results, + std::move(query_visitor_two).ConsumeResults()); + EXPECT_THAT(query_results.features_in_use, IsEmpty()); + EXPECT_THAT(GetDocumentIds(query_results.root_iterator.get()), + ElementsAre(kDocumentId2)); } } // namespace |