diff options
Diffstat (limited to 'icing/join/join-processor_test.cc')
-rw-r--r-- | icing/join/join-processor_test.cc | 150 |
1 files changed, 120 insertions, 30 deletions
diff --git a/icing/join/join-processor_test.cc b/icing/join/join-processor_test.cc index 00f2b1c..25d4cfc 100644 --- a/icing/join/join-processor_test.cc +++ b/icing/join/join-processor_test.cc @@ -22,6 +22,8 @@ #include "gtest/gtest.h" #include "icing/document-builder.h" #include "icing/file/filesystem.h" +#include "icing/join/qualified-id-joinable-property-indexing-handler.h" +#include "icing/join/qualified-id-type-joinable-index.h" #include "icing/proto/document.pb.h" #include "icing/proto/schema.pb.h" #include "icing/proto/scoring.pb.h" @@ -33,7 +35,14 @@ #include "icing/store/document-id.h" #include "icing/testing/common-matchers.h" #include "icing/testing/fake-clock.h" +#include "icing/testing/icu-data-file-helper.h" +#include "icing/testing/test-data.h" #include "icing/testing/tmp-directory.h" +#include "icing/tokenization/language-segmenter-factory.h" +#include "icing/tokenization/language-segmenter.h" +#include "icing/util/status-macros.h" +#include "icing/util/tokenized-document.h" +#include "unicode/uloc.h" namespace icing { namespace lib { @@ -41,16 +50,37 @@ namespace lib { namespace { using ::testing::ElementsAre; +using ::testing::IsTrue; class JoinProcessorTest : public ::testing::Test { protected: void SetUp() override { test_dir_ = GetTestTempDir() + "/icing_join_processor_test"; - filesystem_.CreateDirectoryRecursively(test_dir_.c_str()); + ASSERT_THAT(filesystem_.CreateDirectoryRecursively(test_dir_.c_str()), + IsTrue()); + schema_store_dir_ = test_dir_ + "/schema_store"; + doc_store_dir_ = test_dir_ + "/doc_store"; + qualified_id_join_index_dir_ = test_dir_ + "/qualified_id_join_index"; + + if (!IsCfStringTokenization() && !IsReverseJniTokenization()) { + ICING_ASSERT_OK( + // File generated via icu_data_file rule in //icing/BUILD. + icu_data_file_helper::SetUpICUDataFile( + GetTestFilePath("icing/icu.dat"))); + } + + language_segmenter_factory::SegmenterOptions options(ULOC_US); + ICING_ASSERT_OK_AND_ASSIGN( + lang_segmenter_, + language_segmenter_factory::Create(std::move(options))); + + ASSERT_THAT( + filesystem_.CreateDirectoryRecursively(schema_store_dir_.c_str()), + IsTrue()); ICING_ASSERT_OK_AND_ASSIGN( schema_store_, - SchemaStore::Create(&filesystem_, test_dir_, &fake_clock_)); + SchemaStore::Create(&filesystem_, schema_store_dir_, &fake_clock_)); SchemaProto schema = SchemaBuilder() @@ -75,24 +105,51 @@ class JoinProcessorTest : public ::testing::Test { .Build(); ASSERT_THAT(schema_store_->SetSchema(schema), IsOk()); + ASSERT_THAT(filesystem_.CreateDirectoryRecursively(doc_store_dir_.c_str()), + IsTrue()); ICING_ASSERT_OK_AND_ASSIGN( DocumentStore::CreateResult create_result, - DocumentStore::Create(&filesystem_, test_dir_, &fake_clock_, + DocumentStore::Create(&filesystem_, doc_store_dir_, &fake_clock_, schema_store_.get())); doc_store_ = std::move(create_result.document_store); + + ICING_ASSERT_OK_AND_ASSIGN(qualified_id_join_index_, + QualifiedIdTypeJoinableIndex::Create( + filesystem_, qualified_id_join_index_dir_)); } void TearDown() override { + qualified_id_join_index_.reset(); doc_store_.reset(); schema_store_.reset(); + lang_segmenter_.reset(); filesystem_.DeleteDirectoryRecursively(test_dir_.c_str()); } + libtextclassifier3::StatusOr<DocumentId> PutAndIndexDocument( + const DocumentProto& document) { + ICING_ASSIGN_OR_RETURN(DocumentId document_id, doc_store_->Put(document)); + ICING_ASSIGN_OR_RETURN( + TokenizedDocument tokenized_document, + TokenizedDocument::Create(schema_store_.get(), lang_segmenter_.get(), + document)); + + ICING_ASSIGN_OR_RETURN( + std::unique_ptr<QualifiedIdJoinablePropertyIndexingHandler> handler, + QualifiedIdJoinablePropertyIndexingHandler::Create( + &fake_clock_, qualified_id_join_index_.get())); + ICING_RETURN_IF_ERROR(handler->Handle(tokenized_document, document_id, + /*recovery_mode=*/false, + /*put_document_stats=*/nullptr)); + return document_id; + } + libtextclassifier3::StatusOr<std::vector<JoinedScoredDocumentHit>> Join( const JoinSpecProto& join_spec, std::vector<ScoredDocumentHit>&& parent_scored_document_hits, std::vector<ScoredDocumentHit>&& child_scored_document_hits) { - JoinProcessor join_processor(doc_store_.get()); + JoinProcessor join_processor(doc_store_.get(), schema_store_.get(), + qualified_id_join_index_.get()); ICING_ASSIGN_OR_RETURN( JoinChildrenFetcher join_children_fetcher, join_processor.GetChildrenFetcher( @@ -104,8 +161,15 @@ class JoinProcessorTest : public ::testing::Test { Filesystem filesystem_; std::string test_dir_; + std::string schema_store_dir_; + std::string doc_store_dir_; + std::string qualified_id_join_index_dir_; + + std::unique_ptr<LanguageSegmenter> lang_segmenter_; std::unique_ptr<SchemaStore> schema_store_; std::unique_ptr<DocumentStore> doc_store_; + std::unique_ptr<QualifiedIdTypeJoinableIndex> qualified_id_join_index_; + FakeClock fake_clock_; }; @@ -144,11 +208,16 @@ TEST_F(JoinProcessorTest, JoinByQualifiedId) { .AddStringProperty("sender", "pkg$db/namespace#person1") .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(person2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, doc_store_->Put(email2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id5, doc_store_->Put(email3)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(person2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, + PutAndIndexDocument(email2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id5, + PutAndIndexDocument(email3)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -216,9 +285,12 @@ TEST_F(JoinProcessorTest, ShouldIgnoreChildDocumentsWithoutJoiningProperty) { .AddStringProperty("subject", "test subject 2") .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(email1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email2)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -290,10 +362,14 @@ TEST_F(JoinProcessorTest, ShouldIgnoreChildDocumentsWithInvalidQualifiedId) { R"(pkg$db/namespace\#person1)") // invalid format .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(email1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, doc_store_->Put(email3)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, + PutAndIndexDocument(email3)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -356,9 +432,12 @@ TEST_F(JoinProcessorTest, LeftJoinShouldReturnParentWithoutChildren) { R"(pkg$db/name\#space\\\\#person2)") // escaped .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(person2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(person2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email1)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -430,10 +509,14 @@ TEST_F(JoinProcessorTest, ShouldSortChildDocumentsByRankingStrategy) { .AddStringProperty("sender", "pkg$db/namespace#person1") .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(email1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, doc_store_->Put(email3)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, + PutAndIndexDocument(email3)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -519,12 +602,18 @@ TEST_F(JoinProcessorTest, R"(pkg$db/name\#space\\\\#person2)") // escaped .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(person1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, doc_store_->Put(person2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, doc_store_->Put(email1)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, doc_store_->Put(email2)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id5, doc_store_->Put(email3)); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id6, doc_store_->Put(email4)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(person1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2, + PutAndIndexDocument(person2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id3, + PutAndIndexDocument(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id4, + PutAndIndexDocument(email2)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id5, + PutAndIndexDocument(email3)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id6, + PutAndIndexDocument(email4)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); @@ -587,7 +676,8 @@ TEST_F(JoinProcessorTest, ShouldAllowSelfJoining) { .AddStringProperty("sender", "pkg$db/namespace#email1") .Build(); - ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, doc_store_->Put(email1)); + ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id1, + PutAndIndexDocument(email1)); ScoredDocumentHit scored_doc_hit1(document_id1, kSectionIdMaskNone, /*score=*/0.0); |