mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2026-01-18 23:52:52 +00:00
feat: add support for new availability filter
This commit is contained in:
@@ -310,6 +310,15 @@ export interface ESGenericRange<T> {
|
||||
* Less or equal than field
|
||||
*/
|
||||
lte?: T;
|
||||
|
||||
/**
|
||||
* Relation of the range to a range field
|
||||
*
|
||||
* Intersects: Both ranges intersect
|
||||
* Contains: Search range contains field range
|
||||
* Within: Field range contains search range
|
||||
*/
|
||||
relation?: 'intersects' | 'within' | 'contains';
|
||||
}
|
||||
|
||||
interface ESGenericRangeFilter<G, T extends ESGenericRange<G>> {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2019 StApps
|
||||
* Copyright (C) 2019-2021 StApps
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
@@ -109,62 +109,16 @@ export function buildFilter(filter: SCSearchFilter):
|
||||
},
|
||||
};
|
||||
case 'availability':
|
||||
const startRangeFilter: {
|
||||
[field: string]: {
|
||||
/**
|
||||
* Less than or equal
|
||||
*/
|
||||
lte: string;
|
||||
};
|
||||
} = {};
|
||||
startRangeFilter[filter.arguments.fromField] = {
|
||||
lte: filter.arguments.time ?? 'now',
|
||||
};
|
||||
|
||||
const endRangeFilter: {
|
||||
[field: string]: {
|
||||
/**
|
||||
* Greater than or equal
|
||||
*/
|
||||
gte: string;
|
||||
};
|
||||
} = {};
|
||||
endRangeFilter[filter.arguments.toField] = {
|
||||
gte: filter.arguments.time ?? 'now',
|
||||
};
|
||||
const scope = filter.arguments.scope?.charAt(0) ?? 's';
|
||||
const time = typeof filter.arguments.time === 'undefined' ? 'now' : `${filter.arguments.time}||`;
|
||||
|
||||
return {
|
||||
bool: {
|
||||
should: [
|
||||
{
|
||||
bool: {
|
||||
must: [
|
||||
{
|
||||
range: startRangeFilter,
|
||||
},
|
||||
{
|
||||
range: endRangeFilter,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
bool: {
|
||||
must_not: [
|
||||
{
|
||||
exists: {
|
||||
field: filter.arguments.fromField,
|
||||
},
|
||||
},
|
||||
{
|
||||
exists: {
|
||||
field: filter.arguments.toField,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
range: {
|
||||
[filter.arguments.field]: {
|
||||
gte: `${time}/${scope}`,
|
||||
lt: `${time}+1${scope}/${scope}`,
|
||||
relation: 'intersects',
|
||||
},
|
||||
},
|
||||
};
|
||||
case 'distance':
|
||||
@@ -184,7 +138,9 @@ export function buildFilter(filter: SCSearchFilter):
|
||||
bool: buildBooleanFilter(filter),
|
||||
};
|
||||
case 'numeric range':
|
||||
const numericRangeObject: ESGenericRange<number> = {};
|
||||
const numericRangeObject: ESGenericRange<number> = {
|
||||
relation: filter.arguments.relation,
|
||||
};
|
||||
if (filter.arguments.bounds.lowerBound?.mode === 'exclusive') {
|
||||
numericRangeObject.gt = filter.arguments.bounds.lowerBound.limit;
|
||||
} else if (filter.arguments.bounds.lowerBound?.mode === 'inclusive') {
|
||||
@@ -201,7 +157,11 @@ export function buildFilter(filter: SCSearchFilter):
|
||||
|
||||
return numericRangeFilter;
|
||||
case 'date range':
|
||||
const dateRangeObject: ESDateRange = {};
|
||||
const dateRangeObject: ESDateRange = {
|
||||
format: filter.arguments.format,
|
||||
time_zone: filter.arguments.timeZone,
|
||||
relation: filter.arguments.relation,
|
||||
};
|
||||
if (filter.arguments.bounds.lowerBound?.mode === 'exclusive') {
|
||||
dateRangeObject.gt = filter.arguments.bounds.lowerBound.limit;
|
||||
} else if (filter.arguments.bounds.lowerBound?.mode === 'inclusive') {
|
||||
@@ -212,8 +172,6 @@ export function buildFilter(filter: SCSearchFilter):
|
||||
} else if (filter.arguments.bounds.upperBound?.mode === 'inclusive') {
|
||||
dateRangeObject.lte = filter.arguments.bounds.upperBound.limit;
|
||||
}
|
||||
dateRangeObject.format = filter.arguments.format;
|
||||
dateRangeObject.time_zone = filter.arguments.timeZone;
|
||||
|
||||
const dateRangeFilter: ESDateRangeFilter = {range: {}};
|
||||
dateRangeFilter.range[filter.arguments.field] = dateRangeObject;
|
||||
|
||||
Reference in New Issue
Block a user