@bhushanpawar/sqldb 1.0.6 → 1.0.7

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.
Files changed (169) hide show
  1. package/dist/cache/cache-manager.d.ts +18 -1
  2. package/dist/cache/cache-manager.d.ts.map +1 -1
  3. package/dist/cache/cache-manager.js +76 -2
  4. package/dist/cache/cache-manager.js.map +1 -1
  5. package/dist/cli/index.js +0 -0
  6. package/dist/client.d.ts +54 -0
  7. package/dist/client.d.ts.map +1 -1
  8. package/dist/client.js +124 -1
  9. package/dist/client.js.map +1 -1
  10. package/dist/connection/mariadb.d.ts +15 -0
  11. package/dist/connection/mariadb.d.ts.map +1 -1
  12. package/dist/connection/mariadb.js +25 -0
  13. package/dist/connection/mariadb.js.map +1 -1
  14. package/dist/discovery/relationship-parser.d.ts.map +1 -1
  15. package/dist/discovery/relationship-parser.js +8 -1
  16. package/dist/discovery/relationship-parser.js.map +1 -1
  17. package/dist/discovery/schema-reader.d.ts +2 -0
  18. package/dist/discovery/schema-reader.d.ts.map +1 -1
  19. package/dist/discovery/schema-reader.js +91 -0
  20. package/dist/discovery/schema-reader.js.map +1 -1
  21. package/dist/index.d.ts +2 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +4 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/query/operations.d.ts +35 -1
  26. package/dist/query/operations.d.ts.map +1 -1
  27. package/dist/query/operations.js +307 -4
  28. package/dist/query/operations.js.map +1 -1
  29. package/dist/query/query-tracker.d.ts +30 -0
  30. package/dist/query/query-tracker.d.ts.map +1 -1
  31. package/dist/query/query-tracker.js +86 -1
  32. package/dist/query/query-tracker.js.map +1 -1
  33. package/dist/search/inverted-index-manager.d.ts +76 -0
  34. package/dist/search/inverted-index-manager.d.ts.map +1 -0
  35. package/dist/search/inverted-index-manager.js +371 -0
  36. package/dist/search/inverted-index-manager.js.map +1 -0
  37. package/dist/search/search-ranker.d.ts +91 -0
  38. package/dist/search/search-ranker.d.ts.map +1 -0
  39. package/dist/search/search-ranker.js +281 -0
  40. package/dist/search/search-ranker.js.map +1 -0
  41. package/dist/search/tokenizer.d.ts +80 -0
  42. package/dist/search/tokenizer.d.ts.map +1 -0
  43. package/dist/search/tokenizer.js +398 -0
  44. package/dist/search/tokenizer.js.map +1 -0
  45. package/dist/types/cache.d.ts +16 -0
  46. package/dist/types/cache.d.ts.map +1 -1
  47. package/dist/types/cache.js.map +1 -1
  48. package/dist/types/config.d.ts +10 -0
  49. package/dist/types/config.d.ts.map +1 -1
  50. package/dist/types/config.js +13 -1
  51. package/dist/types/config.js.map +1 -1
  52. package/dist/types/query.d.ts +4 -0
  53. package/dist/types/query.d.ts.map +1 -1
  54. package/dist/types/schema.d.ts +35 -0
  55. package/dist/types/schema.d.ts.map +1 -1
  56. package/dist/types/search.d.ts +223 -0
  57. package/dist/types/search.d.ts.map +1 -0
  58. package/dist/types/search.js +54 -0
  59. package/dist/types/search.js.map +1 -0
  60. package/dist/types/warming.d.ts +1 -1
  61. package/dist/types/warming.d.ts.map +1 -1
  62. package/dist/utils/case-converter.d.ts +38 -0
  63. package/dist/utils/case-converter.d.ts.map +1 -0
  64. package/dist/utils/case-converter.js +90 -0
  65. package/dist/utils/case-converter.js.map +1 -0
  66. package/dist/warming/auto-warming-manager.d.ts.map +1 -1
  67. package/dist/warming/auto-warming-manager.js +5 -0
  68. package/dist/warming/auto-warming-manager.js.map +1 -1
  69. package/package.json +7 -3
  70. package/dist/best-practice-example.d.ts +0 -35
  71. package/dist/best-practice-example.d.ts.map +0 -1
  72. package/dist/best-practice-example.js +0 -171
  73. package/dist/best-practice-example.js.map +0 -1
  74. package/dist/db-schema.d.ts +0 -413
  75. package/dist/db-schema.d.ts.map +0 -1
  76. package/dist/db-schema.js +0 -1149
  77. package/dist/db-schema.js.map +0 -1
  78. package/dist/demo-debug.d.ts +0 -2
  79. package/dist/demo-debug.d.ts.map +0 -1
  80. package/dist/demo-debug.js +0 -36
  81. package/dist/demo-debug.js.map +0 -1
  82. package/dist/smart-cache/cache/cache-key-builder.d.ts +0 -17
  83. package/dist/smart-cache/cache/cache-key-builder.d.ts.map +0 -1
  84. package/dist/smart-cache/cache/cache-key-builder.js +0 -100
  85. package/dist/smart-cache/cache/cache-key-builder.js.map +0 -1
  86. package/dist/smart-cache/cache/cache-manager.d.ts +0 -22
  87. package/dist/smart-cache/cache/cache-manager.d.ts.map +0 -1
  88. package/dist/smart-cache/cache/cache-manager.js +0 -124
  89. package/dist/smart-cache/cache/cache-manager.js.map +0 -1
  90. package/dist/smart-cache/cache/invalidation.d.ts +0 -15
  91. package/dist/smart-cache/cache/invalidation.d.ts.map +0 -1
  92. package/dist/smart-cache/cache/invalidation.js +0 -59
  93. package/dist/smart-cache/cache/invalidation.js.map +0 -1
  94. package/dist/smart-cache/client.d.ts +0 -36
  95. package/dist/smart-cache/client.d.ts.map +0 -1
  96. package/dist/smart-cache/client.js +0 -138
  97. package/dist/smart-cache/client.js.map +0 -1
  98. package/dist/smart-cache/connection/mariadb.d.ts +0 -14
  99. package/dist/smart-cache/connection/mariadb.d.ts.map +0 -1
  100. package/dist/smart-cache/connection/mariadb.js +0 -82
  101. package/dist/smart-cache/connection/mariadb.js.map +0 -1
  102. package/dist/smart-cache/connection/redis.d.ts +0 -20
  103. package/dist/smart-cache/connection/redis.d.ts.map +0 -1
  104. package/dist/smart-cache/connection/redis.js +0 -168
  105. package/dist/smart-cache/connection/redis.js.map +0 -1
  106. package/dist/smart-cache/discovery/dependency-graph.d.ts +0 -20
  107. package/dist/smart-cache/discovery/dependency-graph.d.ts.map +0 -1
  108. package/dist/smart-cache/discovery/dependency-graph.js +0 -89
  109. package/dist/smart-cache/discovery/dependency-graph.js.map +0 -1
  110. package/dist/smart-cache/discovery/relationship-parser.d.ts +0 -10
  111. package/dist/smart-cache/discovery/relationship-parser.d.ts.map +0 -1
  112. package/dist/smart-cache/discovery/relationship-parser.js +0 -40
  113. package/dist/smart-cache/discovery/relationship-parser.js.map +0 -1
  114. package/dist/smart-cache/discovery/schema-reader.d.ts +0 -15
  115. package/dist/smart-cache/discovery/schema-reader.d.ts.map +0 -1
  116. package/dist/smart-cache/discovery/schema-reader.js +0 -82
  117. package/dist/smart-cache/discovery/schema-reader.js.map +0 -1
  118. package/dist/smart-cache/examples/basic-usage.d.ts +0 -3
  119. package/dist/smart-cache/examples/basic-usage.d.ts.map +0 -1
  120. package/dist/smart-cache/examples/basic-usage.js +0 -105
  121. package/dist/smart-cache/examples/basic-usage.js.map +0 -1
  122. package/dist/smart-cache/examples/hooks-example.d.ts +0 -3
  123. package/dist/smart-cache/examples/hooks-example.d.ts.map +0 -1
  124. package/dist/smart-cache/examples/hooks-example.js +0 -133
  125. package/dist/smart-cache/examples/hooks-example.js.map +0 -1
  126. package/dist/smart-cache/examples/relationships-example.d.ts +0 -3
  127. package/dist/smart-cache/examples/relationships-example.d.ts.map +0 -1
  128. package/dist/smart-cache/examples/relationships-example.js +0 -88
  129. package/dist/smart-cache/examples/relationships-example.js.map +0 -1
  130. package/dist/smart-cache/hooks/hooks-manager.d.ts +0 -22
  131. package/dist/smart-cache/hooks/hooks-manager.d.ts.map +0 -1
  132. package/dist/smart-cache/hooks/hooks-manager.js +0 -117
  133. package/dist/smart-cache/hooks/hooks-manager.js.map +0 -1
  134. package/dist/smart-cache/index.d.ts +0 -19
  135. package/dist/smart-cache/index.d.ts.map +0 -1
  136. package/dist/smart-cache/index.js +0 -49
  137. package/dist/smart-cache/index.js.map +0 -1
  138. package/dist/smart-cache/query/operations.d.ts +0 -31
  139. package/dist/smart-cache/query/operations.d.ts.map +0 -1
  140. package/dist/smart-cache/query/operations.js +0 -187
  141. package/dist/smart-cache/query/operations.js.map +0 -1
  142. package/dist/smart-cache/query/query-builder.d.ts +0 -15
  143. package/dist/smart-cache/query/query-builder.d.ts.map +0 -1
  144. package/dist/smart-cache/query/query-builder.js +0 -169
  145. package/dist/smart-cache/query/query-builder.js.map +0 -1
  146. package/dist/smart-cache/query/table-proxy.d.ts +0 -11
  147. package/dist/smart-cache/query/table-proxy.d.ts.map +0 -1
  148. package/dist/smart-cache/query/table-proxy.js +0 -25
  149. package/dist/smart-cache/query/table-proxy.js.map +0 -1
  150. package/dist/smart-cache/types/cache.d.ts +0 -29
  151. package/dist/smart-cache/types/cache.d.ts.map +0 -1
  152. package/dist/smart-cache/types/cache.js +0 -10
  153. package/dist/smart-cache/types/cache.js.map +0 -1
  154. package/dist/smart-cache/types/config.d.ts +0 -47
  155. package/dist/smart-cache/types/config.d.ts.map +0 -1
  156. package/dist/smart-cache/types/config.js +0 -27
  157. package/dist/smart-cache/types/config.js.map +0 -1
  158. package/dist/smart-cache/types/query.d.ts +0 -36
  159. package/dist/smart-cache/types/query.d.ts.map +0 -1
  160. package/dist/smart-cache/types/query.js +0 -3
  161. package/dist/smart-cache/types/query.js.map +0 -1
  162. package/dist/smart-cache/types/schema.d.ts +0 -25
  163. package/dist/smart-cache/types/schema.d.ts.map +0 -1
  164. package/dist/smart-cache/types/schema.js +0 -3
  165. package/dist/smart-cache/types/schema.js.map +0 -1
  166. package/dist/trial.d.ts +0 -7
  167. package/dist/trial.d.ts.map +0 -1
  168. package/dist/trial.js +0 -30
  169. package/dist/trial.js.map +0 -1
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+ /**
3
+ * Search Ranker
4
+ *
5
+ * Implements ranking algorithms for search results:
6
+ * - TF-IDF (Term Frequency - Inverse Document Frequency)
7
+ * - Field boosting (title matches rank higher than description)
8
+ * - Proximity scoring (words closer together rank higher)
9
+ * - Freshness scoring (newer documents rank higher - optional)
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SearchRanker = void 0;
13
+ exports.createRanker = createRanker;
14
+ const search_1 = require("../types/search");
15
+ class SearchRanker {
16
+ constructor(weights) {
17
+ this.weights = {
18
+ ...search_1.DEFAULT_RANKING_WEIGHTS,
19
+ ...weights,
20
+ };
21
+ }
22
+ /**
23
+ * Calculate TF-IDF score for a term in a document
24
+ *
25
+ * TF (Term Frequency): How often does the term appear in this document?
26
+ * IDF (Inverse Document Frequency): How rare is this term across all documents?
27
+ *
28
+ * Formula: TF-IDF = TF * IDF
29
+ * where:
30
+ * TF = (term frequency in document) / (total terms in document)
31
+ * IDF = log((total documents) / (documents containing term))
32
+ */
33
+ calculateTfIdf(context) {
34
+ const { termFrequency, docFrequency, totalDocs } = context;
35
+ // Term Frequency (TF)
36
+ // Normalize by document length (not available here, so use raw frequency)
37
+ const tf = termFrequency;
38
+ // Inverse Document Frequency (IDF)
39
+ // Add 1 to avoid division by zero
40
+ const idf = Math.log((totalDocs + 1) / (docFrequency + 1));
41
+ return tf * idf;
42
+ }
43
+ /**
44
+ * Calculate field boost score
45
+ * Fields with higher boost values rank better
46
+ */
47
+ calculateFieldBoost(fieldBoost) {
48
+ return fieldBoost;
49
+ }
50
+ /**
51
+ * Calculate proximity score
52
+ * Documents where query terms appear close together rank higher
53
+ */
54
+ calculateProximityScore(proximityScore) {
55
+ return proximityScore || 0;
56
+ }
57
+ /**
58
+ * Calculate freshness score (optional)
59
+ * Newer documents rank higher
60
+ */
61
+ calculateFreshnessScore(createdAt, decayDays = 30) {
62
+ if (!createdAt)
63
+ return 0;
64
+ const now = Date.now();
65
+ const ageMs = now - createdAt;
66
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
67
+ // Exponential decay: score decreases as document ages
68
+ // After 30 days, score is ~0.5
69
+ // After 60 days, score is ~0.25
70
+ return Math.exp(-ageDays / decayDays);
71
+ }
72
+ /**
73
+ * Calculate combined score for a document
74
+ */
75
+ calculateScore(context) {
76
+ const tfIdf = this.calculateTfIdf(context);
77
+ const fieldBoost = this.calculateFieldBoost(context.fieldBoost);
78
+ const proximity = this.calculateProximityScore(context.proximityScore);
79
+ // Combine scores with weights
80
+ let score = tfIdf * this.weights.tfIdfWeight +
81
+ fieldBoost * this.weights.fieldBoostWeight +
82
+ proximity * this.weights.proximityWeight;
83
+ // Normalize to 0-1 range
84
+ score = Math.min(1, score / 10); // Divide by 10 as rough normalization
85
+ return score;
86
+ }
87
+ /**
88
+ * Rank search results by relevance
89
+ */
90
+ rankResults(results, queryTerms, termStats, totalDocs, fieldBoosts, proximityScores) {
91
+ const scored = [];
92
+ for (const result of results) {
93
+ let totalScore = 0;
94
+ const matchedTerms = [];
95
+ // Calculate score for each query term
96
+ for (const term of queryTerms) {
97
+ const stats = termStats.get(term);
98
+ if (!stats)
99
+ continue;
100
+ const termFreq = stats.termFrequenciesByDoc.get(result.docId);
101
+ if (!termFreq)
102
+ continue;
103
+ matchedTerms.push(term);
104
+ // Calculate score for this term
105
+ const context = {
106
+ term,
107
+ docId: result.docId,
108
+ termFrequency: termFreq,
109
+ docFrequency: stats.docFrequency,
110
+ totalDocs,
111
+ fieldBoost: this.getAverageFieldBoost(fieldBoosts || {}),
112
+ proximityScore: proximityScores?.get(result.docId),
113
+ };
114
+ totalScore += this.calculateScore(context);
115
+ }
116
+ // Average score across all matched terms
117
+ const avgScore = matchedTerms.length > 0 ? totalScore / matchedTerms.length : 0;
118
+ scored.push({
119
+ score: avgScore,
120
+ data: result.data,
121
+ matchedTerms,
122
+ });
123
+ }
124
+ // Sort by score (highest first)
125
+ scored.sort((a, b) => b.score - a.score);
126
+ return scored;
127
+ }
128
+ /**
129
+ * Get average field boost value
130
+ */
131
+ getAverageFieldBoost(fieldBoosts) {
132
+ const values = Object.values(fieldBoosts);
133
+ if (values.length === 0)
134
+ return 1.0;
135
+ const sum = values.reduce((acc, val) => acc + val, 0);
136
+ return sum / values.length;
137
+ }
138
+ /**
139
+ * Calculate BM25 score (more advanced than TF-IDF)
140
+ *
141
+ * BM25 is a ranking function used by search engines.
142
+ * It's an improvement over TF-IDF with better handling of:
143
+ * - Document length normalization
144
+ * - Term saturation (diminishing returns for high TF)
145
+ *
146
+ * Formula: BM25 = IDF * (TF * (k1 + 1)) / (TF + k1 * (1 - b + b * (docLen / avgDocLen)))
147
+ * where:
148
+ * k1 = term frequency saturation parameter (typical: 1.2-2.0)
149
+ * b = length normalization parameter (typical: 0.75)
150
+ */
151
+ calculateBM25(termFrequency, docFrequency, totalDocs, docLength, avgDocLength, k1 = 1.5, b = 0.75) {
152
+ // IDF component (same as TF-IDF)
153
+ const idf = Math.log((totalDocs - docFrequency + 0.5) / (docFrequency + 0.5) + 1);
154
+ // TF component with saturation and length normalization
155
+ const numerator = termFrequency * (k1 + 1);
156
+ const denominator = termFrequency + k1 * (1 - b + b * (docLength / avgDocLength));
157
+ const tf = numerator / denominator;
158
+ return idf * tf;
159
+ }
160
+ /**
161
+ * Highlight search terms in text
162
+ */
163
+ highlightText(text, terms, preTag = '<mark>', postTag = '</mark>', tokenizer) {
164
+ if (!text || terms.length === 0) {
165
+ return text;
166
+ }
167
+ // Create regex pattern for all terms (case-insensitive)
168
+ // Escape special regex characters
169
+ const escapedTerms = terms.map(term => term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
170
+ // Match whole words only
171
+ const pattern = new RegExp(`\\b(${escapedTerms.join('|')})\\b`, 'gi');
172
+ // Replace matches with highlighted version
173
+ return text.replace(pattern, `${preTag}$1${postTag}`);
174
+ }
175
+ /**
176
+ * Generate text snippet with highlighted terms
177
+ */
178
+ generateSnippet(text, terms, maxLength = 150, preTag = '<mark>', postTag = '</mark>') {
179
+ if (!text)
180
+ return '';
181
+ // Find first occurrence of any search term
182
+ const lowerText = text.toLowerCase();
183
+ const lowerTerms = terms.map(t => t.toLowerCase());
184
+ let firstIndex = -1;
185
+ for (const term of lowerTerms) {
186
+ const index = lowerText.indexOf(term);
187
+ if (index !== -1 && (firstIndex === -1 || index < firstIndex)) {
188
+ firstIndex = index;
189
+ }
190
+ }
191
+ if (firstIndex === -1) {
192
+ // No terms found, return start of text
193
+ return text.substring(0, maxLength) + (text.length > maxLength ? '...' : '');
194
+ }
195
+ // Calculate snippet boundaries
196
+ const contextLength = Math.floor((maxLength - 20) / 2);
197
+ let start = Math.max(0, firstIndex - contextLength);
198
+ let end = Math.min(text.length, firstIndex + contextLength);
199
+ // Adjust to word boundaries
200
+ if (start > 0) {
201
+ const spaceIndex = text.lastIndexOf(' ', start);
202
+ if (spaceIndex !== -1)
203
+ start = spaceIndex + 1;
204
+ }
205
+ if (end < text.length) {
206
+ const spaceIndex = text.indexOf(' ', end);
207
+ if (spaceIndex !== -1)
208
+ end = spaceIndex;
209
+ }
210
+ // Extract snippet
211
+ let snippet = text.substring(start, end);
212
+ // Add ellipsis
213
+ if (start > 0)
214
+ snippet = '...' + snippet;
215
+ if (end < text.length)
216
+ snippet = snippet + '...';
217
+ // Highlight terms
218
+ snippet = this.highlightText(snippet, terms, preTag, postTag);
219
+ return snippet;
220
+ }
221
+ /**
222
+ * Calculate proximity between multiple terms in a document
223
+ */
224
+ calculateMultiTermProximity(tokens, queryTerms) {
225
+ if (queryTerms.length <= 1)
226
+ return 0;
227
+ const positions = new Map();
228
+ // Collect positions for each query term
229
+ for (const token of tokens) {
230
+ if (queryTerms.includes(token.term)) {
231
+ if (!positions.has(token.term)) {
232
+ positions.set(token.term, []);
233
+ }
234
+ positions.get(token.term).push(...token.positions);
235
+ }
236
+ }
237
+ // If not all terms found, proximity is 0
238
+ if (positions.size < queryTerms.length) {
239
+ return 0;
240
+ }
241
+ // Calculate minimum span containing all terms
242
+ const allPositions = Array.from(positions.values());
243
+ let minSpan = Infinity;
244
+ // For each position of the first term
245
+ for (const pos1 of allPositions[0]) {
246
+ // Find closest position of other terms
247
+ let maxDistance = 0;
248
+ for (let i = 1; i < allPositions.length; i++) {
249
+ const positions = allPositions[i];
250
+ // Find closest position to pos1
251
+ let minDistance = Infinity;
252
+ for (const pos of positions) {
253
+ const distance = Math.abs(pos - pos1);
254
+ minDistance = Math.min(minDistance, distance);
255
+ }
256
+ maxDistance = Math.max(maxDistance, minDistance);
257
+ }
258
+ minSpan = Math.min(minSpan, maxDistance);
259
+ }
260
+ // Convert span to score (closer = higher score)
261
+ if (minSpan === 0)
262
+ return 1.0;
263
+ if (minSpan <= 2)
264
+ return 0.9;
265
+ if (minSpan <= 5)
266
+ return 0.7;
267
+ if (minSpan <= 10)
268
+ return 0.5;
269
+ if (minSpan <= 20)
270
+ return 0.3;
271
+ return 0.1;
272
+ }
273
+ }
274
+ exports.SearchRanker = SearchRanker;
275
+ /**
276
+ * Helper function to create ranker with custom weights
277
+ */
278
+ function createRanker(weights) {
279
+ return new SearchRanker(weights);
280
+ }
281
+ //# sourceMappingURL=search-ranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-ranker.js","sourceRoot":"","sources":["../../src/search/search-ranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Text Tokenizer
3
+ *
4
+ * Converts text into searchable tokens using various strategies:
5
+ * - Simple: Split by whitespace, lowercase
6
+ * - Stemming: Reduce words to root form (running → run)
7
+ * - N-gram: Split into character sequences (plumb → pl, plu, lum, umb)
8
+ */
9
+ import { TokenizerOptions, TokenMetadata } from '../types/search';
10
+ export declare class Tokenizer {
11
+ private options;
12
+ constructor(options: Partial<TokenizerOptions>);
13
+ /**
14
+ * Tokenize text into searchable terms
15
+ */
16
+ tokenize(text: string, field?: string): TokenMetadata[];
17
+ /**
18
+ * Simple tokenization: split by whitespace, lowercase, remove punctuation
19
+ */
20
+ private tokenizeSimple;
21
+ /**
22
+ * Stemming tokenization: reduce words to root form
23
+ * Uses Porter Stemmer algorithm (simplified)
24
+ */
25
+ private tokenizeStemming;
26
+ /**
27
+ * N-gram tokenization: split into character sequences
28
+ * Example: "plumb" with n=3 → ["plu", "lum", "umb"]
29
+ */
30
+ private tokenizeNgram;
31
+ /**
32
+ * Porter Stemmer (simplified version)
33
+ * Reduces words to their root form
34
+ */
35
+ private stem;
36
+ private step1;
37
+ private step2;
38
+ private step3;
39
+ private step4;
40
+ private step5;
41
+ /**
42
+ * Measure the "size" of a word (number of consonant-vowel sequences)
43
+ */
44
+ private measureWord;
45
+ /**
46
+ * Check if word contains a vowel
47
+ */
48
+ private hasVowel;
49
+ /**
50
+ * Check if word ends with consonant-vowel-consonant pattern
51
+ */
52
+ private endsWithCVC;
53
+ /**
54
+ * Fix word ending after removing suffix
55
+ * Example: "hopping" → "hopp" → "hop"
56
+ */
57
+ private fixEnding;
58
+ /**
59
+ * Merge duplicate terms and combine their positions
60
+ */
61
+ private mergePositions;
62
+ /**
63
+ * Get all unique terms from tokens (useful for indexing)
64
+ */
65
+ getUniqueTerms(tokens: TokenMetadata[]): string[];
66
+ /**
67
+ * Calculate proximity score between terms
68
+ * Terms closer together get higher scores
69
+ */
70
+ calculateProximity(tokens: TokenMetadata[], term1: string, term2: string): number;
71
+ }
72
+ /**
73
+ * Helper function to create tokenizer from config
74
+ */
75
+ export declare function createTokenizer(type: 'simple' | 'stemming' | 'ngram', options?: Partial<TokenizerOptions>): Tokenizer;
76
+ /**
77
+ * Helper function to tokenize multiple fields
78
+ */
79
+ export declare function tokenizeFields(tokenizer: Tokenizer, data: Record<string, any>, fields: string[]): TokenMetadata[];
80
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/search/tokenizer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC;AAEtF,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;gBAEhC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAU9C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAkB,GAAG,aAAa,EAAE;IAiBlE;;OAEG;IACH,OAAO,CAAC,cAAc;IAyCtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAqCrB;;;OAGG;IACH,OAAO,CAAC,IAAI;IAmBZ,OAAO,CAAC,KAAK;IAqCb,OAAO,CAAC,KAAK;IAoCb,OAAO,CAAC,KAAK;IAuBb,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,KAAK;IAkBb;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAuBjB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,EAAE;IAIjD;;;OAGG;IACH,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;CA0BlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,EACrC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAClC,SAAS,CAKX;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,EAAE,MAAM,EAAE,GACf,aAAa,EAAE,CAYjB"}