diff --git a/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcExistingVectorItemRepository.java b/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcExistingVectorItemRepository.java index 5ca34abb..9e457171 100644 --- a/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcExistingVectorItemRepository.java +++ b/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcExistingVectorItemRepository.java @@ -81,12 +81,7 @@ public List findByVectorItemIds(Collection vectorItemIds) { return jdbcTemplate.query(""" SELECT id, object_type, object_id, chunk_index, text, embedding, metadata, created_at FROM tb_ai_document_chunk - WHERE """ + jsonText(null, "chunkId") + """ - IN (:ids) - OR """ + rowVectorItemId("id") + """ - IN (:ids) - OR """ + jsonText(null, "documentId") + """ - IN (:ids) + """ + JdbcVectorProjectionSql.vectorItemIdMatchClause(postgres) + """ ORDER BY object_type, object_id, chunk_index, id """, new MapSqlParameterSource("ids", ids), rowMapper); } diff --git a/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSql.java b/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSql.java index 8315a461..208cf226 100644 --- a/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSql.java +++ b/starter/studio-platform-starter-ai/src/main/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSql.java @@ -52,4 +52,10 @@ static String orderByDisplayOrder(boolean postgres) { static String orderByDisplayOrderClause(boolean postgres) { return " ORDER BY " + orderByDisplayOrder(postgres); } + + static String vectorItemIdMatchClause(boolean postgres) { + return " WHERE " + jsonText(null, "chunkId", postgres) + " IN (:ids)" + + " OR " + rowVectorItemId("id", postgres) + " IN (:ids)" + + " OR " + jsonText(null, "documentId", postgres) + " IN (:ids)"; + } } diff --git a/starter/studio-platform-starter-ai/src/test/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSqlTest.java b/starter/studio-platform-starter-ai/src/test/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSqlTest.java index a100a6c7..310bbf5f 100644 --- a/starter/studio-platform-starter-ai/src/test/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSqlTest.java +++ b/starter/studio-platform-starter-ai/src/test/java/studio/one/platform/ai/service/visualization/JdbcVectorProjectionSqlTest.java @@ -37,4 +37,12 @@ void orderByDisplayOrderClauseKeepsSpaceAfterOrderBy() { assertThat("WHERE p.projection_id = :projectionId" + JdbcVectorProjectionSql.orderByDisplayOrderClause(true)) .contains(" ORDER BY p.display_order"); } + + @Test + void vectorItemIdMatchClauseKeepsSpacesAroundWhereInAndOr() { + assertThat(JdbcVectorProjectionSql.vectorItemIdMatchClause(true)) + .isEqualTo(" WHERE metadata ->> 'chunkId' IN (:ids)" + + " OR 'row-' || id IN (:ids)" + + " OR metadata ->> 'documentId' IN (:ids)"); + } }