mirror of
https://github.com/colbymchenry/codegraph.git
synced 2026-11-15 04:21:31 +08:00
fix(search): a pasted call like leaf(entry) finds both names instead of nothing (#3069)
Full-text search dropped the FTS5 syntax characters ( ) ^ " ' * : from a query before quoting each word, so the words on either side of one were glued together: leaf(entry) became the single prefix term "leafentry"*, which no symbol has, and the LIKE and fuzzy fallbacks don't recover it. codegraph query, the codegraph_search tool and searchNodes() all came back empty for a pasted call like render(props). The index's unicode61 tokenizer splits stored text at anything but letters and digits (a signature's leaf(entry) is stored as leaf and entry), so the query now splits there too: each of those characters becomes a space, the treatment :: already gets (issue #173). Validation: new search-special-characters.test.ts (8 tests) fails 8 of 8 on main and passes with the fix; fts5-fallback, search-field-filters, search-query-parser, cli-query-command and symbol-lookup pass. A query A/B on expressjs/express 0dee2c52, both arms over one index: 12 control queries without such a character between words are byte-identical; 10 pasted calls changed, 7 of them from no results to results led by the function they name (res.send(body), res.json(obj), View.prototype.lookup(name)). Reimplements PR #2987 by @kjgggggg. Fixes #2971 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
cc17978174
commit
f67eafcbc5
+6
-1
@@ -2147,9 +2147,14 @@ export class QueryBuilder {
|
||||
// so treat it as whitespace before the strip step. Otherwise queries
|
||||
// like `stage_apply::run` collapse to `stage_applyrun` (the colons
|
||||
// are stripped without splitting) and find nothing. See #173.
|
||||
//
|
||||
// The other FTS5 syntax characters separate words too, as they do in
|
||||
// the index, which splits text at anything but letters and digits:
|
||||
// `leaf(entry)` is stored as `leaf` and `entry`. Dropping them glued a
|
||||
// pasted call into one word no symbol has (`leafentry`, #2971).
|
||||
const ftsQuery = query
|
||||
.replace(/::/g, ' ') // Rust/C++/Ruby qualifier separator
|
||||
.replace(/['"*():^]/g, '') // Remove FTS5 special chars
|
||||
.replace(/['"*():^]/g, ' ') // FTS5 syntax characters separate words
|
||||
.split(/\s+/)
|
||||
.filter(term => term.length > 0)
|
||||
// Strip FTS5 boolean operators to prevent query manipulation
|
||||
|
||||
Reference in New Issue
Block a user