6.4 KiB
6.4 KiB
Changelog
All notable changes to YAMS (Yet Another Memory System) will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Archived Changelogs
- v0.6.x archive: docs/changelogs/v0.6.md
- v0.5.x archive: docs/changelogs/v0.5.md
- v0.4.x archive: docs/changelogs/v0.4.md
- v0.3.x archive: docs/changelogs/v0.3.md
- v0.2.x archive: docs/changelogs/v0.2.md
- v0.1.x archive: docs/changelogs/v0.1.md
[v0.7.8] - Unreleased
Added
-
Search Service Query Literal Extraction
- New
QueryLiteralExtractorclass for extracting selective terms from search QueryAST - Recursively traverses AST (Term, Phrase, And, Or, Field nodes) to collect literals
- Scores terms by selectivity: length, uppercase chars, special characters
- Enables future two-phase search: literal pre-filter → full FTS5
- Location:
include/yams/search/query_literal_extractor.hpp,src/search/query_literal_extractor.cpp
- New
-
Retrieval Service Optimizations
- BMH Suffix Matching: Applied to
getByNameSmart()post-SQL filtering- Threshold-based activation: ≥100 candidates → BMH, <100 → sequential rfind()
- Parallel Session List Processing: Applied to basename matching
- Threshold: ≥100 items →
std::asyncparallel filter
- Threshold: ≥100 items →
- Location:
src/app/services/retrieval_service.cpp
- BMH Suffix Matching: Applied to
-
Search Service Parallel Post-Processing
- New
ParallelPostProcessorclass for concurrent search result processing - Parallelizes filtering, facet generation, and highlighting when result count ≥ 100
- Uses
std::asyncto run independent operations concurrently - Threshold-based activation (PARALLEL_THRESHOLD = 100) avoids overhead on small result sets
- Performance Measured (100 iterations):
- 100 results: 0.06ms (~1.66M ops/sec) - sequential path
- 500 results: 0.23ms (~2.21M ops/sec) - parallel path
- 1000 results: 0.43ms (~2.32M ops/sec) - parallel path
- Speedup: ~3.4x faster at 1000 results vs linear scaling
- Location:
include/yams/search/parallel_post_processor.hpp,src/search/parallel_post_processor.cpp - Integration:
search_executor.cppnow uses ParallelPostProcessor instead of sequential processing - Benchmarks:
tests/benchmarks/search_benchmarks.cpp
- New
-
Grep Service Optimizations
- Literal Extraction from Regex Patterns
- New
LiteralExtractorutility extracts literal substrings from regex patterns - Enables two-phase matching: fast literal pre-filter → full regex only on candidates
- Based on ripgrep's literal extraction strategy
- Performance: 10-50x speedup on typical patterns with rare matches
- New
- Boyer-Moore-Horspool (BMH) String Search
- Replaces
std::string::find()with BMH algorithm for patterns ≥ 3 characters - Sublinear average-case complexity: O(n/m) vs O(n·m) for naive search
- Preprocessing builds bad-character shift table for efficient skipping
- Performance: 2-3x speedup over std::string::find on typical text
- Replaces
- SIMD Vectorized Newline Scanning
- Platform-specific implementations: AVX2 (32 bytes), SSE2 (16 bytes), NEON (16 bytes)
- Scalar fallback using optimized memchr for portability
- Replaces byte-by-byte scanning in line boundary detection
- Performance: 4-8x speedup on large files
- Parallel Candidate Filtering
- Pre-filters unsuitable files before worker distribution using
std::async - Integrates
magic_numbers.hppfor accurate binary detection (86 compile-time patterns) - Filters build artifacts (.o, .class, .pyc), libraries (.a, .so, .dll), executables, packages
- Chunk-based parallel processing for large candidate sets (>100 files)
- Performance: 2-4x speedup on large corpora
- Pre-filters unsuitable files before worker distribution using
- Literal Extraction from Regex Patterns
Changed
-
Search Executor Post-Processing
- Replaced sequential post-processing with
ParallelPostProcessor::process() - Filters, facets, highlights, and snippets now run concurrently on large result sets
- Maintains identical output to sequential processing
- Replaced sequential post-processing with
-
Grep Service Pattern Matching
- Pure literal patterns ≥ 3 chars now use BMH instead of std::string::find
- Regex patterns with extractable literals use two-phase matching
- Binary file detection now uses magic_numbers.hpp prune categories
- Line boundary detection uses SIMD vectorization where available
- Maintains backward compatibility: all existing tests pass
Performance
- Benchmark Suite:
tests/benchmarks/grep_benchmarks.cpp- 8 benchmark scenarios: literal patterns, regex, large corpus (10K files), single large file (100MB), high match count, case-insensitive, word boundary, complex regex
- Framework ready for before/after performance validation
--include="*.md,*.cpp"correctly return all matching files regardless of their directory location.
- Search Async Path: Fixed
SearchCommand::executeAsync()not populatingpathPatternsfield in daemon request, causing server-side multi-pattern filtering to fail. The async code path (default execution) now correctly sends all include patterns to the daemon, matching the behavior of the sync path. (src/cli/commands/search_command.cpp:1360-1365) - Database Schema Compatibility: Fixed "constraint failed" errors during document insertion on databases with migration v12 (pre-path-indexing schema). The
insertDocument()function now conditionally builds INSERT statements based on thehasPathIndexing_flag, supporting both legacy (13-column) and modern (17-column with path indexing) schemas. This allows YAMS to work correctly regardless of whether migration v13 has been applied. (src/metadata/metadata_repository.cpp:318-380) - MCP Protocol Version Negotiation: Fixed "Unsupported protocol version requested by client" error (code -32901) by making protocol version negotiation permissive by default (
strictProtocol_ = false). The server now gracefully accepts any protocol version requested by clients, falling back to the latest supported version (2025-03-26) if the requested version is not in the supported list. Also added intermediate MCP protocol versions (2024-12-05,2025-01-15) to the supported list. This ensures maximum compatibility with MCP clients regardless of which spec version they implement. (src/mcp/mcp_server.cpp:560,1254-1260)