From 7b2d4ce6adb31b41165f517352717d204e8aadec Mon Sep 17 00:00:00 2001 From: Manoj Date: Mon, 15 Sep 2025 18:35:00 +0530 Subject: [PATCH] feat: add includeInvalidated option to search queries to optionally show invalidated statements --- apps/webapp/app/services/search/utils.ts | 27 ++++++++++++------------ 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/apps/webapp/app/services/search/utils.ts b/apps/webapp/app/services/search/utils.ts index d222884..a63debe 100644 --- a/apps/webapp/app/services/search/utils.ts +++ b/apps/webapp/app/services/search/utils.ts @@ -18,15 +18,15 @@ export async function performBM25Search( // Build the WHERE clause based on timeframe options let timeframeCondition = ` - AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + AND s.validAt <= $validAt + ${options.includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} `; // If startTime is provided, add condition to filter by validAt >= startTime if (options.startTime) { timeframeCondition = ` - AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + AND s.validAt <= $validAt + ${options.includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} AND s.validAt >= $startTime `; } @@ -108,15 +108,15 @@ export async function performVectorSearch( try { // Build the WHERE clause based on timeframe options let timeframeCondition = ` - AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + AND s.validAt <= $validAt + ${options.includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} `; // If startTime is provided, add condition to filter by validAt >= startTime if (options.startTime) { timeframeCondition = ` - AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + AND s.validAt <= $validAt + ${options.includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} AND s.validAt >= $startTime `; } @@ -135,7 +135,7 @@ export async function performVectorSearch( YIELD node AS s, score WHERE s.userId = $userId AND score >= 0.7 - ${timeframeCondition.replace("AND", "AND").replace("WHERE", "AND")} + ${timeframeCondition} ${spaceCondition} OPTIONAL MATCH (episode:Episode)-[:HAS_PROVENANCE]->(s) WITH s, score, count(episode) as provenanceCount @@ -219,14 +219,14 @@ export async function bfsTraversal( // Build the WHERE clause based on timeframe options let timeframeCondition = ` AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + ${includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} `; // If startTime is provided, add condition to filter by validAt >= startTime if (startTime) { timeframeCondition = ` AND s.validAt <= $validAt - AND (s.invalidAt > $validAt) + ${includeInvalidated ? '' : 'AND (s.invalidAt IS NULL OR s.invalidAt > $validAt)'} AND s.validAt >= $startTime `; } @@ -243,10 +243,9 @@ export async function bfsTraversal( // This query implements BFS up to maxDepth and collects all statements along the way const cypher = ` MATCH (e:Entity {uuid: $startEntityId})<-[:HAS_SUBJECT|HAS_OBJECT|HAS_PREDICATE]-(s:Statement) - WHERE + WHERE (s.userId = $userId) - AND ($includeInvalidated OR s.invalidAt IS NULL) - ${timeframeCondition} + ${includeInvalidated ? 'AND s.validAt <= $validAt' : timeframeCondition} ${spaceCondition} RETURN s as statement `;