mirror of https://github.com/usememos/memos.git
Add support for CEL exists() comprehension with startsWith, endsWith, and
contains predicates to enable powerful tag filtering patterns.
Features:
- tags.exists(t, t.startsWith("prefix")) - Match tags by prefix
- tags.exists(t, t.endsWith("suffix")) - Match tags by suffix
- tags.exists(t, t.contains("substring")) - Match tags by substring
- Negation: !tags.exists(...) to exclude matching tags
- Works with all operators (AND, OR, NOT) and other filters
Implementation:
- Added ListComprehensionCondition IR type for comprehension expressions
- Parser detects exists() macro and extracts predicates
- Renderer generates optimized SQL for SQLite, MySQL, PostgreSQL
- Proper NULL/empty array handling across all database dialects
- Helper functions reduce code duplication
Design decisions:
- Only exists() supported (all() rejected at parse time with clear error)
- Only simple predicates (matches() excluded to avoid regex complexity)
- Fail-fast validation with helpful error messages
Tests:
- Comprehensive test suite covering all predicates and edge cases
- Tests for NULL/empty arrays, combined filters, negation
- Real-world use case test for Issue #5480 (archive workflow)
- All tests pass on SQLite, MySQL, PostgreSQL
Closes #5480
|
||
|---|---|---|
| .. | ||
| Dockerfile | ||
| README.md | ||
| activity_test.go | ||
| attachment_filter_test.go | ||
| attachment_test.go | ||
| containers.go | ||
| filter_helpers_test.go | ||
| idp_test.go | ||
| inbox_test.go | ||
| instance_setting_test.go | ||
| main_test.go | ||
| memo_filter_comprehension_test.go | ||
| memo_filter_test.go | ||
| memo_relation_test.go | ||
| memo_test.go | ||
| migrator_test.go | ||
| reaction_test.go | ||
| store.go | ||
| user_setting_test.go | ||
| user_test.go | ||
README.md
Store tests
How to test store with MySQL?
- Create a database in your MySQL server.
- Run the following command with two environment variables set:
DRIVER=mysql DSN=root@/memos_test go test -v ./test/store/...
DRIVERshould be set tomysql.DSNshould be set to the DSN of your MySQL server.