hrms-edm/Services/server/src/interfaces/search.ts
2024-01-17 11:21:41 +07:00

32 lines
834 B
TypeScript

import { QueryDslQueryContainer } from "@elastic/elasticsearch/lib/api/types";
export interface SearchInfo {
field: string;
value: string;
exact?: boolean;
}
export interface SearchOperator {
AND?: (SearchInfo | SearchOperator)[];
OR?: (SearchInfo | SearchOperator)[];
}
export interface Search extends SearchOperator {
recursive?: boolean;
path?: string[];
exact?: boolean;
}
export function mapCallback(exact: boolean) {
const type = ["match", "match_phrase"] as const;
return (v: SearchInfo | SearchOperator): QueryDslQueryContainer => {
return "field" in v && "value" in v
? { [type[exact || v.exact ? 1 : 0]]: { [v.field]: v.value } }
: {
bool: {
must: v.AND?.map(mapCallback(exact)),
should: v.OR?.map(mapCallback(exact)),
},
};
};
}