@matperez/coderag 0.1.24
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/README.md +154 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ast-chunking.d.ts +40 -0
- package/dist/ast-chunking.d.ts.map +1 -0
- package/dist/ast-chunking.js +88 -0
- package/dist/ast-chunking.js.map +1 -0
- package/dist/ast-chunking.test.d.ts +5 -0
- package/dist/ast-chunking.test.d.ts.map +1 -0
- package/dist/ast-chunking.test.js +173 -0
- package/dist/ast-chunking.test.js.map +1 -0
- package/dist/code-tokenizer.d.ts +62 -0
- package/dist/code-tokenizer.d.ts.map +1 -0
- package/dist/code-tokenizer.js +129 -0
- package/dist/code-tokenizer.js.map +1 -0
- package/dist/code-tokenizer.test.d.ts +5 -0
- package/dist/code-tokenizer.test.d.ts.map +1 -0
- package/dist/code-tokenizer.test.js +96 -0
- package/dist/code-tokenizer.test.js.map +1 -0
- package/dist/db/client-pg.d.ts +16 -0
- package/dist/db/client-pg.d.ts.map +1 -0
- package/dist/db/client-pg.js +38 -0
- package/dist/db/client-pg.js.map +1 -0
- package/dist/db/client.d.ts +36 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +81 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/migrations-pg.d.ts +6 -0
- package/dist/db/migrations-pg.d.ts.map +1 -0
- package/dist/db/migrations-pg.js +88 -0
- package/dist/db/migrations-pg.js.map +1 -0
- package/dist/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +164 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/schema-pg.d.ts +611 -0
- package/dist/db/schema-pg.d.ts.map +1 -0
- package/dist/db/schema-pg.js +66 -0
- package/dist/db/schema-pg.js.map +1 -0
- package/dist/db/schema.d.ts +630 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +85 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/embeddings.d.ts +92 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +275 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/embeddings.test.d.ts +5 -0
- package/dist/embeddings.test.d.ts.map +1 -0
- package/dist/embeddings.test.js +255 -0
- package/dist/embeddings.test.js.map +1 -0
- package/dist/hybrid-search.d.ts +47 -0
- package/dist/hybrid-search.d.ts.map +1 -0
- package/dist/hybrid-search.js +215 -0
- package/dist/hybrid-search.js.map +1 -0
- package/dist/hybrid-search.test.d.ts +5 -0
- package/dist/hybrid-search.test.d.ts.map +1 -0
- package/dist/hybrid-search.test.js +252 -0
- package/dist/hybrid-search.test.js.map +1 -0
- package/dist/incremental-tfidf.d.ts +77 -0
- package/dist/incremental-tfidf.d.ts.map +1 -0
- package/dist/incremental-tfidf.js +248 -0
- package/dist/incremental-tfidf.js.map +1 -0
- package/dist/incremental-tfidf.test.d.ts +5 -0
- package/dist/incremental-tfidf.test.d.ts.map +1 -0
- package/dist/incremental-tfidf.test.js +276 -0
- package/dist/incremental-tfidf.test.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +205 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +1331 -0
- package/dist/indexer.js.map +1 -0
- package/dist/indexer.test.d.ts +12 -0
- package/dist/indexer.test.d.ts.map +1 -0
- package/dist/indexer.test.js +471 -0
- package/dist/indexer.test.js.map +1 -0
- package/dist/language-config.d.ts +54 -0
- package/dist/language-config.d.ts.map +1 -0
- package/dist/language-config.js +75 -0
- package/dist/language-config.js.map +1 -0
- package/dist/search-cache.d.ts +63 -0
- package/dist/search-cache.d.ts.map +1 -0
- package/dist/search-cache.js +118 -0
- package/dist/search-cache.js.map +1 -0
- package/dist/search-cache.test.d.ts +5 -0
- package/dist/search-cache.test.d.ts.map +1 -0
- package/dist/search-cache.test.js +194 -0
- package/dist/search-cache.test.js.map +1 -0
- package/dist/storage-factory.d.ts +11 -0
- package/dist/storage-factory.d.ts.map +1 -0
- package/dist/storage-factory.js +17 -0
- package/dist/storage-factory.js.map +1 -0
- package/dist/storage-persistent-pg.d.ts +75 -0
- package/dist/storage-persistent-pg.d.ts.map +1 -0
- package/dist/storage-persistent-pg.js +579 -0
- package/dist/storage-persistent-pg.js.map +1 -0
- package/dist/storage-persistent-pg.test.d.ts +7 -0
- package/dist/storage-persistent-pg.test.d.ts.map +1 -0
- package/dist/storage-persistent-pg.test.js +90 -0
- package/dist/storage-persistent-pg.test.js.map +1 -0
- package/dist/storage-persistent-types.d.ts +110 -0
- package/dist/storage-persistent-types.d.ts.map +1 -0
- package/dist/storage-persistent-types.js +5 -0
- package/dist/storage-persistent-types.js.map +1 -0
- package/dist/storage-persistent.d.ts +231 -0
- package/dist/storage-persistent.d.ts.map +1 -0
- package/dist/storage-persistent.js +897 -0
- package/dist/storage-persistent.js.map +1 -0
- package/dist/storage-persistent.test.d.ts +5 -0
- package/dist/storage-persistent.test.d.ts.map +1 -0
- package/dist/storage-persistent.test.js +325 -0
- package/dist/storage-persistent.test.js.map +1 -0
- package/dist/storage.d.ts +63 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +67 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.test.d.ts +5 -0
- package/dist/storage.test.d.ts.map +1 -0
- package/dist/storage.test.js +157 -0
- package/dist/storage.test.js.map +1 -0
- package/dist/tfidf.d.ts +97 -0
- package/dist/tfidf.d.ts.map +1 -0
- package/dist/tfidf.js +308 -0
- package/dist/tfidf.js.map +1 -0
- package/dist/tfidf.test.d.ts +5 -0
- package/dist/tfidf.test.d.ts.map +1 -0
- package/dist/tfidf.test.js +181 -0
- package/dist/tfidf.test.js.map +1 -0
- package/dist/utils.d.ts +61 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +264 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +5 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +94 -0
- package/dist/utils.test.js.map +1 -0
- package/dist/vector-storage.d.ts +120 -0
- package/dist/vector-storage.d.ts.map +1 -0
- package/dist/vector-storage.js +264 -0
- package/dist/vector-storage.js.map +1 -0
- package/dist/vector-storage.test.d.ts +5 -0
- package/dist/vector-storage.test.d.ts.map +1 -0
- package/dist/vector-storage.test.js +345 -0
- package/dist/vector-storage.test.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid Search Tests
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
7
|
+
import { createMockProvider } from './embeddings.js';
|
|
8
|
+
import { hybridSearch, keywordSearch, semanticSearch } from './hybrid-search.js';
|
|
9
|
+
import { CodebaseIndexer } from './indexer.js';
|
|
10
|
+
import { MemoryStorage } from './storage.js';
|
|
11
|
+
describe('Hybrid Search', () => {
|
|
12
|
+
let tempDir;
|
|
13
|
+
let indexer;
|
|
14
|
+
let embeddingProvider;
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
// Create temporary test directory
|
|
17
|
+
tempDir = `/tmp/hybrid-search-test-${Date.now()}`;
|
|
18
|
+
fs.mkdirSync(tempDir, { recursive: true });
|
|
19
|
+
// Create test files
|
|
20
|
+
const testFiles = [
|
|
21
|
+
{
|
|
22
|
+
name: 'auth.ts',
|
|
23
|
+
content: `
|
|
24
|
+
export function authenticate(username: string, password: string) {
|
|
25
|
+
// User authentication logic
|
|
26
|
+
return validateCredentials(username, password);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function validateCredentials(user: string, pass: string): boolean {
|
|
30
|
+
// Check user credentials
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'database.ts',
|
|
37
|
+
content: `
|
|
38
|
+
export class DatabaseConnection {
|
|
39
|
+
connect() {
|
|
40
|
+
// Database connection logic
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
query(sql: string) {
|
|
44
|
+
// Execute SQL query
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
`,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'api.ts',
|
|
51
|
+
content: `
|
|
52
|
+
export function handleRequest(req: Request) {
|
|
53
|
+
// API request handler
|
|
54
|
+
return processRequest(req);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function processRequest(request: Request) {
|
|
58
|
+
// Process API request
|
|
59
|
+
return { success: true };
|
|
60
|
+
}
|
|
61
|
+
`,
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
for (const file of testFiles) {
|
|
65
|
+
const filePath = path.join(tempDir, file.name);
|
|
66
|
+
fs.writeFileSync(filePath, file.content);
|
|
67
|
+
}
|
|
68
|
+
// Initialize embedding provider
|
|
69
|
+
embeddingProvider = createMockProvider(128);
|
|
70
|
+
// Initialize indexer with embeddings
|
|
71
|
+
indexer = new CodebaseIndexer({
|
|
72
|
+
codebaseRoot: tempDir,
|
|
73
|
+
storage: new MemoryStorage(),
|
|
74
|
+
embeddingProvider,
|
|
75
|
+
});
|
|
76
|
+
// Index the codebase
|
|
77
|
+
await indexer.index();
|
|
78
|
+
});
|
|
79
|
+
afterEach(() => {
|
|
80
|
+
// Clean up temp directory
|
|
81
|
+
if (fs.existsSync(tempDir)) {
|
|
82
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
describe('hybridSearch', () => {
|
|
86
|
+
it('should combine vector and TF-IDF results', async () => {
|
|
87
|
+
const results = await hybridSearch('authentication', indexer, {
|
|
88
|
+
limit: 5,
|
|
89
|
+
vectorWeight: 0.7,
|
|
90
|
+
});
|
|
91
|
+
expect(results.length).toBeGreaterThan(0);
|
|
92
|
+
expect(results.length).toBeLessThanOrEqual(5);
|
|
93
|
+
// Should have at least one result with hybrid method
|
|
94
|
+
const hasHybrid = results.some((r) => r.method === 'hybrid');
|
|
95
|
+
const hasVector = results.some((r) => r.method === 'vector');
|
|
96
|
+
const hasTfidf = results.some((r) => r.method === 'tfidf');
|
|
97
|
+
// At least one of these should be true
|
|
98
|
+
expect(hasHybrid || hasVector || hasTfidf).toBe(true);
|
|
99
|
+
// All results should have valid scores
|
|
100
|
+
expect(results.every((r) => r.score >= 0)).toBe(true);
|
|
101
|
+
// Results should be sorted by score
|
|
102
|
+
for (let i = 1; i < results.length; i++) {
|
|
103
|
+
expect(results[i - 1].score).toBeGreaterThanOrEqual(results[i].score);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
it('should respect limit parameter', async () => {
|
|
107
|
+
const results = await hybridSearch('function', indexer, { limit: 2 });
|
|
108
|
+
expect(results.length).toBeLessThanOrEqual(2);
|
|
109
|
+
});
|
|
110
|
+
it('should filter by minimum score', async () => {
|
|
111
|
+
const results = await hybridSearch('authentication', indexer, {
|
|
112
|
+
minScore: 0.5,
|
|
113
|
+
});
|
|
114
|
+
expect(results.every((r) => r.score >= 0.5)).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
it('should include content when requested', async () => {
|
|
117
|
+
const results = await hybridSearch('database', indexer, {
|
|
118
|
+
includeContent: true,
|
|
119
|
+
limit: 1,
|
|
120
|
+
});
|
|
121
|
+
if (results.length > 0) {
|
|
122
|
+
expect(results[0].content).toBeDefined();
|
|
123
|
+
expect(typeof results[0].content).toBe('string');
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
it('should adjust scores based on vector weight', async () => {
|
|
127
|
+
const highVectorWeight = await hybridSearch('authentication', indexer, {
|
|
128
|
+
vectorWeight: 0.9,
|
|
129
|
+
limit: 5,
|
|
130
|
+
});
|
|
131
|
+
const lowVectorWeight = await hybridSearch('authentication', indexer, {
|
|
132
|
+
vectorWeight: 0.1,
|
|
133
|
+
limit: 5,
|
|
134
|
+
});
|
|
135
|
+
// Both should return results
|
|
136
|
+
expect(highVectorWeight.length).toBeGreaterThan(0);
|
|
137
|
+
expect(lowVectorWeight.length).toBeGreaterThan(0);
|
|
138
|
+
// Scores might differ based on weighting
|
|
139
|
+
// (This is a soft check as exact scores depend on the mock provider)
|
|
140
|
+
});
|
|
141
|
+
it('should fallback to TF-IDF when vector search unavailable', async () => {
|
|
142
|
+
// Create indexer without embeddings
|
|
143
|
+
const simpleIndexer = new CodebaseIndexer({
|
|
144
|
+
codebaseRoot: tempDir,
|
|
145
|
+
storage: new MemoryStorage(),
|
|
146
|
+
});
|
|
147
|
+
await simpleIndexer.index();
|
|
148
|
+
const results = await hybridSearch('authentication', simpleIndexer);
|
|
149
|
+
expect(results.length).toBeGreaterThan(0);
|
|
150
|
+
expect(results.every((r) => r.method === 'tfidf')).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it('should handle empty query', async () => {
|
|
153
|
+
const results = await hybridSearch('', indexer);
|
|
154
|
+
// Empty query should still return results (all docs with low scores)
|
|
155
|
+
expect(Array.isArray(results)).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
it('should handle query with no matches', async () => {
|
|
158
|
+
const results = await hybridSearch('zzznonexistenttermzzz', indexer);
|
|
159
|
+
// Should return empty or very low-scored results
|
|
160
|
+
expect(Array.isArray(results)).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('semanticSearch', () => {
|
|
164
|
+
// FIXME: Skipping due to HNSW initialization timing issues with small datasets
|
|
165
|
+
it.skip('should use vector search only (weight = 1.0)', async () => {
|
|
166
|
+
const results = await semanticSearch('authentication', indexer, {
|
|
167
|
+
limit: 5,
|
|
168
|
+
minScore: 0, // Allow all results for small test dataset
|
|
169
|
+
});
|
|
170
|
+
expect(results.length).toBeGreaterThan(0);
|
|
171
|
+
// All results should be from vector search
|
|
172
|
+
expect(results.every((r) => r.method === 'vector' || r.method === 'hybrid')).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
it('should return relevant semantic matches', async () => {
|
|
175
|
+
const results = await semanticSearch('user login credentials', indexer);
|
|
176
|
+
// Should find auth.ts which has related content
|
|
177
|
+
expect(results.length).toBeGreaterThan(0);
|
|
178
|
+
// At least one result should have reasonable similarity
|
|
179
|
+
expect(results.some((r) => r.score > 0)).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('keywordSearch', () => {
|
|
183
|
+
it('should use TF-IDF search only (weight = 0.0)', async () => {
|
|
184
|
+
const results = await keywordSearch('authenticate', indexer, { limit: 5 });
|
|
185
|
+
expect(results.length).toBeGreaterThan(0);
|
|
186
|
+
// All results should be from TF-IDF search
|
|
187
|
+
expect(results.every((r) => r.method === 'tfidf')).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
it('should return keyword matches', async () => {
|
|
190
|
+
const results = await keywordSearch('authenticate', indexer);
|
|
191
|
+
expect(results.length).toBeGreaterThan(0);
|
|
192
|
+
// Should have matched terms
|
|
193
|
+
expect(results.some((r) => r.matchedTerms && r.matchedTerms.length > 0)).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
it('should match exact keywords', async () => {
|
|
196
|
+
const results = await keywordSearch('DatabaseConnection', indexer);
|
|
197
|
+
expect(results.length).toBeGreaterThan(0);
|
|
198
|
+
// Should find database.ts
|
|
199
|
+
expect(results.some((r) => r.path.includes('database.ts'))).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
describe('comparison', () => {
|
|
203
|
+
// FIXME: Skipping due to HNSW initialization timing issues with small datasets
|
|
204
|
+
it.skip('hybrid vs semantic vs keyword should return different results', async () => {
|
|
205
|
+
const query = 'authentication';
|
|
206
|
+
const hybridResults = await hybridSearch(query, indexer, {
|
|
207
|
+
vectorWeight: 0.7,
|
|
208
|
+
limit: 5,
|
|
209
|
+
minScore: 0,
|
|
210
|
+
});
|
|
211
|
+
const semanticResults = await semanticSearch(query, indexer, {
|
|
212
|
+
limit: 5,
|
|
213
|
+
minScore: 0, // Allow all results for small test dataset
|
|
214
|
+
});
|
|
215
|
+
const keywordResults = await keywordSearch(query, indexer, { limit: 5 });
|
|
216
|
+
// All should return some results
|
|
217
|
+
expect(hybridResults.length).toBeGreaterThan(0);
|
|
218
|
+
expect(semanticResults.length).toBeGreaterThan(0);
|
|
219
|
+
expect(keywordResults.length).toBeGreaterThan(0);
|
|
220
|
+
// Methods should be different
|
|
221
|
+
const _hybridMethods = new Set(hybridResults.map((r) => r.method));
|
|
222
|
+
const semanticMethods = new Set(semanticResults.map((r) => r.method));
|
|
223
|
+
const keywordMethods = new Set(keywordResults.map((r) => r.method));
|
|
224
|
+
expect(semanticMethods.has('vector') || semanticMethods.has('hybrid')).toBe(true);
|
|
225
|
+
expect(keywordMethods.has('tfidf')).toBe(true);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('result quality', () => {
|
|
229
|
+
it('should return results with all expected fields', async () => {
|
|
230
|
+
const results = await hybridSearch('function', indexer, {
|
|
231
|
+
includeContent: true,
|
|
232
|
+
limit: 1,
|
|
233
|
+
});
|
|
234
|
+
if (results.length > 0) {
|
|
235
|
+
const result = results[0];
|
|
236
|
+
expect(result.path).toBeDefined();
|
|
237
|
+
expect(typeof result.path).toBe('string');
|
|
238
|
+
expect(result.score).toBeDefined();
|
|
239
|
+
expect(typeof result.score).toBe('number');
|
|
240
|
+
expect(result.method).toBeDefined();
|
|
241
|
+
expect(['vector', 'tfidf', 'hybrid']).toContain(result.method);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
it('should have normalized scores', async () => {
|
|
245
|
+
const results = await hybridSearch('authentication', indexer, { limit: 10 });
|
|
246
|
+
expect(results.length).toBeGreaterThan(0);
|
|
247
|
+
// Scores should be in reasonable range (0 to ~2 after normalization + weighting)
|
|
248
|
+
expect(results.every((r) => r.score >= 0 && r.score <= 10)).toBe(true);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
//# sourceMappingURL=hybrid-search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-search.test.js","sourceRoot":"","sources":["../src/hybrid-search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental TF-IDF Index Manager
|
|
3
|
+
* Efficiently updates TF-IDF vectors without full rebuild
|
|
4
|
+
*/
|
|
5
|
+
import type { DocumentVector } from './tfidf.js';
|
|
6
|
+
export interface IncrementalUpdate {
|
|
7
|
+
type: 'add' | 'update' | 'delete';
|
|
8
|
+
uri: string;
|
|
9
|
+
oldDocument?: DocumentVector;
|
|
10
|
+
newContent?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface IncrementalStats {
|
|
13
|
+
totalDocuments: number;
|
|
14
|
+
affectedDocuments: number;
|
|
15
|
+
affectedTerms: number;
|
|
16
|
+
updateTime: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Incremental TF-IDF Index Manager
|
|
20
|
+
*
|
|
21
|
+
* ALGORITHM:
|
|
22
|
+
* 1. Track document frequency (df) for each term
|
|
23
|
+
* 2. When document changes:
|
|
24
|
+
* - Update df for affected terms
|
|
25
|
+
* - Recalculate IDF for affected terms
|
|
26
|
+
* - Update TF-IDF only for affected documents
|
|
27
|
+
* 3. Avoid full rebuild unless necessary
|
|
28
|
+
*/
|
|
29
|
+
export declare class IncrementalTFIDF {
|
|
30
|
+
private documents;
|
|
31
|
+
private idf;
|
|
32
|
+
private documentFrequency;
|
|
33
|
+
private totalDocuments;
|
|
34
|
+
constructor(initialDocuments?: DocumentVector[], initialIdf?: Map<string, number>);
|
|
35
|
+
/**
|
|
36
|
+
* Apply multiple updates efficiently
|
|
37
|
+
*/
|
|
38
|
+
applyUpdates(updates: IncrementalUpdate[]): Promise<IncrementalStats>;
|
|
39
|
+
/**
|
|
40
|
+
* Add a new document
|
|
41
|
+
*/
|
|
42
|
+
private addDocumentInternal;
|
|
43
|
+
/**
|
|
44
|
+
* Update an existing document
|
|
45
|
+
*/
|
|
46
|
+
private updateDocumentInternal;
|
|
47
|
+
/**
|
|
48
|
+
* Delete a document
|
|
49
|
+
*/
|
|
50
|
+
private deleteDocumentInternal;
|
|
51
|
+
/**
|
|
52
|
+
* Extract terms from content (async - uses StarCoder2)
|
|
53
|
+
*/
|
|
54
|
+
private extractTerms;
|
|
55
|
+
/**
|
|
56
|
+
* Calculate TF for a document
|
|
57
|
+
*/
|
|
58
|
+
private calculateTF;
|
|
59
|
+
/**
|
|
60
|
+
* Recalculate TF-IDF for a document
|
|
61
|
+
*/
|
|
62
|
+
private recalculateDocumentTFIDF;
|
|
63
|
+
/**
|
|
64
|
+
* Get current index state
|
|
65
|
+
*/
|
|
66
|
+
getIndex(): {
|
|
67
|
+
documents: DocumentVector[];
|
|
68
|
+
idf: Map<string, number>;
|
|
69
|
+
totalDocuments: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Check if full rebuild is recommended
|
|
73
|
+
* Returns true if changes are too extensive for incremental update
|
|
74
|
+
*/
|
|
75
|
+
shouldFullRebuild(updates: IncrementalUpdate[]): Promise<boolean>;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=incremental-tfidf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-tfidf.d.ts","sourceRoot":"","sources":["../src/incremental-tfidf.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAGhD,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,cAAc,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,MAAM,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,OAAO,CAAC,cAAc,CAAQ;gBAG7B,gBAAgB,GAAE,cAAc,EAAO,EACvC,UAAU,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa;IAmB5C;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAwE3E;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiB9B;;OAEG;YACW,YAAY;IAW1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;OAEG;IACH,QAAQ,IAAI;QACX,SAAS,EAAE,cAAc,EAAE,CAAA;QAC3B,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QACxB,cAAc,EAAE,MAAM,CAAA;KACtB;IAQD;;;OAGG;IACG,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CA8BvE"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental TF-IDF Index Manager
|
|
3
|
+
* Efficiently updates TF-IDF vectors without full rebuild
|
|
4
|
+
*/
|
|
5
|
+
import { tokenize } from './tfidf.js'; // async tokenize using StarCoder2
|
|
6
|
+
/**
|
|
7
|
+
* Incremental TF-IDF Index Manager
|
|
8
|
+
*
|
|
9
|
+
* ALGORITHM:
|
|
10
|
+
* 1. Track document frequency (df) for each term
|
|
11
|
+
* 2. When document changes:
|
|
12
|
+
* - Update df for affected terms
|
|
13
|
+
* - Recalculate IDF for affected terms
|
|
14
|
+
* - Update TF-IDF only for affected documents
|
|
15
|
+
* 3. Avoid full rebuild unless necessary
|
|
16
|
+
*/
|
|
17
|
+
export class IncrementalTFIDF {
|
|
18
|
+
documents;
|
|
19
|
+
idf;
|
|
20
|
+
documentFrequency;
|
|
21
|
+
totalDocuments;
|
|
22
|
+
constructor(initialDocuments = [], initialIdf = new Map()) {
|
|
23
|
+
this.documents = new Map();
|
|
24
|
+
this.idf = new Map(initialIdf);
|
|
25
|
+
this.documentFrequency = new Map();
|
|
26
|
+
this.totalDocuments = initialDocuments.length;
|
|
27
|
+
// Initialize from existing index
|
|
28
|
+
for (const doc of initialDocuments) {
|
|
29
|
+
this.documents.set(doc.uri, doc);
|
|
30
|
+
// Calculate document frequency from existing documents
|
|
31
|
+
for (const term of doc.rawTerms.keys()) {
|
|
32
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
33
|
+
this.documentFrequency.set(term, df + 1);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Apply multiple updates efficiently
|
|
39
|
+
*/
|
|
40
|
+
async applyUpdates(updates) {
|
|
41
|
+
const startTime = Date.now();
|
|
42
|
+
const affectedTerms = new Set();
|
|
43
|
+
const affectedDocuments = new Set();
|
|
44
|
+
// Phase 1: Process all changes and collect affected terms
|
|
45
|
+
for (const update of updates) {
|
|
46
|
+
switch (update.type) {
|
|
47
|
+
case 'add':
|
|
48
|
+
if (update.newContent) {
|
|
49
|
+
const terms = await this.extractTerms(update.newContent);
|
|
50
|
+
this.addDocumentInternal(update.uri, terms, affectedTerms);
|
|
51
|
+
affectedDocuments.add(update.uri);
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
case 'update':
|
|
55
|
+
if (update.oldDocument && update.newContent) {
|
|
56
|
+
const oldTerms = update.oldDocument.rawTerms;
|
|
57
|
+
const newTerms = await this.extractTerms(update.newContent);
|
|
58
|
+
this.updateDocumentInternal(update.uri, oldTerms, newTerms, affectedTerms);
|
|
59
|
+
affectedDocuments.add(update.uri);
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
case 'delete':
|
|
63
|
+
if (update.oldDocument) {
|
|
64
|
+
this.deleteDocumentInternal(update.uri, update.oldDocument.rawTerms, affectedTerms);
|
|
65
|
+
affectedDocuments.delete(update.uri);
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Phase 2: Recalculate IDF for affected terms using smoothed formula
|
|
71
|
+
// Smoothed IDF: log((N+1)/(df+1)) + 1 ensures no term gets IDF=0
|
|
72
|
+
for (const term of affectedTerms) {
|
|
73
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
74
|
+
if (df > 0) {
|
|
75
|
+
this.idf.set(term, Math.log((this.totalDocuments + 1) / (df + 1)) + 1);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
this.idf.delete(term);
|
|
79
|
+
this.documentFrequency.delete(term);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Phase 3: Update TF-IDF for all documents containing affected terms
|
|
83
|
+
for (const doc of this.documents.values()) {
|
|
84
|
+
let needsUpdate = false;
|
|
85
|
+
// Check if this document contains any affected terms
|
|
86
|
+
for (const term of doc.rawTerms.keys()) {
|
|
87
|
+
if (affectedTerms.has(term)) {
|
|
88
|
+
needsUpdate = true;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (needsUpdate) {
|
|
93
|
+
this.recalculateDocumentTFIDF(doc);
|
|
94
|
+
affectedDocuments.add(doc.uri);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
totalDocuments: this.totalDocuments,
|
|
99
|
+
affectedDocuments: affectedDocuments.size,
|
|
100
|
+
affectedTerms: affectedTerms.size,
|
|
101
|
+
updateTime: Date.now() - startTime,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Add a new document
|
|
106
|
+
*/
|
|
107
|
+
addDocumentInternal(uri, terms, affectedTerms) {
|
|
108
|
+
this.totalDocuments++;
|
|
109
|
+
// Update document frequency
|
|
110
|
+
for (const term of terms.keys()) {
|
|
111
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
112
|
+
this.documentFrequency.set(term, df + 1);
|
|
113
|
+
affectedTerms.add(term);
|
|
114
|
+
}
|
|
115
|
+
// Create document vector (TF-IDF will be calculated later)
|
|
116
|
+
const doc = {
|
|
117
|
+
uri,
|
|
118
|
+
terms: new Map(),
|
|
119
|
+
rawTerms: terms,
|
|
120
|
+
magnitude: 0,
|
|
121
|
+
};
|
|
122
|
+
this.documents.set(uri, doc);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Update an existing document
|
|
126
|
+
*/
|
|
127
|
+
updateDocumentInternal(uri, oldTerms, newTerms, affectedTerms) {
|
|
128
|
+
// Collect all affected terms (old + new)
|
|
129
|
+
for (const term of oldTerms.keys()) {
|
|
130
|
+
affectedTerms.add(term);
|
|
131
|
+
}
|
|
132
|
+
for (const term of newTerms.keys()) {
|
|
133
|
+
affectedTerms.add(term);
|
|
134
|
+
}
|
|
135
|
+
// Update document frequency
|
|
136
|
+
// Remove old terms
|
|
137
|
+
for (const term of oldTerms.keys()) {
|
|
138
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
139
|
+
this.documentFrequency.set(term, Math.max(0, df - 1));
|
|
140
|
+
}
|
|
141
|
+
// Add new terms
|
|
142
|
+
for (const term of newTerms.keys()) {
|
|
143
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
144
|
+
this.documentFrequency.set(term, df + 1);
|
|
145
|
+
}
|
|
146
|
+
// Update document
|
|
147
|
+
const doc = this.documents.get(uri);
|
|
148
|
+
if (doc) {
|
|
149
|
+
doc.rawTerms = newTerms;
|
|
150
|
+
doc.terms.clear();
|
|
151
|
+
doc.magnitude = 0;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Delete a document
|
|
156
|
+
*/
|
|
157
|
+
deleteDocumentInternal(uri, terms, affectedTerms) {
|
|
158
|
+
this.totalDocuments--;
|
|
159
|
+
// Update document frequency
|
|
160
|
+
for (const term of terms.keys()) {
|
|
161
|
+
const df = this.documentFrequency.get(term) || 0;
|
|
162
|
+
this.documentFrequency.set(term, Math.max(0, df - 1));
|
|
163
|
+
affectedTerms.add(term);
|
|
164
|
+
}
|
|
165
|
+
this.documents.delete(uri);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Extract terms from content (async - uses StarCoder2)
|
|
169
|
+
*/
|
|
170
|
+
async extractTerms(content) {
|
|
171
|
+
const tokens = await tokenize(content);
|
|
172
|
+
const frequencies = new Map();
|
|
173
|
+
for (const token of tokens) {
|
|
174
|
+
frequencies.set(token, (frequencies.get(token) || 0) + 1);
|
|
175
|
+
}
|
|
176
|
+
return frequencies;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Calculate TF for a document
|
|
180
|
+
*/
|
|
181
|
+
calculateTF(termFrequency) {
|
|
182
|
+
const totalTerms = Array.from(termFrequency.values()).reduce((sum, freq) => sum + freq, 0);
|
|
183
|
+
const tf = new Map();
|
|
184
|
+
for (const [term, freq] of termFrequency.entries()) {
|
|
185
|
+
tf.set(term, freq / totalTerms);
|
|
186
|
+
}
|
|
187
|
+
return tf;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Recalculate TF-IDF for a document
|
|
191
|
+
*/
|
|
192
|
+
recalculateDocumentTFIDF(doc) {
|
|
193
|
+
const tf = this.calculateTF(doc.rawTerms);
|
|
194
|
+
doc.terms.clear();
|
|
195
|
+
// Calculate TF-IDF for each term
|
|
196
|
+
for (const [term, tfScore] of tf.entries()) {
|
|
197
|
+
const idfScore = this.idf.get(term) || 0;
|
|
198
|
+
doc.terms.set(term, tfScore * idfScore);
|
|
199
|
+
}
|
|
200
|
+
// Recalculate magnitude
|
|
201
|
+
let sumSquares = 0;
|
|
202
|
+
for (const tfidf of doc.terms.values()) {
|
|
203
|
+
sumSquares += tfidf * tfidf;
|
|
204
|
+
}
|
|
205
|
+
doc.magnitude = Math.sqrt(sumSquares);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get current index state
|
|
209
|
+
*/
|
|
210
|
+
getIndex() {
|
|
211
|
+
return {
|
|
212
|
+
documents: Array.from(this.documents.values()),
|
|
213
|
+
idf: new Map(this.idf),
|
|
214
|
+
totalDocuments: this.totalDocuments,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Check if full rebuild is recommended
|
|
219
|
+
* Returns true if changes are too extensive for incremental update
|
|
220
|
+
*/
|
|
221
|
+
async shouldFullRebuild(updates) {
|
|
222
|
+
const changeRatio = updates.length / Math.max(this.totalDocuments, 1);
|
|
223
|
+
// If >20% of documents changed, recommend full rebuild
|
|
224
|
+
if (changeRatio > 0.2) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
// Count new unique terms
|
|
228
|
+
const newTerms = new Set();
|
|
229
|
+
for (const update of updates) {
|
|
230
|
+
if (update.type === 'add' || update.type === 'update') {
|
|
231
|
+
if (update.newContent) {
|
|
232
|
+
const tokens = await tokenize(update.newContent);
|
|
233
|
+
for (const token of tokens) {
|
|
234
|
+
if (!this.documentFrequency.has(token)) {
|
|
235
|
+
newTerms.add(token);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// If too many new terms, recommend full rebuild
|
|
242
|
+
if (newTerms.size > 1000) {
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=incremental-tfidf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-tfidf.js","sourceRoot":"","sources":["../src/incremental-tfidf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental-tfidf.test.d.ts","sourceRoot":"","sources":["../src/incremental-tfidf.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|