feat: add support for new availability filter

This commit is contained in:
Wieland Schöbl
2021-05-03 17:34:36 +02:00
parent 334f5a7507
commit 47f3232f15
6 changed files with 136 additions and 171 deletions

View File

@@ -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>> {

View File

@@ -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;