aboutsummaryrefslogtreecommitdiff
path: root/icing/store
diff options
context:
space:
mode:
authorTim Barron <tjbarron@google.com>2023-06-02 06:14:34 +0000
committerTim Barron <tjbarron@google.com>2023-06-02 06:14:34 +0000
commitb87146567e78489269a627348e7ba98e97530faa (patch)
tree3982f63f9e8f46d5a4484c9e915ef14db1aa817f /icing/store
parent818e087b7b1108bc871bbe462d7d8fbf83d82d00 (diff)
downloadicing-b87146567e78489269a627348e7ba98e97530faa.tar.gz
Update Icing from upstream.
Descriptions: ======================================================================== Eliminate unnecessary GetCurrentTime syscalls in various hotspots. ======================================================================== Fix MSAN failure in SchemaStore::Header::Write. ======================================================================== Bug: 282308801 Change-Id: Ifb11f890485329e6b0bc1a9cbf2bf046e39b7854
Diffstat (limited to 'icing/store')
-rw-r--r--icing/store/document-store.cc79
-rw-r--r--icing/store/document-store.h12
-rw-r--r--icing/store/document-store_benchmark.cc10
-rw-r--r--icing/store/document-store_test.cc282
-rw-r--r--icing/store/suggestion-result-checker-impl.h10
5 files changed, 248 insertions, 145 deletions
diff --git a/icing/store/document-store.cc b/icing/store/document-store.cc
index b49d0de..e99bacf 100644
--- a/icing/store/document-store.cc
+++ b/icing/store/document-store.cc
@@ -1010,7 +1010,8 @@ libtextclassifier3::StatusOr<DocumentId> DocumentStore::InternalPut(
// Delete the old document. It's fine if it's not found since it might have
// been deleted previously.
- auto delete_status = Delete(old_document_id);
+ auto delete_status =
+ Delete(old_document_id, clock_.GetSystemTimeMilliseconds());
if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) {
// Real error, pass it up.
return delete_status;
@@ -1055,7 +1056,9 @@ libtextclassifier3::StatusOr<DocumentProto> DocumentStore::Get(
libtextclassifier3::StatusOr<DocumentProto> DocumentStore::Get(
DocumentId document_id, bool clear_internal_fields) const {
- auto document_filter_data_optional_ = GetAliveDocumentFilterData(document_id);
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
+ auto document_filter_data_optional_ =
+ GetAliveDocumentFilterData(document_id, current_time_ms);
if (!document_filter_data_optional_) {
// The document doesn't exist. Let's check if the document id is invalid, we
// will return InvalidArgumentError. Otherwise we should return NOT_FOUND
@@ -1118,6 +1121,7 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const {
GetNamespaceIdsToNamespaces(namespace_mapper_.get());
std::unordered_set<NamespaceId> existing_namespace_ids;
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < filter_cache_->num_elements();
++document_id) {
// filter_cache_->Get can only fail if document_id is < 0
@@ -1130,7 +1134,7 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const {
}
const DocumentFilterData* data = status_or_data.ValueOrDie();
- if (GetAliveDocumentFilterData(document_id)) {
+ if (GetAliveDocumentFilterData(document_id, current_time_ms)) {
existing_namespace_ids.insert(data->namespace_id());
}
}
@@ -1144,14 +1148,11 @@ std::vector<std::string> DocumentStore::GetAllNamespaces() const {
}
std::optional<DocumentFilterData> DocumentStore::GetAliveDocumentFilterData(
- DocumentId document_id) const {
- if (!IsDocumentIdValid(document_id)) {
- return std::nullopt;
- }
+ DocumentId document_id, int64_t current_time_ms) const {
if (IsDeleted(document_id)) {
return std::nullopt;
}
- return GetNonExpiredDocumentFilterData(document_id);
+ return GetNonExpiredDocumentFilterData(document_id, current_time_ms);
}
bool DocumentStore::IsDeleted(DocumentId document_id) const {
@@ -1171,7 +1172,8 @@ bool DocumentStore::IsDeleted(DocumentId document_id) const {
// Returns DocumentFilterData if the document is not expired. Otherwise,
// std::nullopt.
std::optional<DocumentFilterData>
-DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id) const {
+DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id,
+ int64_t current_time_ms) const {
auto filter_data_or = filter_cache_->GetCopy(document_id);
if (!filter_data_or.ok()) {
// This would only happen if document_id is out of range of the
@@ -1184,15 +1186,15 @@ DocumentStore::GetNonExpiredDocumentFilterData(DocumentId document_id) const {
DocumentFilterData document_filter_data = filter_data_or.ValueOrDie();
// Check if it's past the expiration time
- if (clock_.GetSystemTimeMilliseconds() >=
- document_filter_data.expiration_timestamp_ms()) {
+ if (current_time_ms >= document_filter_data.expiration_timestamp_ms()) {
return std::nullopt;
}
return document_filter_data;
}
libtextclassifier3::Status DocumentStore::Delete(
- const std::string_view name_space, const std::string_view uri) {
+ const std::string_view name_space, const std::string_view uri,
+ int64_t current_time_ms) {
// Try to get the DocumentId first
auto document_id_or = GetDocumentId(name_space, uri);
if (!document_id_or.ok()) {
@@ -1201,11 +1203,13 @@ libtextclassifier3::Status DocumentStore::Delete(
absl_ports::StrCat("Failed to delete Document. namespace: ", name_space,
", uri: ", uri));
}
- return Delete(document_id_or.ValueOrDie());
+ return Delete(document_id_or.ValueOrDie(), current_time_ms);
}
-libtextclassifier3::Status DocumentStore::Delete(DocumentId document_id) {
- auto document_filter_data_optional_ = GetAliveDocumentFilterData(document_id);
+libtextclassifier3::Status DocumentStore::Delete(DocumentId document_id,
+ int64_t current_time_ms) {
+ auto document_filter_data_optional_ =
+ GetAliveDocumentFilterData(document_id, current_time_ms);
if (!document_filter_data_optional_) {
// The document doesn't exist. We should return InvalidArgumentError if the
// document id is invalid. Otherwise we should return NOT_FOUND error.
@@ -1292,24 +1296,16 @@ libtextclassifier3::StatusOr<int32_t> DocumentStore::GetResultGroupingEntryId(
libtextclassifier3::StatusOr<DocumentAssociatedScoreData>
DocumentStore::GetDocumentAssociatedScoreData(DocumentId document_id) const {
- if (!GetAliveDocumentFilterData(document_id)) {
- return absl_ports::NotFoundError(IcingStringUtil::StringPrintf(
- "Can't get usage scores, document id '%d' doesn't exist", document_id));
- }
-
auto score_data_or = score_cache_->GetCopy(document_id);
if (!score_data_or.ok()) {
ICING_LOG(ERROR) << " while trying to access DocumentId " << document_id
<< " from score_cache_";
- return score_data_or.status();
+ return absl_ports::NotFoundError(
+ std::move(score_data_or).status().error_message());
}
DocumentAssociatedScoreData document_associated_score_data =
std::move(score_data_or).ValueOrDie();
- if (document_associated_score_data.document_score() < 0) {
- // An negative / invalid score means that the score data has been deleted.
- return absl_ports::NotFoundError("Document score data not found.");
- }
return document_associated_score_data;
}
@@ -1344,9 +1340,9 @@ DocumentStore::GetCorpusAssociatedScoreDataToUpdate(CorpusId corpus_id) const {
// TODO(b/273826815): Decide on and adopt a consistent pattern for handling
// NOT_FOUND 'errors' returned by our internal classes.
std::optional<UsageStore::UsageScores> DocumentStore::GetUsageScores(
- DocumentId document_id) const {
+ DocumentId document_id, int64_t current_time_ms) const {
std::optional<DocumentFilterData> opt =
- GetAliveDocumentFilterData(document_id);
+ GetAliveDocumentFilterData(document_id, current_time_ms);
if (!opt) {
return std::nullopt;
}
@@ -1370,7 +1366,8 @@ libtextclassifier3::Status DocumentStore::ReportUsage(
// We can use the internal version here because we got our document_id from
// our internal data structures. We would have thrown some error if the
// namespace and/or uri were incorrect.
- if (!GetAliveDocumentFilterData(document_id)) {
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
+ if (!GetAliveDocumentFilterData(document_id, current_time_ms)) {
// Document was probably deleted or expired.
return absl_ports::NotFoundError(absl_ports::StrCat(
"Couldn't report usage on a nonexistent document: (namespace: '",
@@ -1446,6 +1443,7 @@ libtextclassifier3::StatusOr<int> DocumentStore::BatchDelete(
// Traverse FilterCache and delete all docs that match namespace_id and
// schema_type_id.
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < filter_cache_->num_elements();
++document_id) {
// filter_cache_->Get can only fail if document_id is < 0
@@ -1473,7 +1471,8 @@ libtextclassifier3::StatusOr<int> DocumentStore::BatchDelete(
// The document has the desired namespace and schema type, it either
// exists or has expired.
- libtextclassifier3::Status delete_status = Delete(document_id);
+ libtextclassifier3::Status delete_status =
+ Delete(document_id, current_time_ms);
if (absl_ports::IsNotFound(delete_status)) {
continue;
} else if (!delete_status.ok()) {
@@ -1545,6 +1544,7 @@ DocumentStorageInfoProto DocumentStore::CalculateDocumentStatusCounts(
std::unordered_map<std::string, NamespaceStorageInfoProto>
namespace_to_storage_info;
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0;
document_id < document_id_mapper_->num_elements(); ++document_id) {
// Check if it's deleted first.
@@ -1588,7 +1588,7 @@ DocumentStorageInfoProto DocumentStore::CalculateDocumentStatusCounts(
UsageStore::UsageScores usage_scores = usage_scores_or.ValueOrDie();
// Update our stats
- if (!GetNonExpiredDocumentFilterData(document_id)) {
+ if (!GetNonExpiredDocumentFilterData(document_id, current_time_ms)) {
++total_num_expired;
namespace_storage_info.set_num_expired_documents(
namespace_storage_info.num_expired_documents() + 1);
@@ -1651,6 +1651,7 @@ libtextclassifier3::Status DocumentStore::UpdateSchemaStore(
document_validator_.UpdateSchemaStore(schema_store);
int size = document_id_mapper_->num_elements();
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < size; document_id++) {
auto document_or = Get(document_id);
if (absl_ports::IsNotFound(document_or.status())) {
@@ -1680,7 +1681,8 @@ libtextclassifier3::Status DocumentStore::UpdateSchemaStore(
} else {
// Document is no longer valid with the new SchemaStore. Mark as
// deleted
- auto delete_status = Delete(document.namespace_(), document.uri());
+ auto delete_status =
+ Delete(document.namespace_(), document.uri(), current_time_ms);
if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) {
// Real error, pass up
return delete_status;
@@ -1704,8 +1706,9 @@ libtextclassifier3::Status DocumentStore::OptimizedUpdateSchemaStore(
document_validator_.UpdateSchemaStore(schema_store);
int size = document_id_mapper_->num_elements();
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < size; document_id++) {
- if (!GetAliveDocumentFilterData(document_id)) {
+ if (!GetAliveDocumentFilterData(document_id, current_time_ms)) {
// Skip nonexistent documents
continue;
}
@@ -1749,7 +1752,7 @@ libtextclassifier3::Status DocumentStore::OptimizedUpdateSchemaStore(
if (delete_document) {
// Document is no longer valid with the new SchemaStore. Mark as deleted
- auto delete_status = Delete(document_id);
+ auto delete_status = Delete(document_id, current_time_ms);
if (!delete_status.ok() && !absl_ports::IsNotFound(delete_status)) {
// Real error, pass up
return delete_status;
@@ -1791,12 +1794,14 @@ DocumentStore::OptimizeInto(const std::string& new_directory,
int num_expired = 0;
UsageStore::UsageScores default_usage;
std::vector<DocumentId> document_id_old_to_new(size, kInvalidDocumentId);
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < size; document_id++) {
auto document_or = Get(document_id, /*clear_internal_fields=*/false);
if (absl_ports::IsNotFound(document_or.status())) {
if (IsDeleted(document_id)) {
++num_deleted;
- } else if (!GetNonExpiredDocumentFilterData(document_id)) {
+ } else if (!GetNonExpiredDocumentFilterData(document_id,
+ current_time_ms)) {
++num_expired;
}
continue;
@@ -1866,9 +1871,10 @@ DocumentStore::GetOptimizeInfo() const {
// Figure out our ratio of optimizable/total docs.
int32_t num_documents = document_id_mapper_->num_elements();
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = kMinDocumentId; document_id < num_documents;
++document_id) {
- if (!GetAliveDocumentFilterData(document_id)) {
+ if (!GetAliveDocumentFilterData(document_id, current_time_ms)) {
++optimize_info.optimizable_docs;
}
@@ -1979,9 +1985,10 @@ DocumentStore::CollectCorpusInfo() const {
std::unordered_map<NamespaceId, std::string> namespace_id_to_namespace =
GetNamespaceIdsToNamespaces(namespace_mapper_.get());
const SchemaProto* schema_proto = schema_proto_or.ValueOrDie();
+ int64_t current_time_ms = clock_.GetSystemTimeMilliseconds();
for (DocumentId document_id = 0; document_id < filter_cache_->num_elements();
++document_id) {
- if (!GetAliveDocumentFilterData(document_id)) {
+ if (!GetAliveDocumentFilterData(document_id, current_time_ms)) {
continue;
}
ICING_ASSIGN_OR_RETURN(const DocumentFilterData* filter_data,
diff --git a/icing/store/document-store.h b/icing/store/document-store.h
index 3bb04f4..3941f6d 100644
--- a/icing/store/document-store.h
+++ b/icing/store/document-store.h
@@ -229,7 +229,8 @@ class DocumentStore {
// NOT_FOUND if no document exists with namespace, uri
// INTERNAL_ERROR on IO error
libtextclassifier3::Status Delete(std::string_view name_space,
- std::string_view uri);
+ std::string_view uri,
+ int64_t current_time_ms);
// Deletes the document identified by the given document_id. The document
// proto will be erased immediately.
@@ -243,7 +244,8 @@ class DocumentStore {
// NOT_FOUND if the document doesn't exist (i.e. deleted or expired)
// INTERNAL_ERROR on IO error
// INVALID_ARGUMENT if document_id is invalid.
- libtextclassifier3::Status Delete(DocumentId document_id);
+ libtextclassifier3::Status Delete(DocumentId document_id,
+ int64_t current_time_ms);
// Returns the NamespaceId of the string namespace
//
@@ -339,7 +341,7 @@ class DocumentStore {
// True:DocumentFilterData if the given document exists.
// False if the given document doesn't exist.
std::optional<DocumentFilterData> GetAliveDocumentFilterData(
- DocumentId document_id) const;
+ DocumentId document_id, int64_t current_time_ms) const;
// Gets the usage scores of a document.
//
@@ -347,7 +349,7 @@ class DocumentStore {
// UsageScores on success
// nullopt if there are no usage scores stored for the requested docid.
std::optional<UsageStore::UsageScores> GetUsageScores(
- DocumentId document_id) const;
+ DocumentId document_id, int64_t current_time_ms) const;
// Reports usage. The corresponding usage scores of the specified document in
// the report will be updated.
@@ -714,7 +716,7 @@ class DocumentStore {
// True:DocumentFilterData if the given document isn't expired.
// False if the given doesn't document is expired.
std::optional<DocumentFilterData> GetNonExpiredDocumentFilterData(
- DocumentId document_id) const;
+ DocumentId document_id, int64_t current_time_ms) const;
// Updates the entry in the score cache for document_id.
libtextclassifier3::Status UpdateDocumentAssociatedScoreCache(
diff --git a/icing/store/document-store_benchmark.cc b/icing/store/document-store_benchmark.cc
index 61906a9..75995e9 100644
--- a/icing/store/document-store_benchmark.cc
+++ b/icing/store/document-store_benchmark.cc
@@ -162,7 +162,8 @@ void BM_DoesDocumentExistBenchmark(benchmark::State& state) {
// stuff.
ICING_ASSERT_OK(document_store->Put(
CreateDocument("namespace", /*uri=*/std::to_string(i))));
- document_store->Delete("namespace", /*uri=*/std::to_string(i));
+ document_store->Delete("namespace", /*uri=*/std::to_string(i),
+ clock.GetSystemTimeMilliseconds());
}
std::default_random_engine random;
@@ -171,8 +172,8 @@ void BM_DoesDocumentExistBenchmark(benchmark::State& state) {
// Check random document ids to see if they exist. Hopefully to simulate
// page faulting in different sections of our mmapped derived files.
int document_id = dist(random);
- benchmark::DoNotOptimize(
- document_store->GetAliveDocumentFilterData(document_id));
+ benchmark::DoNotOptimize(document_store->GetAliveDocumentFilterData(
+ document_id, clock.GetSystemTimeMilliseconds()));
}
}
BENCHMARK(BM_DoesDocumentExistBenchmark);
@@ -259,7 +260,8 @@ void BM_Delete(benchmark::State& state) {
ICING_ASSERT_OK(document_store->Put(document));
state.ResumeTiming();
- benchmark::DoNotOptimize(document_store->Delete("namespace", "uri"));
+ benchmark::DoNotOptimize(document_store->Delete(
+ "namespace", "uri", clock.GetSystemTimeMilliseconds()));
}
}
BENCHMARK(BM_Delete);
diff --git a/icing/store/document-store_test.cc b/icing/store/document-store_test.cc
index 146191f..9a1f4a6 100644
--- a/icing/store/document-store_test.cc
+++ b/icing/store/document-store_test.cc
@@ -71,7 +71,6 @@ using ::testing::Ge;
using ::testing::Gt;
using ::testing::HasSubstr;
using ::testing::IsEmpty;
-using ::testing::IsFalse;
using ::testing::IsTrue;
using ::testing::Not;
using ::testing::Return;
@@ -373,22 +372,27 @@ TEST_F(DocumentStoreTest, IsDocumentExistingWithoutStatus) {
ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2,
doc_store->Put(DocumentProto(test_document2_)));
- EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(document_id1));
- EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(document_id2));
+ EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(
+ document_id1, fake_clock_.GetSystemTimeMilliseconds()));
+ EXPECT_TRUE(doc_store->GetAliveDocumentFilterData(
+ document_id2, fake_clock_.GetSystemTimeMilliseconds()));
DocumentId invalid_document_id_negative = -1;
- EXPECT_FALSE(
- doc_store->GetAliveDocumentFilterData(invalid_document_id_negative));
+ EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
+ invalid_document_id_negative, fake_clock_.GetSystemTimeMilliseconds()));
DocumentId invalid_document_id_greater_than_max = kMaxDocumentId + 2;
EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
- invalid_document_id_greater_than_max));
+ invalid_document_id_greater_than_max,
+ fake_clock_.GetSystemTimeMilliseconds()));
- EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(kInvalidDocumentId));
+ EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
+ kInvalidDocumentId, fake_clock_.GetSystemTimeMilliseconds()));
DocumentId invalid_document_id_out_of_range = document_id2 + 1;
- EXPECT_FALSE(
- doc_store->GetAliveDocumentFilterData(invalid_document_id_out_of_range));
+ EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
+ invalid_document_id_out_of_range,
+ fake_clock_.GetSystemTimeMilliseconds()));
}
TEST_F(DocumentStoreTest, GetDeletedDocumentNotFound) {
@@ -404,8 +408,9 @@ TEST_F(DocumentStoreTest, GetDeletedDocumentNotFound) {
document_store->Get(test_document1_.namespace_(), test_document1_.uri()),
IsOkAndHolds(EqualsProto(test_document1_)));
- ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()));
+ ICING_EXPECT_OK(document_store->Delete(
+ test_document1_.namespace_(), test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(
document_store->Get(test_document1_.namespace_(), test_document1_.uri()),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
@@ -488,9 +493,9 @@ TEST_F(DocumentStoreTest, DeleteNonexistentDocumentNotFound) {
DocumentLogCreator::GetDocumentLogFilename())
.c_str());
- EXPECT_THAT(
- document_store->Delete("nonexistent_namespace", "nonexistent_uri"),
- StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
+ EXPECT_THAT(document_store->Delete("nonexistent_namespace", "nonexistent_uri",
+ fake_clock_.GetSystemTimeMilliseconds()),
+ StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
int64_t document_log_size_after = filesystem_.GetFileSize(
absl_ports::StrCat(document_store_dir_, "/",
@@ -514,8 +519,8 @@ TEST_F(DocumentStoreTest, DeleteNonexistentDocumentPrintableErrorMessage) {
DocumentLogCreator::GetDocumentLogFilename())
.c_str());
- libtextclassifier3::Status status =
- document_store->Delete("android$contacts/", "661");
+ libtextclassifier3::Status status = document_store->Delete(
+ "android$contacts/", "661", fake_clock_.GetSystemTimeMilliseconds());
EXPECT_THAT(status, StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
for (char c : status.error_message()) {
EXPECT_THAT(std::isprint(c), IsTrue());
@@ -539,12 +544,14 @@ TEST_F(DocumentStoreTest, DeleteAlreadyDeletedDocumentNotFound) {
ICING_EXPECT_OK(document_store->Put(test_document1_));
// First time is OK
- ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()));
+ ICING_EXPECT_OK(document_store->Delete(
+ test_document1_.namespace_(), test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
// Deleting it again is NOT_FOUND
EXPECT_THAT(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()),
+ test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
}
@@ -626,8 +633,9 @@ TEST_F(DocumentStoreTest, DeleteByNamespaceNoExistingDocumentsNotFound) {
std::move(create_result.document_store);
ICING_EXPECT_OK(document_store->Put(test_document1_));
- ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()));
+ ICING_EXPECT_OK(document_store->Delete(
+ test_document1_.namespace_(), test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
// At this point, there are no existing documents with the namespace, even
// though Icing's derived files know about this namespace. We should still
@@ -829,8 +837,9 @@ TEST_F(DocumentStoreTest, DeleteBySchemaTypeNoExistingDocumentsNotFound) {
std::move(create_result.document_store);
ICING_EXPECT_OK(document_store->Put(test_document1_));
- ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()));
+ ICING_EXPECT_OK(document_store->Delete(
+ test_document1_.namespace_(), test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(
document_store->DeleteBySchemaType(test_document1_.schema()).status,
@@ -925,8 +934,9 @@ TEST_F(DocumentStoreTest, PutDeleteThenPut) {
std::unique_ptr<DocumentStore> doc_store =
std::move(create_result.document_store);
ICING_EXPECT_OK(doc_store->Put(test_document1_));
- ICING_EXPECT_OK(
- doc_store->Delete(test_document1_.namespace_(), test_document1_.uri()));
+ ICING_EXPECT_OK(doc_store->Delete(test_document1_.namespace_(),
+ test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
ICING_EXPECT_OK(doc_store->Put(test_document1_));
}
@@ -1092,7 +1102,8 @@ TEST_F(DocumentStoreTest, OptimizeInto) {
// is deleted
ASSERT_TRUE(filesystem_.DeleteDirectoryRecursively(optimized_dir.c_str()));
ASSERT_TRUE(filesystem_.CreateDirectoryRecursively(optimized_dir.c_str()));
- ICING_ASSERT_OK(doc_store->Delete("namespace", "uri1"));
+ ICING_ASSERT_OK(doc_store->Delete("namespace", "uri1",
+ fake_clock_.GetSystemTimeMilliseconds()));
// DocumentId 0 is removed.
EXPECT_THAT(doc_store->OptimizeInto(optimized_dir, lang_segmenter_.get(),
/*namespace_id_fingerprint=*/false),
@@ -1121,7 +1132,8 @@ TEST_F(DocumentStoreTest, OptimizeInto) {
// Delete the last document
ASSERT_TRUE(filesystem_.DeleteDirectoryRecursively(optimized_dir.c_str()));
ASSERT_TRUE(filesystem_.CreateDirectoryRecursively(optimized_dir.c_str()));
- ICING_ASSERT_OK(doc_store->Delete("namespace", "uri2"));
+ ICING_ASSERT_OK(doc_store->Delete("namespace", "uri2",
+ fake_clock_.GetSystemTimeMilliseconds()));
// DocumentId 0 and 1 is removed, and DocumentId 2 is expired.
EXPECT_THAT(doc_store->OptimizeInto(optimized_dir, lang_segmenter_.get(),
/*namespace_id_fingerprint=*/false),
@@ -1184,7 +1196,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDataLoss) {
/*num_docs=*/2, /*sum_length_in_tokens=*/8)));
// Delete document 1
- EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk());
+ EXPECT_THAT(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()),
+ IsOk());
EXPECT_THAT(doc_store->Get(document_id1),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
EXPECT_THAT(doc_store->Get(document_id2),
@@ -1218,7 +1232,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDataLoss) {
// Checks derived filter cache
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id2));
+ doc_store->GetAliveDocumentFilterData(
+ document_id2, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data,
Eq(DocumentFilterData(
/*namespace_id=*/0,
@@ -1271,7 +1286,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) {
IsOkAndHolds(CorpusAssociatedScoreData(
/*num_docs=*/2, /*sum_length_in_tokens=*/8)));
// Delete document 1
- EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk());
+ EXPECT_THAT(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()),
+ IsOk());
EXPECT_THAT(doc_store->Get(document_id1),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
EXPECT_THAT(doc_store->Get(document_id2),
@@ -1316,7 +1333,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) {
// Checks derived filter cache
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id2));
+ doc_store->GetAliveDocumentFilterData(
+ document_id2, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data,
Eq(DocumentFilterData(
/*namespace_id=*/0,
@@ -1336,8 +1354,10 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromCorruptDerivedFile) {
// scratch.
UsageStore::UsageScores expected_scores;
expected_scores.usage_type1_count = 1;
- ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores,
- doc_store->GetUsageScores(document_id2));
+ ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
+ UsageStore::UsageScores actual_scores,
+ doc_store->GetUsageScores(document_id2,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -1377,7 +1397,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) {
IsOkAndHolds(CorpusAssociatedScoreData(
/*num_docs=*/2, /*sum_length_in_tokens=*/8)));
// Delete document 1
- EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk());
+ EXPECT_THAT(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()),
+ IsOk());
EXPECT_THAT(doc_store->Get(document_id1),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
EXPECT_THAT(doc_store->Get(document_id2),
@@ -1409,7 +1431,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) {
// Checks derived filter cache
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id2));
+ doc_store->GetAliveDocumentFilterData(
+ document_id2, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data,
Eq(DocumentFilterData(
/*namespace_id=*/0,
@@ -1429,8 +1452,10 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromDiscardDerivedFiles) {
// scratch.
UsageStore::UsageScores expected_scores;
expected_scores.usage_type1_count = 1;
- ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores,
- doc_store->GetUsageScores(document_id2));
+ ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
+ UsageStore::UsageScores actual_scores,
+ doc_store->GetUsageScores(document_id2,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -1469,7 +1494,9 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromBadChecksum) {
EXPECT_THAT(doc_store->GetCorpusAssociatedScoreData(/*corpus_id=*/0),
IsOkAndHolds(CorpusAssociatedScoreData(
/*num_docs=*/2, /*sum_length_in_tokens=*/8)));
- EXPECT_THAT(doc_store->Delete("icing", "email/1"), IsOk());
+ EXPECT_THAT(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()),
+ IsOk());
EXPECT_THAT(doc_store->Get(document_id1),
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
EXPECT_THAT(doc_store->Get(document_id2),
@@ -1493,7 +1520,8 @@ TEST_F(DocumentStoreTest, ShouldRecoverFromBadChecksum) {
// Checks derived filter cache
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id2));
+ doc_store->GetAliveDocumentFilterData(
+ document_id2, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data,
Eq(DocumentFilterData(
/*namespace_id=*/0,
@@ -1568,7 +1596,8 @@ TEST_F(DocumentStoreTest, MaxDocumentId) {
EXPECT_THAT(doc_store->last_added_document_id(), Eq(document_id1));
// Still returns the last DocumentId even if it was deleted
- ICING_ASSERT_OK(doc_store->Delete("icing", "email/1"));
+ ICING_ASSERT_OK(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_store->last_added_document_id(), Eq(document_id1));
ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id2,
@@ -1904,7 +1933,8 @@ TEST_F(DocumentStoreTest, NonexistentDocumentFilterDataNotFound) {
std::unique_ptr<DocumentStore> doc_store =
std::move(create_result.document_store);
- EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(/*document_id=*/0));
+ EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
+ /*document_id=*/0, fake_clock_.GetSystemTimeMilliseconds()));
}
TEST_F(DocumentStoreTest, DeleteClearsFilterCache) {
@@ -1920,15 +1950,18 @@ TEST_F(DocumentStoreTest, DeleteClearsFilterCache) {
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id));
+ doc_store->GetAliveDocumentFilterData(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data,
Eq(DocumentFilterData(
/*namespace_id=*/0,
/*schema_type_id=*/0, document1_expiration_timestamp_)));
- ICING_ASSERT_OK(doc_store->Delete("icing", "email/1"));
+ ICING_ASSERT_OK(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()));
// Associated entry of the deleted document is removed.
- EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(document_id));
+ EXPECT_FALSE(doc_store->GetAliveDocumentFilterData(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
}
TEST_F(DocumentStoreTest, DeleteClearsScoreCache) {
@@ -1949,10 +1982,15 @@ TEST_F(DocumentStoreTest, DeleteClearsScoreCache) {
/*creation_timestamp_ms=*/document1_creation_timestamp_,
/*length_in_tokens=*/4)));
- ICING_ASSERT_OK(doc_store->Delete("icing", "email/1"));
+ ICING_ASSERT_OK(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()));
// Associated entry of the deleted document is removed.
- EXPECT_THAT(doc_store->GetDocumentAssociatedScoreData(document_id),
- StatusIs(libtextclassifier3::StatusCode::NOT_FOUND));
+ EXPECT_THAT(
+ doc_store->GetDocumentAssociatedScoreData(document_id),
+ IsOkAndHolds(DocumentAssociatedScoreData(kInvalidCorpusId,
+ /*document_score=*/-1,
+ /*creation_timestamp_ms=*/-1,
+ /*length_in_tokens=*/0)));
}
TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) {
@@ -1974,12 +2012,15 @@ TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) {
UsageStore::UsageScores expected_scores;
expected_scores.usage_type1_count = 1;
- ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores,
- doc_store->GetUsageScores(document_id));
+ ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
+ UsageStore::UsageScores actual_scores,
+ doc_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Delete the document.
- ICING_ASSERT_OK(doc_store->Delete("icing", "email/1"));
+ ICING_ASSERT_OK(doc_store->Delete("icing", "email/1",
+ fake_clock_.GetSystemTimeMilliseconds()));
// Can't report or get usage scores on the deleted document
ASSERT_THAT(
@@ -1987,7 +2028,8 @@ TEST_F(DocumentStoreTest, DeleteShouldPreventUsageScores) {
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND,
HasSubstr("Couldn't report usage on a nonexistent document")));
- EXPECT_FALSE(doc_store->GetUsageScores(document_id));
+ EXPECT_FALSE(doc_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
}
TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) {
@@ -2021,8 +2063,10 @@ TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) {
UsageStore::UsageScores expected_scores;
expected_scores.usage_type1_count = 1;
- ICING_ASSERT_HAS_VALUE_AND_ASSIGN(UsageStore::UsageScores actual_scores,
- doc_store->GetUsageScores(document_id));
+ ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
+ UsageStore::UsageScores actual_scores,
+ doc_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Some arbitrary time past the document's creation time (10) + ttl (100)
@@ -2034,7 +2078,8 @@ TEST_F(DocumentStoreTest, ExpirationShouldPreventUsageScores) {
StatusIs(libtextclassifier3::StatusCode::NOT_FOUND,
HasSubstr("Couldn't report usage on a nonexistent document")));
- EXPECT_FALSE(doc_store->GetUsageScores(document_id));
+ EXPECT_FALSE(doc_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
}
TEST_F(DocumentStoreTest,
@@ -2056,7 +2101,8 @@ TEST_F(DocumentStoreTest,
ICING_ASSERT_OK_AND_ASSIGN(DocumentId document_id, doc_store->Put(document));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id));
+ doc_store->GetAliveDocumentFilterData(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(doc_filter_data, Eq(DocumentFilterData(
/*namespace_id=*/0,
/*schema_type_id=*/0,
@@ -2082,7 +2128,8 @@ TEST_F(DocumentStoreTest, ExpirationTimestampIsInt64MaxIfTtlIsZero) {
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id));
+ doc_store->GetAliveDocumentFilterData(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(
doc_filter_data,
@@ -2112,7 +2159,8 @@ TEST_F(DocumentStoreTest, ExpirationTimestampIsInt64MaxOnOverflow) {
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData doc_filter_data,
- doc_store->GetAliveDocumentFilterData(document_id));
+ doc_store->GetAliveDocumentFilterData(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(
doc_filter_data,
@@ -2318,7 +2366,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) {
IsOkAndHolds(EqualsProto(email_document)));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(email_schema_type_id));
email_namespace_id = email_data.namespace_id();
email_expiration_timestamp = email_data.expiration_timestamp_ms();
@@ -2331,7 +2380,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) {
IsOkAndHolds(EqualsProto(message_document)));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(message_schema_type_id));
message_namespace_id = message_data.namespace_id();
message_expiration_timestamp = message_data.expiration_timestamp_ms();
@@ -2373,7 +2423,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) {
IsOkAndHolds(EqualsProto(email_document)));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(email_schema_type_id));
// Make sure that all the other fields are stll valid/the same
EXPECT_THAT(email_data.namespace_id(), Eq(email_namespace_id));
@@ -2385,7 +2436,8 @@ TEST_F(DocumentStoreTest, RegenerateDerivedFilesSkipsUnknownSchemaTypeIds) {
IsOkAndHolds(EqualsProto(message_document)));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(-1));
// Make sure that all the other fields are stll valid/the same
EXPECT_THAT(message_data.namespace_id(), Eq(message_namespace_id));
@@ -2441,14 +2493,16 @@ TEST_F(DocumentStoreTest, UpdateSchemaStoreUpdatesSchemaTypeIds) {
document_store->Put(email_document));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(old_email_schema_type_id));
ICING_ASSERT_OK_AND_ASSIGN(DocumentId message_document_id,
document_store->Put(message_document));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(old_message_schema_type_id));
// Rearrange the schema types. Since SchemaTypeId is assigned based on order,
@@ -2476,12 +2530,14 @@ TEST_F(DocumentStoreTest, UpdateSchemaStoreUpdatesSchemaTypeIds) {
// Check that the FilterCache holds the new SchemaTypeIds
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(new_email_schema_type_id));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(new_message_schema_type_id));
}
@@ -2683,14 +2739,16 @@ TEST_F(DocumentStoreTest, OptimizedUpdateSchemaStoreUpdatesSchemaTypeIds) {
document_store->Put(email_document));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(old_email_schema_type_id));
ICING_ASSERT_OK_AND_ASSIGN(DocumentId message_document_id,
document_store->Put(message_document));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(old_message_schema_type_id));
// Rearrange the schema types. Since SchemaTypeId is assigned based on order,
@@ -2721,12 +2779,14 @@ TEST_F(DocumentStoreTest, OptimizedUpdateSchemaStoreUpdatesSchemaTypeIds) {
// Check that the FilterCache holds the new SchemaTypeIds
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
email_data,
- document_store->GetAliveDocumentFilterData(email_document_id));
+ document_store->GetAliveDocumentFilterData(
+ email_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(email_data.schema_type_id(), Eq(new_email_schema_type_id));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
message_data,
- document_store->GetAliveDocumentFilterData(message_document_id));
+ document_store->GetAliveDocumentFilterData(
+ message_document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(message_data.schema_type_id(), Eq(new_message_schema_type_id));
}
@@ -2909,8 +2969,9 @@ TEST_F(DocumentStoreTest, GetOptimizeInfo) {
EXPECT_THAT(optimize_info.estimated_optimizable_bytes, Eq(0));
// Delete a document. Now something is optimizable
- ICING_EXPECT_OK(document_store->Delete(test_document1_.namespace_(),
- test_document1_.uri()));
+ ICING_EXPECT_OK(document_store->Delete(
+ test_document1_.namespace_(), test_document1_.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
ICING_ASSERT_OK_AND_ASSIGN(optimize_info, document_store->GetOptimizeInfo());
EXPECT_THAT(optimize_info.total_docs, Eq(1));
EXPECT_THAT(optimize_info.optimizable_docs, Eq(1));
@@ -2990,13 +3051,15 @@ TEST_F(DocumentStoreTest, GetAllNamespaces) {
// After deleting namespace2_uri1, there's still namespace2_uri2, so
// "namespace2" still shows up in results
- ICING_EXPECT_OK(document_store->Delete("namespace2", "uri1"));
+ ICING_EXPECT_OK(document_store->Delete(
+ "namespace2", "uri1", fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(document_store->GetAllNamespaces(),
UnorderedElementsAre("namespace1", "namespace2", "namespace3"));
// After deleting namespace2_uri2, there's no more documents in "namespace2"
- ICING_EXPECT_OK(document_store->Delete("namespace2", "uri2"));
+ ICING_EXPECT_OK(document_store->Delete(
+ "namespace2", "uri2", fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(document_store->GetAllNamespaces(),
UnorderedElementsAre("namespace1", "namespace3"));
@@ -3030,7 +3093,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 1 and time 5, time should be updated.
@@ -3042,7 +3106,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
expected_scores.usage_type1_last_used_timestamp_s = 5;
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 2 and time 1.
@@ -3054,7 +3119,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
expected_scores.usage_type2_last_used_timestamp_s = 1;
++expected_scores.usage_type2_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 2 and time 5.
@@ -3066,7 +3132,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
expected_scores.usage_type2_last_used_timestamp_s = 5;
++expected_scores.usage_type2_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 3 and time 1.
@@ -3078,7 +3145,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
expected_scores.usage_type3_last_used_timestamp_s = 1;
++expected_scores.usage_type3_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 3 and time 5.
@@ -3090,7 +3158,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTimestampsAndGetUsageScores) {
expected_scores.usage_type3_last_used_timestamp_s = 5;
++expected_scores.usage_type3_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3115,7 +3184,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 2.
@@ -3126,7 +3196,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) {
++expected_scores.usage_type2_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Report usage with type 3.
@@ -3137,7 +3208,8 @@ TEST_F(DocumentStoreTest, ReportUsageWithDifferentTypesAndGetUsageScores) {
++expected_scores.usage_type3_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(document_id));
+ actual_scores, document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3164,7 +3236,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldNotBeClearedOnChecksumMismatch) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3180,7 +3253,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldNotBeClearedOnChecksumMismatch) {
// Usage scores should be the same.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3207,7 +3281,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeAvailableAfterDataLoss) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(
+ document_id, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3234,7 +3309,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeAvailableAfterDataLoss) {
// Usage scores should still be available.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3260,7 +3336,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeCopiedOverToUpdatedDocument) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id));
+ document_store->GetUsageScores(document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Update the document.
@@ -3272,7 +3349,9 @@ TEST_F(DocumentStoreTest, UsageScoresShouldBeCopiedOverToUpdatedDocument) {
// Usage scores should be the same.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
- actual_scores, document_store->GetUsageScores(updated_document_id));
+ actual_scores,
+ document_store->GetUsageScores(updated_document_id,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3290,7 +3369,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) {
ICING_ASSERT_OK_AND_ASSIGN(
DocumentId document_id2,
document_store->Put(DocumentProto(test_document2_)));
- ICING_ASSERT_OK(document_store->Delete(document_id1));
+ ICING_ASSERT_OK(document_store->Delete(
+ document_id1, fake_clock_.GetSystemTimeMilliseconds()));
// Report usage of document 2.
UsageReport usage_report = CreateUsageReport(
@@ -3302,7 +3382,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) {
++expected_scores.usage_type1_count;
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
UsageStore::UsageScores actual_scores,
- document_store->GetUsageScores(document_id2));
+ document_store->GetUsageScores(document_id2,
+ fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
// Run optimize
@@ -3323,7 +3404,8 @@ TEST_F(DocumentStoreTest, UsageScoresShouldPersistOnOptimize) {
// The original document_id2 should have become document_id2 - 1.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
actual_scores,
- optimized_document_store->GetUsageScores(document_id2 - 1));
+ optimized_document_store->GetUsageScores(
+ document_id2 - 1, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(actual_scores, Eq(expected_scores));
}
@@ -3542,7 +3624,8 @@ TEST_F(DocumentStoreTest, DocumentStoreStorageInfo) {
ICING_ASSERT_OK(doc_store->ReportUsage(usage_report_type1));
// Delete the first doc.
- ICING_ASSERT_OK(doc_store->Delete(document1.namespace_(), document1.uri()));
+ ICING_ASSERT_OK(doc_store->Delete(document1.namespace_(), document1.uri(),
+ fake_clock_.GetSystemTimeMilliseconds()));
// Expire the second doc.
fake_clock_.SetSystemTimeMilliseconds(document2.creation_timestamp_ms() +
@@ -3649,7 +3732,8 @@ TEST_F(DocumentStoreTest, InitializeForceRecoveryUpdatesTypeIds) {
ICING_ASSERT_OK_AND_ASSIGN(docid, doc_store->Put(doc));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData filter_data,
- doc_store->GetAliveDocumentFilterData(docid));
+ doc_store->GetAliveDocumentFilterData(
+ docid, fake_clock_.GetSystemTimeMilliseconds()));
ASSERT_THAT(filter_data.schema_type_id(), Eq(0));
}
@@ -3697,7 +3781,8 @@ TEST_F(DocumentStoreTest, InitializeForceRecoveryUpdatesTypeIds) {
// Ensure that the type id of the email document has been correctly updated.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData filter_data,
- doc_store->GetAliveDocumentFilterData(docid));
+ doc_store->GetAliveDocumentFilterData(
+ docid, fake_clock_.GetSystemTimeMilliseconds()));
EXPECT_THAT(filter_data.schema_type_id(), Eq(1));
EXPECT_THAT(initialize_stats.document_store_recovery_cause(),
Eq(InitializeStatsProto::SCHEMA_CHANGES_OUT_OF_SYNC));
@@ -3758,7 +3843,8 @@ TEST_F(DocumentStoreTest, InitializeDontForceRecoveryDoesntUpdateTypeIds) {
ICING_ASSERT_OK_AND_ASSIGN(docid, doc_store->Put(doc));
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData filter_data,
- doc_store->GetAliveDocumentFilterData(docid));
+ doc_store->GetAliveDocumentFilterData(
+ docid, fake_clock_.GetSystemTimeMilliseconds()));
ASSERT_THAT(filter_data.schema_type_id(), Eq(0));
}
@@ -3800,7 +3886,8 @@ TEST_F(DocumentStoreTest, InitializeDontForceRecoveryDoesntUpdateTypeIds) {
// Check that the type id of the email document has not been updated.
ICING_ASSERT_HAS_VALUE_AND_ASSIGN(
DocumentFilterData filter_data,
- doc_store->GetAliveDocumentFilterData(docid));
+ doc_store->GetAliveDocumentFilterData(
+ docid, fake_clock_.GetSystemTimeMilliseconds()));
ASSERT_THAT(filter_data.schema_type_id(), Eq(0));
}
}
@@ -4256,7 +4343,8 @@ TEST_F(DocumentStoreTest, GetDebugInfo) {
EqualsProto(info3)));
// Delete document3.
- ICING_ASSERT_OK(document_store->Delete("namespace2", "email/3"));
+ ICING_ASSERT_OK(document_store->Delete(
+ "namespace2", "email/3", fake_clock_.GetSystemTimeMilliseconds()));
ICING_ASSERT_OK_AND_ASSIGN(
DocumentDebugInfoProto out2,
document_store->GetDebugInfo(DebugInfoVerbosity::DETAILED));
diff --git a/icing/store/suggestion-result-checker-impl.h b/icing/store/suggestion-result-checker-impl.h
index f6789e8..4e01f81 100644
--- a/icing/store/suggestion-result-checker-impl.h
+++ b/icing/store/suggestion-result-checker-impl.h
@@ -33,7 +33,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker {
document_id_filter_map,
std::unordered_set<SchemaTypeId> target_schema_type_ids,
std::unordered_map<SchemaTypeId, SectionIdMask> property_filter_map,
- std::string target_section, std::unordered_set<DocumentId> search_base)
+ std::string target_section, std::unordered_set<DocumentId> search_base,
+ int64_t current_time_ms)
: document_store_(*document_store),
schema_store_(*schema_store),
target_namespace_ids_(std::move(target_namespace_ids)),
@@ -41,7 +42,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker {
target_schema_type_ids_(std::move(target_schema_type_ids)),
property_filter_map_(std::move(property_filter_map)),
target_section_(std::move(target_section)),
- search_base_(std::move(search_base)) {}
+ search_base_(std::move(search_base)),
+ current_time_ms_(current_time_ms) {}
bool MatchesTargetNamespace(NamespaceId namespace_id) const {
return target_namespace_ids_.empty() ||
@@ -102,7 +104,8 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker {
SectionId section_id) const override {
// Get the document filter data first.
auto document_filter_data_optional_ =
- document_store_.GetAliveDocumentFilterData(document_id);
+ document_store_.GetAliveDocumentFilterData(document_id,
+ current_time_ms_);
if (!document_filter_data_optional_) {
// The document doesn't exist.
return false;
@@ -142,6 +145,7 @@ class SuggestionResultCheckerImpl : public SuggestionResultChecker {
std::unordered_map<SchemaTypeId, SectionIdMask> property_filter_map_;
std::string target_section_;
std::unordered_set<DocumentId> search_base_;
+ int64_t current_time_ms_;
};
} // namespace lib