/** * #212 (ADR-091): 다중 패턴 ASCII substring 매처 (Aho-Corasick). * * 왜 있나 — `buildRefEdges` 가 slug 마다 `content LIKE '%slug%'` 로 **전건을 훑었다**. * [검증] n=34,928 에서 `slugRefs` 3,660 회 × 42ms = **154s**, 그중 distinct slug 는 **769** 뿐이라 * 같은 질문을 4.76배 반복했고(행 기준 54.8배) 38.7% 는 `DF > 100` 이라 답을 받아서 버렸다. * 이 매처는 **전건을 1회만** 통과한다 — [검증] 579ms (251배), 엣지 집합 1:1 동일. */ /** * ASCII 대소문자 접힘 — SQLite `LIKE` 의 기본 동작과 **정의상 동일**하다. * * 🔴 `String.prototype.toLowerCase()` 를 쓰면 안 된다 — 그쪽은 **전 유니코드**를 접는데 * SQLite `LIKE` 는 ASCII 만 접는다. [검증] 직접 실행: * `'TESTING' LIKE '%testing%'` → 1 (접는다) * `'İ'(U+0130) LIKE '%i%'` → 0 (안 접는다) * `'K'(U+212A) LIKE '%k%'` → 0 (안 접는다) * `'Ä' LIKE '%ä%'` → 0 (안 접는다) * 즉 `toLowerCase()` 로 매칭하면 **LIKE 가 안 잡던 엣지가 생긴다**. * 이 코퍼스의 실 영향은 0행이었지만 그것은 논증이고, 이 함수는 정의상 동일하다. */ export declare function foldAsciiCode(code: number): number; export interface AsciiSubstringMatcher { readonly patternCount: number; readonly nodeCount: number; /** * 한 문서를 훑어 매칭된 패턴 인덱스를 콜백한다. * * 🔴 **문서 단위 dedup** (ADR-091 D3) — 같은 패턴이 한 문서에 여러 번 나와도 **1회만** 부른다. * 현행 `findMemoryIdsContaining` 은 `SELECT id … WHERE content LIKE …` 이고 `id` 가 PK 라 * **문서당 정확히 1행**을 돌려준다. 출현마다 부르면 df 가 팽창해 * `w = 1/(1+log2(df))` 가 하락하고 `skippedHighDf` 가 변동한다. */ scanDoc(content: string, onHit: (patternIndex: number) => void): void; } /** * 패턴 목록으로 매처를 만든다. 패턴은 `foldAsciiCode` 로 정규화되므로 호출자가 접을 필요가 없다. * * 빈 문자열 패턴은 지원하지 않는다 — 호출자(`buildRefEdges`)가 `REF_SLUG_MIN` 으로 거른다. */ export declare function buildAsciiSubstringMatcher(patterns: readonly string[]): AsciiSubstringMatcher; //# sourceMappingURL=ac-matcher.d.ts.map