(query: string, maxExpansions: number)
| 425 | } |
| 426 | |
| 427 | private buildQueryVariants(query: string, maxExpansions: number): QueryVariant[] { |
| 428 | const variants: QueryVariant[] = [{ query, weight: 1 }]; |
| 429 | if (maxExpansions <= 0) return variants; |
| 430 | |
| 431 | const normalized = query.toLowerCase(); |
| 432 | const terms = new Set(this.normalizeQueryTerms(query)); |
| 433 | |
| 434 | for (const hint of QUERY_EXPANSION_HINTS) { |
| 435 | if (!hint.pattern.test(query)) continue; |
| 436 | for (const term of hint.terms) { |
| 437 | if (!normalized.includes(term)) { |
| 438 | terms.add(term); |
| 439 | } |
| 440 | } |
| 441 | } |
| 442 | |
| 443 | const addedTerms = Array.from(terms).filter((term) => !normalized.includes(term)); |
| 444 | if (addedTerms.length === 0) return variants; |
| 445 | |
| 446 | const firstExpansion = `${query} ${addedTerms.slice(0, 6).join(' ')}`.trim(); |
| 447 | if (firstExpansion !== query) { |
| 448 | variants.push({ query: firstExpansion, weight: 0.35 }); |
| 449 | } |
| 450 | |
| 451 | if (maxExpansions > 1 && addedTerms.length > 6) { |
| 452 | const secondExpansion = `${query} ${addedTerms.slice(6, 12).join(' ')}`.trim(); |
| 453 | if (secondExpansion !== query) { |
| 454 | variants.push({ query: secondExpansion, weight: 0.25 }); |
| 455 | } |
| 456 | } |
| 457 | |
| 458 | return variants.slice(0, 1 + maxExpansions); |
| 459 | } |
| 460 | |
| 461 | private isTemplateOrStyleFile(filePath: string): boolean { |
| 462 | const ext = path.extname(filePath).toLowerCase(); |
no test coverage detected