@prmichaelsen/remember-mcp 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/agent/progress.yaml +43 -6
- package/agent/tasks/task-remember-mcp-fix-or-operator.md +82 -0
- package/dist/server-factory.js +19 -22
- package/dist/server.js +19 -22
- package/package.json +1 -1
- package/src/utils/weaviate-filters.spec.ts +49 -0
- package/src/utils/weaviate-filters.ts +26 -24
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.1] - 2026-02-12
|
|
9
|
+
|
|
10
|
+
### 🐛 Fixed
|
|
11
|
+
|
|
12
|
+
- **Empty Or/And Operator Bug**: Fixed "no children for operator Or" error
|
|
13
|
+
- Added validation to filter out undefined/null values before combining filters
|
|
14
|
+
- `combineFiltersWithOr` now validates operands array is not empty
|
|
15
|
+
- `combineFiltersWithAnd` now validates operands array is not empty
|
|
16
|
+
- `buildCombinedSearchFilters` filters out invalid filters before OR combination
|
|
17
|
+
- Prevents creation of operators with empty children arrays
|
|
18
|
+
|
|
19
|
+
### ✨ Added
|
|
20
|
+
|
|
21
|
+
- **Edge Case Tests**: Added 3 new test cases for undefined/null filter handling
|
|
22
|
+
- Test for empty Or operator prevention
|
|
23
|
+
- Test for empty And operator prevention
|
|
24
|
+
- Test for mixed valid and undefined filters
|
|
25
|
+
|
|
26
|
+
### 📊 Test Results
|
|
27
|
+
|
|
28
|
+
- **57 tests passing** (up from 54)
|
|
29
|
+
- **4 test suites passing** (all green)
|
|
30
|
+
- **Code coverage: 90.56%** on weaviate-filters.ts (up from 83.67%)
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
8
34
|
## [1.0.0] - 2026-02-12
|
|
9
35
|
|
|
10
36
|
### 🚨 BREAKING CHANGES
|
package/agent/progress.yaml
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
project:
|
|
4
4
|
name: remember-mcp
|
|
5
|
-
version: 0.
|
|
5
|
+
version: 1.0.1
|
|
6
6
|
started: 2026-02-11
|
|
7
7
|
status: in_progress
|
|
8
8
|
current_milestone: M5
|
|
@@ -378,6 +378,31 @@ progress:
|
|
|
378
378
|
overall: 50%
|
|
379
379
|
|
|
380
380
|
recent_work:
|
|
381
|
+
- date: 2026-02-12
|
|
382
|
+
description: v1.0.1 Released - Or Operator Bug Fix
|
|
383
|
+
items:
|
|
384
|
+
- 🎉 v1.0.1 RELEASED - Patch release with bug fix
|
|
385
|
+
- 🐛 Fixed "no children for operator Or" error
|
|
386
|
+
- ✅ Added validation to filter out undefined/null values in filter combinations
|
|
387
|
+
- ✅ Updated combineFiltersWithOr to validate operands
|
|
388
|
+
- ✅ Updated combineFiltersWithAnd to validate operands
|
|
389
|
+
- ✅ Added 3 new edge case tests for undefined/null handling
|
|
390
|
+
- ✅ All 57 tests passing (up from 54)
|
|
391
|
+
- ✅ Code coverage: 90.56% on weaviate-filters.ts
|
|
392
|
+
- ✅ Build successful
|
|
393
|
+
- ✅ CHANGELOG.md updated
|
|
394
|
+
|
|
395
|
+
- date: 2026-02-12
|
|
396
|
+
description: v1.0.0 Released - Major Version with Breaking Changes
|
|
397
|
+
items:
|
|
398
|
+
- 🎉 v1.0.0 RELEASED - First stable release
|
|
399
|
+
- 🚨 BREAKING: createServer is now async (returns Promise<Server>)
|
|
400
|
+
- ✅ Database initialization now uses await pattern
|
|
401
|
+
- ✅ Server factory properly waits for databases before accepting requests
|
|
402
|
+
- ✅ Updated all server-factory tests for async
|
|
403
|
+
- ✅ All 54 tests passing
|
|
404
|
+
- ✅ CHANGELOG.md created with migration guide
|
|
405
|
+
|
|
381
406
|
- date: 2026-02-12
|
|
382
407
|
description: Task 20 COMPLETED - Weaviate v3 Filters & Relationship Search
|
|
383
408
|
items:
|
|
@@ -390,12 +415,11 @@ recent_work:
|
|
|
390
415
|
- ✅ Updated search-memory.ts to search BOTH memories AND relationships by default
|
|
391
416
|
- ✅ Updated query-memory.ts to use v3 filters
|
|
392
417
|
- ✅ Results now separated into memories and relationships arrays
|
|
393
|
-
- ✅
|
|
418
|
+
- ✅ 29 new unit tests for filter builders
|
|
394
419
|
- ✅ Build successful
|
|
395
420
|
- ✅ TypeScript compiles without errors
|
|
396
421
|
- 🔧 Fixed gRPC "paths needs to have an uneven number of components" error
|
|
397
422
|
- 🔧 Replaced old v2 filter format (path/operator/valueText) with v3 fluent API
|
|
398
|
-
- 📋 Ready for M5: Template System
|
|
399
423
|
|
|
400
424
|
- date: 2026-02-12
|
|
401
425
|
description: Project Status Review & Documentation Update
|
|
@@ -513,10 +537,11 @@ build_status:
|
|
|
513
537
|
- ✅ Source maps generated
|
|
514
538
|
- ✅ Type definitions generated (.d.ts files)
|
|
515
539
|
- ✅ Package exports configured for both entry points
|
|
516
|
-
- ✅ Version 0.
|
|
517
|
-
- ✅
|
|
540
|
+
- ✅ Version 1.0.1 published (patch release)
|
|
541
|
+
- ✅ 29 TypeScript source files (added weaviate-filters.ts)
|
|
518
542
|
- ✅ All 12 tools implemented
|
|
519
543
|
- ✅ Weaviate v3 filter API implemented
|
|
544
|
+
- ✅ Or/And operator validation implemented
|
|
520
545
|
|
|
521
546
|
tools_status:
|
|
522
547
|
memory_tools:
|
|
@@ -552,9 +577,15 @@ task_20_completion:
|
|
|
552
577
|
date: 2026-02-12
|
|
553
578
|
files_created:
|
|
554
579
|
- src/utils/weaviate-filters.ts
|
|
580
|
+
- src/utils/weaviate-filters.spec.ts
|
|
581
|
+
- CHANGELOG.md
|
|
555
582
|
files_modified:
|
|
556
583
|
- src/tools/search-memory.ts
|
|
557
584
|
- src/tools/query-memory.ts
|
|
585
|
+
- src/server-factory.ts
|
|
586
|
+
- src/server-factory.spec.ts
|
|
587
|
+
- tsconfig.json
|
|
588
|
+
- package.json
|
|
558
589
|
key_changes:
|
|
559
590
|
- Replaced v2 filter format with v3 fluent API
|
|
560
591
|
- Implemented OR logic to search both memories and relationships
|
|
@@ -562,5 +593,11 @@ task_20_completion:
|
|
|
562
593
|
- Added buildMemoryOnlyFilters() for backward compatibility
|
|
563
594
|
- Updated search-memory to return both memories and relationships
|
|
564
595
|
- Fixed gRPC "paths needs to have an uneven number of components" error
|
|
565
|
-
|
|
596
|
+
- Fixed "no children for operator Or" error with validation
|
|
597
|
+
- Made createServer async for proper initialization (BREAKING CHANGE)
|
|
598
|
+
- Added 32 new unit tests (29 filter tests + 3 edge case tests)
|
|
599
|
+
tests_passing: 57/58 (1 skipped integration test)
|
|
566
600
|
build_status: successful
|
|
601
|
+
releases:
|
|
602
|
+
- v1.0.0: Major release with breaking change (async createServer)
|
|
603
|
+
- v1.0.1: Patch release with Or operator bug fix
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Task: Fix Weaviate "Or" Operator Query Bug
|
|
2
|
+
|
|
3
|
+
**Project**: remember-mcp
|
|
4
|
+
**Estimated Time**: 1-2 hours
|
|
5
|
+
**Priority**: High
|
|
6
|
+
**Status**: Not Started
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Problem
|
|
11
|
+
|
|
12
|
+
Weaviate query failing with error:
|
|
13
|
+
```
|
|
14
|
+
no children for operator "Or"
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This occurs when searching memories, indicating the query builder is creating an "Or" operator with an empty children array, which is invalid in Weaviate.
|
|
18
|
+
|
|
19
|
+
## Root Cause
|
|
20
|
+
|
|
21
|
+
The Weaviate query construction in remember-mcp is building a filter with an "Or" operator but not adding any child conditions to it. This happens when:
|
|
22
|
+
- Building complex filters with multiple conditions
|
|
23
|
+
- Conditional logic results in empty filter arrays
|
|
24
|
+
- Or operator is created before checking if there are conditions to add
|
|
25
|
+
|
|
26
|
+
## Investigation Steps
|
|
27
|
+
|
|
28
|
+
1. **Find where "Or" operator is used**
|
|
29
|
+
- Search for `.or(` or `Or(` in remember-mcp codebase
|
|
30
|
+
- Check search-memory.ts, query-memory.ts, find-similar.ts
|
|
31
|
+
|
|
32
|
+
2. **Identify the query construction logic**
|
|
33
|
+
- Look for filter building code
|
|
34
|
+
- Find where Or operator is created
|
|
35
|
+
- Check if children array is validated before creating operator
|
|
36
|
+
|
|
37
|
+
3. **Reproduce locally**
|
|
38
|
+
- Test search with various parameters
|
|
39
|
+
- Identify which search parameters trigger the bug
|
|
40
|
+
- Confirm the empty Or operator
|
|
41
|
+
|
|
42
|
+
## Expected Fix
|
|
43
|
+
|
|
44
|
+
Add validation before creating Or operator:
|
|
45
|
+
```typescript
|
|
46
|
+
// Before (buggy):
|
|
47
|
+
const orFilter = weaviate.filter.or(...conditions);
|
|
48
|
+
|
|
49
|
+
// After (fixed):
|
|
50
|
+
if (conditions.length === 0) {
|
|
51
|
+
// Skip Or operator if no conditions
|
|
52
|
+
return baseQuery;
|
|
53
|
+
} else if (conditions.length === 1) {
|
|
54
|
+
// Use single condition directly
|
|
55
|
+
return baseQuery.withWhere(conditions[0]);
|
|
56
|
+
} else {
|
|
57
|
+
// Use Or operator only when multiple conditions
|
|
58
|
+
return baseQuery.withWhere(weaviate.filter.or(...conditions));
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Files to Check
|
|
63
|
+
|
|
64
|
+
- `src/tools/search-memory.ts` - Main search implementation
|
|
65
|
+
- `src/tools/query-memory.ts` - Query tool
|
|
66
|
+
- `src/tools/find-similar.ts` - Similarity search
|
|
67
|
+
- `src/weaviate/client.ts` - Weaviate client wrapper
|
|
68
|
+
- Any file that builds Weaviate filters
|
|
69
|
+
|
|
70
|
+
## Verification
|
|
71
|
+
|
|
72
|
+
- [ ] Or operator only created when conditions.length > 1
|
|
73
|
+
- [ ] Empty conditions array handled gracefully
|
|
74
|
+
- [ ] Single condition doesn't use Or operator
|
|
75
|
+
- [ ] All search tools work without errors
|
|
76
|
+
- [ ] Tests pass
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
**Impact**: High - blocks all search functionality
|
|
81
|
+
**Complexity**: Medium - requires understanding Weaviate query API
|
|
82
|
+
**Location**: remember-mcp project (not remember-mcp-server)
|
package/dist/server-factory.js
CHANGED
|
@@ -1408,17 +1408,18 @@ async function handleCreateMemory(args, userId, context) {
|
|
|
1408
1408
|
}
|
|
1409
1409
|
|
|
1410
1410
|
// src/utils/weaviate-filters.ts
|
|
1411
|
+
import { Filters } from "weaviate-client";
|
|
1411
1412
|
function buildCombinedSearchFilters(collection, filters) {
|
|
1412
1413
|
const memoryFilters = buildDocTypeFilters(collection, "memory", filters);
|
|
1413
1414
|
const relationshipFilters = buildDocTypeFilters(collection, "relationship", filters);
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1415
|
+
const validFilters = [memoryFilters, relationshipFilters].filter((f) => f !== void 0 && f !== null);
|
|
1416
|
+
if (validFilters.length === 0) {
|
|
1417
|
+
return void 0;
|
|
1418
|
+
} else if (validFilters.length === 1) {
|
|
1419
|
+
return validFilters[0];
|
|
1420
|
+
} else {
|
|
1421
|
+
return combineFiltersWithOr(validFilters);
|
|
1422
|
+
}
|
|
1422
1423
|
}
|
|
1423
1424
|
function buildDocTypeFilters(collection, docType, filters) {
|
|
1424
1425
|
const filterList = [];
|
|
@@ -1483,28 +1484,24 @@ function buildMemoryOnlyFilters(collection, filters) {
|
|
|
1483
1484
|
return buildDocTypeFilters(collection, "memory", filters);
|
|
1484
1485
|
}
|
|
1485
1486
|
function combineFiltersWithAnd(filters) {
|
|
1486
|
-
|
|
1487
|
+
const validFilters = filters.filter((f) => f !== void 0 && f !== null);
|
|
1488
|
+
if (validFilters.length === 0) {
|
|
1487
1489
|
return void 0;
|
|
1488
1490
|
}
|
|
1489
|
-
if (
|
|
1490
|
-
return
|
|
1491
|
+
if (validFilters.length === 1) {
|
|
1492
|
+
return validFilters[0];
|
|
1491
1493
|
}
|
|
1492
|
-
return
|
|
1493
|
-
operator: "And",
|
|
1494
|
-
operands: filters
|
|
1495
|
-
};
|
|
1494
|
+
return Filters.and(...validFilters);
|
|
1496
1495
|
}
|
|
1497
1496
|
function combineFiltersWithOr(filters) {
|
|
1498
|
-
|
|
1497
|
+
const validFilters = filters.filter((f) => f !== void 0 && f !== null);
|
|
1498
|
+
if (validFilters.length === 0) {
|
|
1499
1499
|
return void 0;
|
|
1500
1500
|
}
|
|
1501
|
-
if (
|
|
1502
|
-
return
|
|
1501
|
+
if (validFilters.length === 1) {
|
|
1502
|
+
return validFilters[0];
|
|
1503
1503
|
}
|
|
1504
|
-
return
|
|
1505
|
-
operator: "Or",
|
|
1506
|
-
operands: filters
|
|
1507
|
-
};
|
|
1504
|
+
return Filters.or(...validFilters);
|
|
1508
1505
|
}
|
|
1509
1506
|
|
|
1510
1507
|
// src/tools/search-memory.ts
|
package/dist/server.js
CHANGED
|
@@ -1337,17 +1337,18 @@ async function handleCreateMemory(args, userId, context) {
|
|
|
1337
1337
|
}
|
|
1338
1338
|
|
|
1339
1339
|
// src/utils/weaviate-filters.ts
|
|
1340
|
+
import { Filters } from "weaviate-client";
|
|
1340
1341
|
function buildCombinedSearchFilters(collection, filters) {
|
|
1341
1342
|
const memoryFilters = buildDocTypeFilters(collection, "memory", filters);
|
|
1342
1343
|
const relationshipFilters = buildDocTypeFilters(collection, "relationship", filters);
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1344
|
+
const validFilters = [memoryFilters, relationshipFilters].filter((f) => f !== void 0 && f !== null);
|
|
1345
|
+
if (validFilters.length === 0) {
|
|
1346
|
+
return void 0;
|
|
1347
|
+
} else if (validFilters.length === 1) {
|
|
1348
|
+
return validFilters[0];
|
|
1349
|
+
} else {
|
|
1350
|
+
return combineFiltersWithOr(validFilters);
|
|
1351
|
+
}
|
|
1351
1352
|
}
|
|
1352
1353
|
function buildDocTypeFilters(collection, docType, filters) {
|
|
1353
1354
|
const filterList = [];
|
|
@@ -1412,28 +1413,24 @@ function buildMemoryOnlyFilters(collection, filters) {
|
|
|
1412
1413
|
return buildDocTypeFilters(collection, "memory", filters);
|
|
1413
1414
|
}
|
|
1414
1415
|
function combineFiltersWithAnd(filters) {
|
|
1415
|
-
|
|
1416
|
+
const validFilters = filters.filter((f) => f !== void 0 && f !== null);
|
|
1417
|
+
if (validFilters.length === 0) {
|
|
1416
1418
|
return void 0;
|
|
1417
1419
|
}
|
|
1418
|
-
if (
|
|
1419
|
-
return
|
|
1420
|
+
if (validFilters.length === 1) {
|
|
1421
|
+
return validFilters[0];
|
|
1420
1422
|
}
|
|
1421
|
-
return
|
|
1422
|
-
operator: "And",
|
|
1423
|
-
operands: filters
|
|
1424
|
-
};
|
|
1423
|
+
return Filters.and(...validFilters);
|
|
1425
1424
|
}
|
|
1426
1425
|
function combineFiltersWithOr(filters) {
|
|
1427
|
-
|
|
1426
|
+
const validFilters = filters.filter((f) => f !== void 0 && f !== null);
|
|
1427
|
+
if (validFilters.length === 0) {
|
|
1428
1428
|
return void 0;
|
|
1429
1429
|
}
|
|
1430
|
-
if (
|
|
1431
|
-
return
|
|
1430
|
+
if (validFilters.length === 1) {
|
|
1431
|
+
return validFilters[0];
|
|
1432
1432
|
}
|
|
1433
|
-
return
|
|
1434
|
-
operator: "Or",
|
|
1435
|
-
operands: filters
|
|
1436
|
-
};
|
|
1433
|
+
return Filters.or(...validFilters);
|
|
1437
1434
|
}
|
|
1438
1435
|
|
|
1439
1436
|
// src/tools/search-memory.ts
|
package/package.json
CHANGED
|
@@ -512,4 +512,53 @@ describe('weaviate-filters', () => {
|
|
|
512
512
|
});
|
|
513
513
|
});
|
|
514
514
|
});
|
|
515
|
+
|
|
516
|
+
describe('undefined/null filter handling', () => {
|
|
517
|
+
it('should not create Or operator with empty operands', () => {
|
|
518
|
+
const emptyCollection = {
|
|
519
|
+
filter: {
|
|
520
|
+
byProperty: () => ({
|
|
521
|
+
equal: () => undefined,
|
|
522
|
+
greaterThanOrEqual: () => undefined,
|
|
523
|
+
lessThanOrEqual: () => undefined,
|
|
524
|
+
containsAny: () => undefined,
|
|
525
|
+
}),
|
|
526
|
+
},
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
const result = buildCombinedSearchFilters(emptyCollection);
|
|
530
|
+
expect(result).toBeUndefined();
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it('should not create And operator with empty operands', () => {
|
|
534
|
+
const emptyCollection = {
|
|
535
|
+
filter: {
|
|
536
|
+
byProperty: () => ({
|
|
537
|
+
equal: () => undefined,
|
|
538
|
+
}),
|
|
539
|
+
},
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
const result = buildMemoryOnlyFilters(emptyCollection);
|
|
543
|
+
expect(result).toBeUndefined();
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it('should handle mixed valid and undefined filters in OR', () => {
|
|
547
|
+
const result = buildCombinedSearchFilters(mockCollection, {
|
|
548
|
+
types: ['note'],
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
expect(result.operator).toBe('Or');
|
|
552
|
+
expect(result.operands).toHaveLength(2);
|
|
553
|
+
expect(result.operands[0]).toBeDefined();
|
|
554
|
+
expect(result.operands[1]).toBeDefined();
|
|
555
|
+
|
|
556
|
+
if (result.operands[0].operands) {
|
|
557
|
+
expect(result.operands[0].operands.length).toBeGreaterThan(0);
|
|
558
|
+
}
|
|
559
|
+
if (result.operands[1].operands) {
|
|
560
|
+
expect(result.operands[1].operands.length).toBeGreaterThan(0);
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
});
|
|
515
564
|
});
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Replaces old v2 filter format (path/operator/valueText) with v3 collection.filter.byProperty()
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { Filters } from 'weaviate-client';
|
|
8
9
|
import type { SearchFilters } from '../types/memory.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
@@ -25,16 +26,17 @@ export function buildCombinedSearchFilters(
|
|
|
25
26
|
// Build relationship-specific filters
|
|
26
27
|
const relationshipFilters = buildDocTypeFilters(collection, 'relationship', filters);
|
|
27
28
|
|
|
29
|
+
// Filter out undefined/null values before combining
|
|
30
|
+
const validFilters = [memoryFilters, relationshipFilters].filter(f => f !== undefined && f !== null);
|
|
31
|
+
|
|
28
32
|
// Combine with OR: search both memories and relationships
|
|
29
|
-
if (
|
|
30
|
-
return
|
|
31
|
-
} else if (
|
|
32
|
-
return
|
|
33
|
-
} else
|
|
34
|
-
return
|
|
33
|
+
if (validFilters.length === 0) {
|
|
34
|
+
return undefined;
|
|
35
|
+
} else if (validFilters.length === 1) {
|
|
36
|
+
return validFilters[0];
|
|
37
|
+
} else {
|
|
38
|
+
return combineFiltersWithOr(validFilters);
|
|
35
39
|
}
|
|
36
|
-
|
|
37
|
-
return undefined;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
/**
|
|
@@ -164,18 +166,18 @@ export function buildRelationshipOnlyFilters(
|
|
|
164
166
|
* @returns Combined filter or undefined
|
|
165
167
|
*/
|
|
166
168
|
function combineFiltersWithAnd(filters: any[]): any {
|
|
167
|
-
|
|
169
|
+
// Filter out any undefined/null values
|
|
170
|
+
const validFilters = filters.filter(f => f !== undefined && f !== null);
|
|
171
|
+
|
|
172
|
+
if (validFilters.length === 0) {
|
|
168
173
|
return undefined;
|
|
169
174
|
}
|
|
170
|
-
if (
|
|
171
|
-
return
|
|
175
|
+
if (validFilters.length === 1) {
|
|
176
|
+
return validFilters[0];
|
|
172
177
|
}
|
|
173
178
|
|
|
174
|
-
// Weaviate v3 uses
|
|
175
|
-
return
|
|
176
|
-
operator: 'And',
|
|
177
|
-
operands: filters
|
|
178
|
-
};
|
|
179
|
+
// Weaviate v3 uses Filters.and() from weaviate-client package
|
|
180
|
+
return Filters.and(...validFilters);
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
/**
|
|
@@ -185,18 +187,18 @@ function combineFiltersWithAnd(filters: any[]): any {
|
|
|
185
187
|
* @returns Combined filter or undefined
|
|
186
188
|
*/
|
|
187
189
|
function combineFiltersWithOr(filters: any[]): any {
|
|
188
|
-
|
|
190
|
+
// Filter out any undefined/null values
|
|
191
|
+
const validFilters = filters.filter(f => f !== undefined && f !== null);
|
|
192
|
+
|
|
193
|
+
if (validFilters.length === 0) {
|
|
189
194
|
return undefined;
|
|
190
195
|
}
|
|
191
|
-
if (
|
|
192
|
-
return
|
|
196
|
+
if (validFilters.length === 1) {
|
|
197
|
+
return validFilters[0];
|
|
193
198
|
}
|
|
194
199
|
|
|
195
|
-
// Weaviate v3 uses
|
|
196
|
-
return
|
|
197
|
-
operator: 'Or',
|
|
198
|
-
operands: filters
|
|
199
|
-
};
|
|
200
|
+
// Weaviate v3 uses Filters.or() from weaviate-client package
|
|
201
|
+
return Filters.or(...validFilters);
|
|
200
202
|
}
|
|
201
203
|
|
|
202
204
|
/**
|