Skip to content

Commit 663cdb6

Browse files
Test coverage for search embeddings cache: repository and service layer (#1593)
* Prepared repository testss plumbing for search cache * Richer embeddings cache test suite * Tests for EmbeddingsProvider logic * changelog
1 parent b547536 commit 663cdb6

47 files changed

Lines changed: 1818 additions & 30 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ Recommendation: for ease of reading, use the following order:
1111
- Fixed
1212
-->
1313

14+
## [Unreleased]
15+
### Changed
16+
- Test coverage for search embeddings cache: repository and service layer
17+
1418
## [0.259.1] - 2026-02-12
1519
### Fixed
1620
- Sync odf schema to accept odf format

Cargo.lock

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ members = [
8282
"src/infra/search/openai",
8383
"src/infra/search/elasticsearch",
8484
"src/infra/search/elasticsearch-macros",
85-
"src/infra/search/cache/inmem",
86-
"src/infra/search/cache/postgres",
87-
"src/infra/search/cache/sqlite",
85+
"src/infra/search/cache-repo-tests",
86+
"src/infra/search/cache-inmem",
87+
"src/infra/search/cache-postgres",
88+
"src/infra/search/cache-sqlite",
8889
## Task System
8990
"src/infra/task-system/repo-tests",
9091
"src/infra/task-system/inmem",
@@ -232,9 +233,10 @@ kamu-datasets-repo-tests = { version = "0.259.1", path = "src/infra/datasets/rep
232233
kamu-search-openai = { version = "0.259.1", path = "src/infra/search/openai", default-features = false }
233234
kamu-search-elasticsearch = { version = "0.259.1", path = "src/infra/search/elasticsearch", default-features = false }
234235
kamu-search-elasticsearch-macros = { version = "0.259.1", path = "src/infra/search/elasticsearch-macros", default-features = false }
235-
kamu-search-cache-inmem = { version = "0.259.1", path = "src/infra/search/cache/inmem", default-features = false }
236-
kamu-search-cache-postgres = { version = "0.259.1", path = "src/infra/search/cache/postgres", default-features = false }
237-
kamu-search-cache-sqlite = { version = "0.259.1", path = "src/infra/search/cache/sqlite", default-features = false }
236+
kamu-search-cache-inmem = { version = "0.259.1", path = "src/infra/search/cache-inmem", default-features = false }
237+
kamu-search-cache-postgres = { version = "0.259.1", path = "src/infra/search/cache-postgres", default-features = false }
238+
kamu-search-cache-sqlite = { version = "0.259.1", path = "src/infra/search/cache-sqlite", default-features = false }
239+
kamu-search-cache-repo-tests = { version = "0.259.1", path = "src/infra/search/cache-repo-tests", default-features = false }
238240
## Task System
239241
kamu-task-system-inmem = { version = "0.259.1", path = "src/infra/task-system/inmem", default-features = false }
240242
kamu-task-system-postgres = { version = "0.259.1", path = "src/infra/task-system/postgres", default-features = false }

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ POSTGRES_CRATES := \
1111
./src/infra/datasets/postgres \
1212
./src/infra/flow-system/postgres \
1313
./src/infra/messaging-outbox/postgres \
14-
./src/infra/search/cache/postgres \
14+
./src/infra/search/cache-postgres \
1515
./src/infra/task-system/postgres \
1616
./src/infra/webhooks/postgres
1717

@@ -27,7 +27,7 @@ SQLITE_CRATES := \
2727
./src/infra/datasets/sqlite \
2828
./src/infra/flow-system/sqlite \
2929
./src/infra/messaging-outbox/sqlite \
30-
./src/infra/search/cache/sqlite \
30+
./src/infra/search/cache-sqlite \
3131
./src/infra/task-system/sqlite \
3232
./src/infra/webhooks/sqlite
3333

resources/di.puml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,7 @@ class "WsSmartTransferProtocolClient"
890890
"EmbeddingsProviderImpl" --> "EmbeddingsCacheRepository"
891891
"EmbeddingsProviderImpl" --> "EmbeddingsChunker"
892892
"EmbeddingsProviderImpl" --> "EmbeddingsEncoder"
893+
"EmbeddingsProviderImpl" --> "SystemTimeSource"
893894
"TaskEventStore" <|-- "SqliteTaskEventStore"
894895
"SqliteTaskEventStore" --> "TransactionRefT"
895896
"WebhookDeliveryRepository" <|-- "SqliteWebhookDeliveryRepository"

src/domain/search/services/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ internal-error = { workspace = true }
3434
kamu-core = { workspace = true }
3535
kamu-search = { workspace = true }
3636
odf = { workspace = true }
37+
time-source = { workspace = true }
3738

3839
chrono = { version = "0.4", default-features = false }
3940
dill = { version = "0.15", default-features = false }
@@ -47,3 +48,8 @@ tracing = { version = "0.1", default-features = false }
4748
tokio = { version = "1", default-features = false }
4849

4950
[dev-dependencies]
51+
kamu-search-cache-inmem = { workspace = true }
52+
time-source = { workspace = true }
53+
54+
test-log = { version = "0.2", features = ["trace"] }
55+
tokio = { version = "1", default-features = false, features = ["rt", "macros"] }

src/domain/search/services/src/embeddings_provider_impl.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
use std::collections::HashMap;
1111
use std::sync::Arc;
1212

13-
use chrono::Utc;
1413
use internal_error::*;
1514
use kamu_search::*;
15+
use time_source::SystemTimeSource;
1616
use tokio::sync::OnceCell;
1717

1818
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -21,6 +21,7 @@ pub struct EmbeddingsProviderImpl {
2121
embeddings_chunker: Arc<dyn EmbeddingsChunker>,
2222
embeddings_encoder: Arc<dyn EmbeddingsEncoder>,
2323
embeddings_cache_repo: Arc<dyn EmbeddingsCacheRepository>,
24+
time_source: Arc<dyn SystemTimeSource>,
2425
cached_model: OnceCell<EmbeddingModelRow>,
2526
}
2627

@@ -34,11 +35,13 @@ impl EmbeddingsProviderImpl {
3435
embeddings_chunker: Arc<dyn EmbeddingsChunker>,
3536
embeddings_encoder: Arc<dyn EmbeddingsEncoder>,
3637
embeddings_cache_repo: Arc<dyn EmbeddingsCacheRepository>,
38+
time_source: Arc<dyn SystemTimeSource>,
3739
) -> Self {
3840
Self {
3941
embeddings_chunker,
4042
embeddings_encoder,
4143
embeddings_cache_repo,
44+
time_source,
4245
cached_model: OnceCell::new(),
4346
}
4447
}
@@ -145,12 +148,18 @@ impl EmbeddingsProvider for EmbeddingsProviderImpl {
145148

146149
tracing::debug!(chunk_count = chunks.len(), "Content chunking completed");
147150

148-
// 3) Normalize chunks
151+
// 3) Normalize chunks and filter out empty ones
149152
let normalized_chunks: Vec<String> = chunks
150153
.iter()
151154
.map(|s| Self::normalize_input_chunk(s))
155+
.filter(|s| !s.is_empty())
152156
.collect();
153157

158+
if normalized_chunks.is_empty() {
159+
tracing::warn!("No non-empty chunks after normalization");
160+
return Ok(vec![]);
161+
}
162+
154163
tracing::debug!(
155164
normalized_chunk_count = normalized_chunks.len(),
156165
"Chunk normalization completed"
@@ -232,7 +241,7 @@ impl EmbeddingsProvider for EmbeddingsProviderImpl {
232241

233242
// 8) Touch stats
234243
self.embeddings_cache_repo
235-
.touch_embeddings(&cache_keys, Utc::now())
244+
.touch_embeddings(&cache_keys, self.time_source.now())
236245
.await
237246
.int_err()?;
238247

@@ -320,7 +329,7 @@ impl EmbeddingsProvider for EmbeddingsProviderImpl {
320329

321330
// 6) Touch stats
322331
self.embeddings_cache_repo
323-
.touch_embeddings(&[cache_key], Utc::now())
332+
.touch_embeddings(&[cache_key], self.time_source.now())
324333
.await
325334
.int_err()?;
326335

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright Kamu Data, Inc. and contributors. All rights reserved.
2+
//
3+
// Use of this software is governed by the Business Source License
4+
// included in the LICENSE file.
5+
//
6+
// As of the Change Date specified in that file, in accordance with
7+
// the Business Source License, use of this software will be governed
8+
// by the Apache License, Version 2.0.
9+
10+
mod tests;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright Kamu Data, Inc. and contributors. All rights reserved.
2+
//
3+
// Use of this software is governed by the Business Source License
4+
// included in the LICENSE file.
5+
//
6+
// As of the Change Date specified in that file, in accordance with
7+
// the Business Source License, use of this software will be governed
8+
// by the Apache License, Version 2.0.
9+
10+
mod test_embeddings_provider_impl;

0 commit comments

Comments
 (0)