mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-19 16:16:45 +00:00
fix(elasticsearch): support fuzzy index completion
This commit is contained in:
@@ -242,7 +242,7 @@ function pathItems(context: ElasticsearchCompletionContext, indices: string[]):
|
||||
|
||||
function indexItems(prefix: string, indices: string[]): ElasticsearchCompletionItem[] {
|
||||
return indices
|
||||
.filter((index) => matchesFuzzyPrefix(index, prefix))
|
||||
.filter((index) => matchesIndexFuzzyPrefix(index, prefix))
|
||||
.slice(0, 100)
|
||||
.map((index) => ({
|
||||
label: index,
|
||||
@@ -373,6 +373,18 @@ function matchesPrefix(value: string, prefix: string): boolean {
|
||||
return value.toLowerCase().startsWith(prefix.toLowerCase());
|
||||
}
|
||||
|
||||
function matchesIndexFuzzyPrefix(value: string, prefix: string): boolean {
|
||||
const normalizedValue = value.toLowerCase();
|
||||
const normalizedPrefix = prefix.toLowerCase();
|
||||
let from = 0;
|
||||
for (const char of normalizedPrefix) {
|
||||
const position = normalizedValue.indexOf(char, from);
|
||||
if (position < 0) return false;
|
||||
from = position + char.length;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function matchesFuzzyPrefix(value: string, prefix: string): boolean {
|
||||
const normalizedValue = value.toLowerCase();
|
||||
const normalizedPrefix = prefix.toLowerCase();
|
||||
|
||||
@@ -60,6 +60,18 @@ test("suggests Elasticsearch indices by prefix", () => {
|
||||
);
|
||||
});
|
||||
|
||||
test("suggests Elasticsearch indices by case-insensitive ordered cross-segment match", () => {
|
||||
const text = "GET /MiM";
|
||||
const items = buildElasticsearchCompletionItems(text, text.length, {
|
||||
indices: ["my_index_misc_20260907", "my_index_logs_20260907"],
|
||||
});
|
||||
|
||||
assert.deepEqual(
|
||||
items.filter((item) => item.detail === "index").map((item) => item.label),
|
||||
["my_index_misc_20260907"],
|
||||
);
|
||||
});
|
||||
|
||||
test("index completion preserves endpoint suffix after cursor", () => {
|
||||
const text = "GET /ord/_search";
|
||||
const cursor = "GET /ord".length;
|
||||
|
||||
Reference in New Issue
Block a user