aboutsummaryrefslogtreecommitdiff
path: root/icing/query/advanced_query_parser
diff options
context:
space:
mode:
Diffstat (limited to 'icing/query/advanced_query_parser')
-rw-r--r--icing/query/advanced_query_parser/query-visitor.cc18
-rw-r--r--icing/query/advanced_query_parser/query-visitor.h31
-rw-r--r--icing/query/advanced_query_parser/query-visitor_test.cc296
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