Remove old fuzzy search
parent
804d87436c
commit
9dd7a5310b
|
@ -1,40 +0,0 @@
|
||||||
import { FilterOption } from "../types.ts";
|
|
||||||
import { assertEquals } from "../../test_deps.ts";
|
|
||||||
import { fuzzySearchAndSort } from "./fuzzy_search.ts";
|
|
||||||
|
|
||||||
Deno.test("testFuzzyFilter", () => {
|
|
||||||
const array: FilterOption[] = [
|
|
||||||
{ name: "My Company/Hank", orderId: -5 },
|
|
||||||
{ name: "My Company/Steve Co", orderId: -5 },
|
|
||||||
{ name: "Other/Steve", orderId: -7 },
|
|
||||||
{ name: "Steve", orderId: -3 },
|
|
||||||
];
|
|
||||||
|
|
||||||
// Prioritize match in last path part
|
|
||||||
const result = fuzzySearchAndSort(array, "Co");
|
|
||||||
assertEquals(result.length, 2);
|
|
||||||
assertEquals(result[0].name, "My Company/Steve Co");
|
|
||||||
|
|
||||||
// Support slash matches
|
|
||||||
const result2 = fuzzySearchAndSort(array, "Co/St");
|
|
||||||
assertEquals(result2.length, 1);
|
|
||||||
assertEquals(result2[0].name, "My Company/Steve Co");
|
|
||||||
|
|
||||||
// Find "St" in both, but pioritize based on orderId
|
|
||||||
const result3 = fuzzySearchAndSort(array, "St");
|
|
||||||
assertEquals(result3.length, 3);
|
|
||||||
assertEquals(result3[0].name, "Other/Steve");
|
|
||||||
|
|
||||||
const result4 = fuzzySearchAndSort(array, "Steve");
|
|
||||||
assertEquals(result4[0].name, "Steve");
|
|
||||||
|
|
||||||
// const result2 = fuzzySearchAndSort(array, "");
|
|
||||||
// console.log("Result 2", result2);
|
|
||||||
// assertEquals(result.length, 3);
|
|
||||||
// assertEquals(result[0].orderId, 1);
|
|
||||||
|
|
||||||
// assertEquals(result[1].name, "Jack");
|
|
||||||
// assertEquals(result[1].orderId, 2);
|
|
||||||
// assertEquals(result[2].name, "Jill");
|
|
||||||
// assertEquals(result[2].orderId, 3);
|
|
||||||
});
|
|
|
@ -1,45 +0,0 @@
|
||||||
import { FilterOption } from "../types.ts";
|
|
||||||
|
|
||||||
export const fuzzySearchAndSort = (
|
|
||||||
arr: FilterOption[],
|
|
||||||
searchPhrase: string,
|
|
||||||
): FilterOption[] => {
|
|
||||||
// Prepare regular expression: escape special characters, add '.*' around each character
|
|
||||||
const safePhrase = searchPhrase.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // escape special characters
|
|
||||||
const searchRegex = new RegExp(Array.from(safePhrase).join(".*"), "i"); // 'i' makes it case-insensitive
|
|
||||||
|
|
||||||
// Fuzzy matching on name using the regular expression
|
|
||||||
const filtered = arr.filter((item) => searchRegex.test(item.name));
|
|
||||||
|
|
||||||
// Sorting by exact match, whether match is in part after '/', then by orderId
|
|
||||||
filtered.sort((a, b) => {
|
|
||||||
const aNamePart = a.name.includes("/")
|
|
||||||
? a.name.split("/").pop() || ""
|
|
||||||
: a.name;
|
|
||||||
const bNamePart = b.name.includes("/")
|
|
||||||
? b.name.split("/").pop() || ""
|
|
||||||
: b.name;
|
|
||||||
|
|
||||||
const aMatchInPart = searchRegex.test(aNamePart);
|
|
||||||
const bMatchInPart = searchRegex.test(bNamePart);
|
|
||||||
|
|
||||||
// Check for exact match
|
|
||||||
const aExactMatch = a.name.toLowerCase() === searchPhrase.toLowerCase();
|
|
||||||
const bExactMatch = b.name.toLowerCase() === searchPhrase.toLowerCase();
|
|
||||||
|
|
||||||
if (aExactMatch !== bExactMatch) {
|
|
||||||
// If one is an exact match and the other is not, prioritize the exact match
|
|
||||||
return aExactMatch ? -1 : 1;
|
|
||||||
} else if (aMatchInPart !== bMatchInPart) {
|
|
||||||
// If one matches in the part after '/' and the other doesn't, prioritize the one that does
|
|
||||||
return aMatchInPart ? -1 : 1;
|
|
||||||
} else {
|
|
||||||
// If both match in the same part of name, prioritize by orderId
|
|
||||||
const aOrder = a.orderId !== undefined ? a.orderId : Infinity;
|
|
||||||
const bOrder = b.orderId !== undefined ? b.orderId : Infinity;
|
|
||||||
return aOrder - bOrder;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return filtered;
|
|
||||||
};
|
|
Loading…
Reference in New Issue