|
1 |
| -import type { GenericObject, QueryFilter, QueryFilterGroup, QueryParams, QueryResult } from './types' |
2 |
| -import { getObjectProperty, processFilterWithLookup, processSearchQuery } from './utils' |
| 1 | +import type { FilterOptions, GenericObject, QueryFilter, QueryFilterGroup, QueryParams, QueryResult } from './types' |
| 2 | +import { getObjectProperty, getOperator, processFilterWithLookup, processSearchQuery } from './utils' |
3 | 3 |
|
4 | 4 | export function query<T extends GenericObject, P extends QueryParams<T>>(
|
5 | 5 | data: T[],
|
@@ -33,17 +33,19 @@ function matchesSearch<T extends GenericObject>(item: T, search?: QueryParams<T>
|
33 | 33 | })
|
34 | 34 | }
|
35 | 35 |
|
36 |
| -function matchesFilters<T extends GenericObject>(item: T, filters?: (QueryFilter | QueryFilterGroup)[]): boolean { |
37 |
| - if (!filters || filters.length === 0) |
| 36 | +function matchesFilters<T extends GenericObject>(item: T, filters?: FilterOptions): boolean { |
| 37 | + const _filters = (typeof filters === 'object' && ('groups' in filters) ? filters.groups : filters) ?? [] |
| 38 | + if (!_filters || _filters.length === 0) |
38 | 39 | return true
|
39 |
| - const isGroup = filters.every(filter => 'filters' in filter) |
40 |
| - const method = isGroup ? 'some' : 'every' |
41 |
| - return filters.filter(filter => filter.condition?.() ?? true)[method]((group: QueryFilter | QueryFilterGroup) => { |
| 40 | + const isGroup = _filters.every(filter => 'filters' in filter) |
| 41 | + const groupOperator = getOperator(typeof filters === 'object' && 'operator' in filters ? filters.operator : 'OR') |
| 42 | + const method = isGroup ? (groupOperator === 'AND' ? 'every' : 'some') : 'every' |
| 43 | + return _filters.filter(filter => filter.condition?.() ?? true)[method]((group: QueryFilter | QueryFilterGroup) => { |
42 | 44 | const groupFilters = 'filters' in group ? group.filters : [group]
|
43 | 45 | const op = 'filters' in group ? group.operator : 'OR'
|
44 | 46 | return groupFilters.filter(filter => filter.condition?.() ?? true)[op === 'AND' ? 'every' : 'some']((filter: QueryFilter) => {
|
45 | 47 | const value = getObjectProperty(item, filter.key)
|
46 |
| - const operator = typeof filter.operator === 'function' ? filter.operator() : filter.operator ?? 'OR' |
| 48 | + const operator = getOperator(filter.operator) |
47 | 49 | const params = (!('params' in filter) ? null : typeof filter.params === 'function' ? filter.params(filter.value) : filter.params) ?? null
|
48 | 50 | return processFilterWithLookup({
|
49 | 51 | type: filter.matchMode,
|
@@ -113,7 +115,7 @@ function* lazySortedQuery<T extends GenericObject>(
|
113 | 115 |
|
114 | 116 | function paginateQuery<T extends GenericObject, P extends QueryParams<T>>(data: Iterable<T>, params: P): QueryResult<T, P> {
|
115 | 117 | if (typeof params.limit === 'undefined') {
|
116 |
| - return { rows: Array.from(data) } as QueryResult<T, P> |
| 118 | + return Array.from(data) as QueryResult<T, P> |
117 | 119 | }
|
118 | 120 |
|
119 | 121 | else {
|
|
0 commit comments