-
Notifications
You must be signed in to change notification settings - Fork 8
/
Restriction.ts
52 lines (45 loc) · 1.54 KB
/
Restriction.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import {Comparator, Comparators} from './Comparator';
import {log, catAPI} from './Log';
const namePattern = /^(.*?)\s+(eq|ne|ilike|like|gt|lt|ge|le|null|isnull|notnull)\s+(.*?)$/i;
const symbolPattern = /^(\w+?)\s*(\=\=|\=|\!\=|\>\=|\<\=|\>|\<)\s*(\w+?)$/;
/**
* A query restriction.
* @module Restriction
*/
export class Restriction {
/**
* Convert a filter string into a restriction.
*/
public static fromString(filter: string) {
let match = filter.match(namePattern);
if (!match) {
match = filter.match(symbolPattern);
}
if (match) {
const comp = Comparator.find(match[2]);
if (comp) {
return new Restriction(match[1], comp, match[3]);
}
log.warn('Restriction.fromString matched "' + filter +
'", but was unable to match "' + match[2] + '" to a comparator.', catAPI);
} else {
log.debug('Restriction.fromString failed to match "' + filter + '".', catAPI);
}
return null;
}
/** The model attribute (name, id, etc.) to query. */
public attribute: string;
/** The comparator to use when querying. */
public comparator: Comparator;
/** The value to compare the attribute property to. */
public value?: any;
constructor(attribute: string, comparator: Comparator, value?: any) {
this.attribute = attribute;
this.comparator = comparator;
this.value = value;
}
/** A human-readable string for this restriction. */
public toString() {
return this.attribute + ' ' + this.comparator.label + (this.value === undefined ? '' : ' ' + this.value);
}
}