contensis-core-api
Version:
A dependency library used by contensis-delivery-api and contensis-management-api
266 lines (227 loc) • 9.87 kB
text/typescript
import { ContensisQueryOperators, ExpressionValueType, ExpressionValueTypeEnum, IExpression, ILogicalExpression, OperatorType, OperatorTypeEnum } from '..';
import { fixDates } from '../../utils';
import { DistanceSearch } from './DistanceSearch';
import { ExpressionTimePrecision, ExpressionTimePrecisionEnum as TimePrecision } from './ExpressionTimePrecision';
import { FreeTextSearch } from './FreeTextSearch';
import { FreeTextSearchOperatorType, FreeTextSearchOperatorTypeEnum } from './FreeTextSearchOperatorType';
export abstract class ExpressionBase implements IExpression {
private _weight: number = 0;
constructor(public fieldName: string, public values: any[] = [],
public operatorName: OperatorType, public valueType: ExpressionValueType) {
}
addValue(value: any): ExpressionBase {
this.values[this.values.length] = value;
return this;
}
weight(weight: number): ExpressionBase {
this._weight = weight;
return this;
}
toJSON(): any {
let result: any = {};
if (this.fieldName) {
result.field = this.fieldName;
}
if (this.valueType === ExpressionValueTypeEnum.Single) {
result[this.operatorName] = this.values[0];
} else if (this.valueType === ExpressionValueTypeEnum.Array) {
result[this.operatorName] = this.values;
} else if (this.values && (this.values.length === 1)) {
result[this.operatorName] = this.values[0];
} else {
result[this.operatorName] = this.values;
}
if (this._weight && (this._weight > 1)) {
result.weight = this._weight;
}
return result;
}
}
export abstract class LogicalExpression extends ExpressionBase implements ILogicalExpression {
constructor(values: any[] = [], operatorName: OperatorType, valueType: ExpressionValueType) {
super(null, values, operatorName, ExpressionValueTypeEnum.Array);
}
getItem(index: number): IExpression {
return this.values[index];
}
setItem(index: number, item: IExpression): WhereExpression {
this.values[index] = item;
return this;
}
add(item: IExpression): WhereExpression {
this.values[this.values.length] = item;
return this;
}
addRange(items: IExpression[]): WhereExpression {
Array.prototype.push.apply(this.values, items);
return this;
}
indexOf(item: IExpression): number {
return this.values.indexOf(item);
}
insert(index: number, item: IExpression): WhereExpression {
this.values.splice(index, 0, item);
return this;
}
remove(item: IExpression): boolean {
let index = this.indexOf(item);
if (index >= 0) {
this.removeAt(index);
return true;
}
return false;
}
removeAt(index: number): WhereExpression {
this.values.splice(index, 1);
return this;
}
clear(): WhereExpression {
this.values.length = 0;
return this;
}
contains(item: IExpression): boolean {
return (this.indexOf(item) >= 0);
}
count(): number {
return this.values.length;
}
}
class AndExpression extends LogicalExpression {
constructor(values: IExpression[]) {
super(values, OperatorTypeEnum.And, ExpressionValueTypeEnum.Array);
}
}
class BetweenExpression extends ExpressionBase {
constructor(fieldName: string, minimum: any, maximum: any, timePrecision: ExpressionTimePrecision) {
super(fieldName, fixDates([minimum, maximum], timePrecision), OperatorTypeEnum.Between, ExpressionValueTypeEnum.Array);
}
}
class ContainsExpression extends ExpressionBase {
constructor(fieldName: string, value: any) {
super(fieldName, [value], OperatorTypeEnum.Contains, ExpressionValueTypeEnum.Single);
}
}
class DistanceWithinExpression extends ExpressionBase {
constructor(fieldName: string, value: DistanceSearch) {
super(fieldName, [value], OperatorTypeEnum.DistanceWithin, ExpressionValueTypeEnum.Single);
}
}
class EndsWithExpression extends ExpressionBase {
constructor(fieldName: string, value: any) {
super(fieldName, [value], OperatorTypeEnum.EndsWith, ExpressionValueTypeEnum.Single);
}
}
class EqualToExpression extends ExpressionBase {
constructor(fieldName: string, value: any) {
super(fieldName, [value], OperatorTypeEnum.EqualTo, ExpressionValueTypeEnum.Single);
}
}
class ExistsExpression extends ExpressionBase {
constructor(fieldName: string, value: any) {
super(fieldName, [value], OperatorTypeEnum.Exists, ExpressionValueTypeEnum.Single);
}
}
class FreeTextExpression extends ExpressionBase {
constructor(fieldName: string, value: FreeTextSearch) {
super(fieldName, [value], OperatorTypeEnum.FreeText, ExpressionValueTypeEnum.Single);
}
}
class GreaterThanExpression extends ExpressionBase {
constructor(fieldName: string, value: any, timePrecision: ExpressionTimePrecision) {
super(fieldName, fixDates([value], timePrecision), OperatorTypeEnum.GreaterThan, ExpressionValueTypeEnum.Single);
}
}
class GreaterThanOrEqualToExpression extends ExpressionBase {
constructor(fieldName: string, value: any, timePrecision: ExpressionTimePrecision) {
super(fieldName, fixDates([value], timePrecision), OperatorTypeEnum.GreaterThanOrEqualTo, ExpressionValueTypeEnum.Single);
}
}
class InExpression extends ExpressionBase {
constructor(fieldName: string, values: any[]) {
super(fieldName, values, OperatorTypeEnum.In, ExpressionValueTypeEnum.Array);
}
}
class LessThanExpression extends ExpressionBase {
constructor(fieldName: string, value: any, timePrecision: ExpressionTimePrecision) {
super(fieldName, fixDates([value], timePrecision), OperatorTypeEnum.LessThan, ExpressionValueTypeEnum.Single);
}
}
class LessThanOrEqualToExpression extends ExpressionBase {
constructor(fieldName: string, value: any, timePrecision: ExpressionTimePrecision) {
super(fieldName, fixDates([value], timePrecision), OperatorTypeEnum.LessThanOrEqualTo, ExpressionValueTypeEnum.Single);
}
}
class NotExpression extends LogicalExpression {
constructor(value: IExpression) {
super([value], OperatorTypeEnum.Not, ExpressionValueTypeEnum.Single);
}
}
class OrExpression extends LogicalExpression {
constructor(values: IExpression[]) {
super(values, OperatorTypeEnum.Or, ExpressionValueTypeEnum.Array);
}
}
class StartsWithExpression extends ExpressionBase {
constructor(fieldName: string, value: any) {
super(fieldName, [value], OperatorTypeEnum.StartsWith, ExpressionValueTypeEnum.Single);
}
}
export class WhereExpression extends LogicalExpression {
constructor(values: IExpression[] = []) {
super(values, OperatorTypeEnum.Where, ExpressionValueTypeEnum.Array);
}
toJSON() {
let result = super.toJSON();
return result[OperatorTypeEnum.Where];
}
}
export class Operators implements ContensisQueryOperators {
and(...values: IExpression[]): ILogicalExpression {
return new AndExpression(values);
}
between(name: string, minimum: any, maximum: any, timePrecision: ExpressionTimePrecision = TimePrecision.Minutes): IExpression {
return new BetweenExpression(name, minimum, maximum, timePrecision);
}
contains(name: string, value: string): IExpression {
return new ContainsExpression(name, value);
}
distanceWithin(name: string, lat: number, lon: number, distance: string): IExpression {
return new DistanceWithinExpression(name, { lat, lon, distance });
}
endsWith(name: string, value: string): IExpression {
return new EndsWithExpression(name, value);
}
equalTo(name: string, value: any): IExpression {
return new EqualToExpression(name, value);
}
exists(name: string, value: boolean): IExpression {
return new ExistsExpression(name, value);
}
freeText(name: string, term: string, fuzzy: boolean = false, operator: FreeTextSearchOperatorType = FreeTextSearchOperatorTypeEnum.And): IExpression {
return new FreeTextExpression(name, { term, fuzzy, operator });
}
greaterThan(name: string, value: any, timePrecision: ExpressionTimePrecision = TimePrecision.Minutes): IExpression {
return new GreaterThanExpression(name, value, timePrecision);
}
greaterThanOrEqualTo(name: string, value: any, timePrecision: ExpressionTimePrecision = TimePrecision.Minutes): IExpression {
return new GreaterThanOrEqualToExpression(name, value, timePrecision);
}
in(name: string, ...values: any[]): IExpression {
return new InExpression(name, values);
}
lessThan(name: string, value: any, timePrecision: ExpressionTimePrecision = TimePrecision.Minutes): IExpression {
return new LessThanExpression(name, value, timePrecision);
}
lessThanOrEqualTo(name: string, value: any, timePrecision: ExpressionTimePrecision = TimePrecision.Minutes): IExpression {
return new LessThanOrEqualToExpression(name, value, timePrecision);
}
not(expression: IExpression): ILogicalExpression {
return new NotExpression(expression);
}
or(...values: IExpression[]): ILogicalExpression {
return new OrExpression(values);
}
startsWith(name: string, value: string): IExpression {
return new StartsWithExpression(name, value);
}
}