@malloydata/malloy-filter 0.0.237-dev250222012247 → 0.0.237-dev250222034547
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a_simple_parser.js +12 -9
- package/dist/a_simple_parser.js.map +1 -1
- package/dist/base_parser.d.ts +0 -2
- package/dist/base_parser.js.map +1 -1
- package/dist/boolean_parser.d.ts +2 -2
- package/dist/boolean_parser.js.map +1 -1
- package/dist/boolean_serializer.d.ts +4 -4
- package/dist/boolean_serializer.js +3 -3
- package/dist/boolean_serializer.js.map +1 -1
- package/dist/clause_types.d.ts +15 -41
- package/dist/date_parser.d.ts +13 -11
- package/dist/date_parser.js +187 -130
- package/dist/date_parser.js.map +1 -1
- package/dist/date_serializer.d.ts +6 -5
- package/dist/date_serializer.js +53 -71
- package/dist/date_serializer.js.map +1 -1
- package/dist/date_types.d.ts +69 -0
- package/dist/{filter_types.js → date_types.js} +1 -1
- package/dist/date_types.js.map +1 -0
- package/dist/generate_samples.js +154 -85
- package/dist/generate_samples.js.map +1 -1
- package/dist/number_parser.d.ts +2 -2
- package/dist/number_parser.js.map +1 -1
- package/dist/number_serializer.d.ts +4 -4
- package/dist/number_serializer.js +3 -3
- package/dist/number_serializer.js.map +1 -1
- package/dist/string_parser.d.ts +2 -2
- package/dist/string_parser.js.map +1 -1
- package/dist/string_serializer.d.ts +5 -5
- package/dist/string_serializer.js +5 -5
- package/dist/string_serializer.js.map +1 -1
- package/package.json +1 -2
- package/src/a_simple_parser.ts +12 -9
- package/src/base_parser.ts +0 -3
- package/src/boolean_parser.ts +7 -3
- package/src/boolean_serializer.ts +5 -6
- package/src/clause_types.ts +15 -97
- package/src/date_parser.ts +224 -191
- package/src/date_serializer.ts +55 -87
- package/src/date_types.ts +149 -0
- package/src/generate_samples.ts +170 -107
- package/src/number_parser.ts +5 -5
- package/src/number_serializer.ts +5 -6
- package/src/string_parser.ts +14 -9
- package/src/string_serializer.ts +8 -9
- package/tsconfig.json +1 -6
- package/dist/a_simple_serializer.d.ts +0 -1
- package/dist/a_simple_serializer.js +0 -31
- package/dist/a_simple_serializer.js.map +0 -1
- package/dist/base_serializer.d.ts +0 -6
- package/dist/base_serializer.js +0 -11
- package/dist/base_serializer.js.map +0 -1
- package/dist/filter_parser.d.ts +0 -12
- package/dist/filter_parser.js +0 -66
- package/dist/filter_parser.js.map +0 -1
- package/dist/filter_serializer.d.ts +0 -13
- package/dist/filter_serializer.js +0 -43
- package/dist/filter_serializer.js.map +0 -1
- package/dist/filter_types.d.ts +0 -10
- package/dist/filter_types.js.map +0 -1
- package/src/a_simple_serializer.ts +0 -40
- package/src/base_serializer.ts +0 -9
- package/src/filter_parser.ts +0 -68
- package/src/filter_serializer.ts +0 -49
- package/src/filter_types.ts +0 -12
package/src/number_parser.ts
CHANGED
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
NumberOperator,
|
|
6
6
|
NumberRangeOperator,
|
|
7
7
|
NumberClause,
|
|
8
|
-
|
|
8
|
+
NumberParserResponse,
|
|
9
|
+
FilterError,
|
|
9
10
|
} from './clause_types';
|
|
10
11
|
import {BaseParser} from './base_parser';
|
|
11
12
|
import {Token} from './token_types';
|
|
12
|
-
import {FilterParserResponse, FilterError} from './filter_types';
|
|
13
13
|
|
|
14
14
|
export class NumberParser extends BaseParser {
|
|
15
15
|
constructor(input: string) {
|
|
@@ -46,7 +46,7 @@ export class NumberParser extends BaseParser {
|
|
|
46
46
|
this.tokens = tokenizer.parse();
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
public parse():
|
|
49
|
+
public parse(): NumberParserResponse {
|
|
50
50
|
this.index = 0;
|
|
51
51
|
this.tokenize();
|
|
52
52
|
let clauses: NumberClause[] = [];
|
|
@@ -281,7 +281,7 @@ export class NumberParser extends BaseParser {
|
|
|
281
281
|
return false;
|
|
282
282
|
}
|
|
283
283
|
|
|
284
|
-
private checkSimpleNumber(clauses:
|
|
284
|
+
private checkSimpleNumber(clauses: NumberClause[]): boolean {
|
|
285
285
|
if (this.getNext().type === 'word') {
|
|
286
286
|
const numericValue: number = NumberParser.parseNumber(
|
|
287
287
|
this.getAt(this.index).value
|
|
@@ -296,7 +296,7 @@ export class NumberParser extends BaseParser {
|
|
|
296
296
|
return false;
|
|
297
297
|
}
|
|
298
298
|
|
|
299
|
-
private checkNull(clauses:
|
|
299
|
+
private checkNull(clauses: NumberClause[]): boolean {
|
|
300
300
|
if (this.getNext().type === 'NULL' || this.getNext().type === 'NOTNULL') {
|
|
301
301
|
const tokenType = this.getNext().type === 'NULL' ? '=' : '!=';
|
|
302
302
|
const clause: NumberCondition = {operator: tokenType, values: [null]};
|
package/src/number_serializer.ts
CHANGED
|
@@ -3,13 +3,12 @@ import {
|
|
|
3
3
|
NumberRange,
|
|
4
4
|
NumberOperator,
|
|
5
5
|
NumberRangeOperator,
|
|
6
|
-
|
|
6
|
+
NumberClause,
|
|
7
7
|
} from './clause_types';
|
|
8
|
-
import {BaseSerializer} from './base_serializer';
|
|
9
8
|
|
|
10
|
-
export class NumberSerializer
|
|
11
|
-
constructor(clauses:
|
|
12
|
-
|
|
9
|
+
export class NumberSerializer {
|
|
10
|
+
constructor(private clauses: NumberClause[]) {
|
|
11
|
+
this.clauses = clauses;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
14
|
public serialize(): string {
|
|
@@ -69,7 +68,7 @@ export class NumberSerializer extends BaseSerializer {
|
|
|
69
68
|
);
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
private static clauseToString(clauses:
|
|
71
|
+
private static clauseToString(clauses: NumberClause[]): string {
|
|
73
72
|
let result = '';
|
|
74
73
|
for (const clause of clauses) {
|
|
75
74
|
if ('operator' in clause && clause.operator === 'range') {
|
package/src/string_parser.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import {SpecialToken, Tokenizer, TokenizerParams} from './tokenizer';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
StringClause,
|
|
4
|
+
StringOperator,
|
|
5
|
+
QuoteType,
|
|
6
|
+
FilterError,
|
|
7
|
+
StringParserResponse,
|
|
8
|
+
} from './clause_types';
|
|
3
9
|
import {BaseParser} from './base_parser';
|
|
4
|
-
import {FilterParserResponse, FilterError} from './filter_types';
|
|
5
10
|
|
|
6
11
|
export class StringParser extends BaseParser {
|
|
7
12
|
private static readonly percentRegex: RegExp = /(?<!\\)%/;
|
|
@@ -35,10 +40,10 @@ export class StringParser extends BaseParser {
|
|
|
35
40
|
this.tokens = Tokenizer.convertSpecialWords(this.tokens, specialWords);
|
|
36
41
|
}
|
|
37
42
|
|
|
38
|
-
public parse():
|
|
43
|
+
public parse(): StringParserResponse {
|
|
39
44
|
this.index = 0;
|
|
40
45
|
this.tokenize();
|
|
41
|
-
const clauses:
|
|
46
|
+
const clauses: StringClause[] = [];
|
|
42
47
|
const errors: FilterError[] = [];
|
|
43
48
|
while (this.index < this.tokens.length) {
|
|
44
49
|
const token = this.getNext();
|
|
@@ -119,12 +124,12 @@ export class StringParser extends BaseParser {
|
|
|
119
124
|
return Array.from(quotes);
|
|
120
125
|
}
|
|
121
126
|
|
|
122
|
-
private static groupClauses(clauses:
|
|
127
|
+
private static groupClauses(clauses: StringClause[]): StringClause[] {
|
|
123
128
|
if (clauses.length < 2) {
|
|
124
129
|
return clauses;
|
|
125
130
|
}
|
|
126
|
-
let previous:
|
|
127
|
-
const outputs:
|
|
131
|
+
let previous: StringClause = clauses[0];
|
|
132
|
+
const outputs: StringClause[] = [previous];
|
|
128
133
|
for (let i = 1; i < clauses.length; i++) {
|
|
129
134
|
if (previous.operator === clauses[i].operator) {
|
|
130
135
|
previous.values.push(...clauses[i].values);
|
|
@@ -147,7 +152,7 @@ export class StringParser extends BaseParser {
|
|
|
147
152
|
return word.replace(StringParser.singleBackslashRegex, _match => '');
|
|
148
153
|
}
|
|
149
154
|
|
|
150
|
-
private checkSimpleWord(clauses:
|
|
155
|
+
private checkSimpleWord(clauses: StringClause[]): boolean {
|
|
151
156
|
const token = this.getNext();
|
|
152
157
|
if (token.type !== 'word') {
|
|
153
158
|
return false;
|
|
@@ -184,7 +189,7 @@ export class StringParser extends BaseParser {
|
|
|
184
189
|
return false;
|
|
185
190
|
}
|
|
186
191
|
|
|
187
|
-
const clause:
|
|
192
|
+
const clause: StringClause = {operator: operator, values: [word]};
|
|
188
193
|
//const quotes: QuoteType[] = StringParser.findQuotes(word);
|
|
189
194
|
//if (quotes.length > 0) { clause.quotes = quotes; }
|
|
190
195
|
clauses.push(clause);
|
package/src/string_serializer.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {BaseSerializer} from './base_serializer';
|
|
1
|
+
import {StringClause, StringOperator} from './clause_types';
|
|
3
2
|
|
|
4
|
-
export class StringSerializer
|
|
5
|
-
constructor(clauses:
|
|
6
|
-
|
|
3
|
+
export class StringSerializer {
|
|
4
|
+
constructor(private clauses: StringClause[]) {
|
|
5
|
+
this.clauses = clauses;
|
|
7
6
|
}
|
|
8
7
|
|
|
9
8
|
public serialize(): string {
|
|
@@ -32,7 +31,7 @@ export class StringSerializer extends BaseSerializer {
|
|
|
32
31
|
|
|
33
32
|
// export type StringOperator = 'EMPTY' | 'NOTEMPTY' | 'starts' | 'ends' | 'contains' | 'notStarts' |
|
|
34
33
|
// 'notEnds' | 'notContains' | '~' | '=' | '!~' | '!=';
|
|
35
|
-
private static
|
|
34
|
+
private static StringClauseToString(
|
|
36
35
|
operator: StringOperator,
|
|
37
36
|
value: string | null
|
|
38
37
|
): string {
|
|
@@ -68,12 +67,12 @@ export class StringSerializer extends BaseSerializer {
|
|
|
68
67
|
return (negated ? '-' : '') + value;
|
|
69
68
|
}
|
|
70
69
|
|
|
71
|
-
private static clauseToString(clauses:
|
|
70
|
+
private static clauseToString(clauses: StringClause[]): string {
|
|
72
71
|
let result = '';
|
|
73
72
|
for (const genericClause of clauses) {
|
|
74
|
-
const clause:
|
|
73
|
+
const clause: StringClause = genericClause as StringClause;
|
|
75
74
|
for (const value of clause.values) {
|
|
76
|
-
const word = StringSerializer.
|
|
75
|
+
const word = StringSerializer.StringClauseToString(
|
|
77
76
|
clause.operator,
|
|
78
77
|
value
|
|
79
78
|
);
|
package/tsconfig.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const filter_serializer_1 = require("./filter_serializer");
|
|
4
|
-
/* eslint-disable no-console */
|
|
5
|
-
function aSimpleSerializer() {
|
|
6
|
-
const strings = [{ operator: '=', values: ['CAT', 'DOG'] }];
|
|
7
|
-
let response = new filter_serializer_1.FilterSerializer(strings, 'string').serialize();
|
|
8
|
-
console.log(...strings, '\n', response.result, '\n');
|
|
9
|
-
const numbers = [
|
|
10
|
-
{
|
|
11
|
-
operator: 'range',
|
|
12
|
-
startOperator: '>=',
|
|
13
|
-
startValue: -5.5,
|
|
14
|
-
endOperator: '<',
|
|
15
|
-
endValue: 10,
|
|
16
|
-
},
|
|
17
|
-
];
|
|
18
|
-
response = new filter_serializer_1.FilterSerializer(numbers, 'number').serialize();
|
|
19
|
-
console.log(...numbers, '\n', response.result, '\n');
|
|
20
|
-
const booleans = [{ operator: 'NULL' }, { operator: 'TRUE' }];
|
|
21
|
-
response = new filter_serializer_1.FilterSerializer(booleans, 'boolean').serialize();
|
|
22
|
-
console.log(...booleans, '\n', response.result, '\n');
|
|
23
|
-
const dates = [
|
|
24
|
-
{ operator: 'YESTERDAY' },
|
|
25
|
-
{ operator: 'NEXT', unit: 'TUESDAY' },
|
|
26
|
-
];
|
|
27
|
-
response = new filter_serializer_1.FilterSerializer(dates, 'date').serialize();
|
|
28
|
-
console.log(...dates, '\n', response.result, '\n');
|
|
29
|
-
}
|
|
30
|
-
aSimpleSerializer();
|
|
31
|
-
//# sourceMappingURL=a_simple_serializer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"a_simple_serializer.js","sourceRoot":"","sources":["../src/a_simple_serializer.ts"],"names":[],"mappings":";;AAAA,2DAAqD;AAQrD,+BAA+B;AAC/B,SAAS,iBAAiB;IACxB,MAAM,OAAO,GAAsB,CAAC,EAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAC,CAAC,CAAC;IAC7E,IAAI,QAAQ,GAAG,IAAI,oCAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,OAAO,GAAmB;QAC9B;YACE,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,CAAC,GAAG;YAChB,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,EAAE;SACb;KACF,CAAC;IACF,QAAQ,GAAG,IAAI,oCAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAoB,CAAC,EAAC,QAAQ,EAAE,MAAM,EAAC,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;IAE3E,QAAQ,GAAG,IAAI,oCAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAiB;QAC1B,EAAC,QAAQ,EAAE,WAAW,EAAC;QACvB,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAC;KACpC,CAAC;IACF,QAAQ,GAAG,IAAI,oCAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,iBAAiB,EAAE,CAAC"}
|
package/dist/base_serializer.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseSerializer = void 0;
|
|
4
|
-
class BaseSerializer {
|
|
5
|
-
constructor(clauses) {
|
|
6
|
-
this.clauses = clauses;
|
|
7
|
-
this.clauses = clauses;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
exports.BaseSerializer = BaseSerializer;
|
|
11
|
-
//# sourceMappingURL=base_serializer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base_serializer.js","sourceRoot":"","sources":["../src/base_serializer.ts"],"names":[],"mappings":";;;AAEA,MAAsB,cAAc;IAClC,YAAsB,OAAiB;QAAjB,YAAO,GAAP,OAAO,CAAU;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CAGF;AAND,wCAMC"}
|
package/dist/filter_parser.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { FilterParserResponse } from './filter_types';
|
|
2
|
-
import { Token } from './token_types';
|
|
3
|
-
export type FilterType = 'boolean' | 'number' | 'string' | 'date';
|
|
4
|
-
export declare class FilterParser {
|
|
5
|
-
private input;
|
|
6
|
-
private type;
|
|
7
|
-
constructor(input: string, type: FilterType);
|
|
8
|
-
private initParser;
|
|
9
|
-
getTokens(): Token[];
|
|
10
|
-
private makeErrorMessage;
|
|
11
|
-
parse(): FilterParserResponse;
|
|
12
|
-
}
|
package/dist/filter_parser.js
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FilterParser = void 0;
|
|
4
|
-
const boolean_parser_1 = require("./boolean_parser");
|
|
5
|
-
const string_parser_1 = require("./string_parser");
|
|
6
|
-
const number_parser_1 = require("./number_parser");
|
|
7
|
-
const date_parser_1 = require("./date_parser");
|
|
8
|
-
class FilterParser {
|
|
9
|
-
constructor(input, type) {
|
|
10
|
-
this.input = input;
|
|
11
|
-
this.type = type;
|
|
12
|
-
this.input = input;
|
|
13
|
-
this.type = type;
|
|
14
|
-
}
|
|
15
|
-
initParser() {
|
|
16
|
-
switch (this.type) {
|
|
17
|
-
case 'boolean':
|
|
18
|
-
return new boolean_parser_1.BooleanParser(this.input);
|
|
19
|
-
case 'number':
|
|
20
|
-
return new number_parser_1.NumberParser(this.input);
|
|
21
|
-
case 'string':
|
|
22
|
-
return new string_parser_1.StringParser(this.input);
|
|
23
|
-
case 'date':
|
|
24
|
-
return new date_parser_1.DateParser(this.input);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
/* eslint-disable no-console */
|
|
28
|
-
getTokens() {
|
|
29
|
-
let tokens = [];
|
|
30
|
-
try {
|
|
31
|
-
const parser = this.initParser();
|
|
32
|
-
tokens = parser.getTokens();
|
|
33
|
-
}
|
|
34
|
-
catch (ex) {
|
|
35
|
-
if (ex instanceof Error)
|
|
36
|
-
console.error('Error: ', ex.message, '\n');
|
|
37
|
-
else {
|
|
38
|
-
console.error('Unknown error: ', ex, '\n');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return tokens;
|
|
42
|
-
}
|
|
43
|
-
/* eslint-enable no-console */
|
|
44
|
-
makeErrorMessage(message) {
|
|
45
|
-
return { message, startIndex: 0, endIndex: this.input.length };
|
|
46
|
-
}
|
|
47
|
-
parse() {
|
|
48
|
-
try {
|
|
49
|
-
const parser = this.initParser();
|
|
50
|
-
return parser.parse();
|
|
51
|
-
}
|
|
52
|
-
catch (ex) {
|
|
53
|
-
if (ex instanceof Error) {
|
|
54
|
-
return { clauses: [], errors: [this.makeErrorMessage(ex.message)] };
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return {
|
|
58
|
-
clauses: [],
|
|
59
|
-
errors: [this.makeErrorMessage('Unknown error ' + ex)],
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.FilterParser = FilterParser;
|
|
66
|
-
//# sourceMappingURL=filter_parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter_parser.js","sourceRoot":"","sources":["../src/filter_parser.ts"],"names":[],"mappings":";;;AAEA,qDAA+C;AAC/C,mDAA6C;AAC7C,mDAA6C;AAC7C,+CAAyC;AAKzC,MAAa,YAAY;IACvB,YACU,KAAa,EACb,IAAgB;QADhB,UAAK,GAAL,KAAK,CAAQ;QACb,SAAI,GAAJ,IAAI,CAAY;QAExB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,UAAU;QAChB,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,SAAS;gBACZ,OAAO,IAAI,8BAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,KAAK,QAAQ;gBACX,OAAO,IAAI,4BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,QAAQ;gBACX,OAAO,IAAI,4BAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtC,KAAK,MAAM;gBACT,OAAO,IAAI,wBAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrC;IACH,CAAC;IAED,+BAA+B;IACxB,SAAS;QACd,IAAI,MAAM,GAAY,EAAE,CAAC;QACzB,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;SAC7B;QAAC,OAAO,EAAmB,EAAE;YAC5B,IAAI,EAAE,YAAY,KAAK;gBAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;iBAC/D;gBACH,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;aAC5C;SACF;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,8BAA8B;IAEtB,gBAAgB,CAAC,OAAe;QACtC,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAC,CAAC;IAC/D,CAAC;IAEM,KAAK;QACV,IAAI;YACF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC;SACvB;QAAC,OAAO,EAAmB,EAAE;YAC5B,IAAI,EAAE,YAAY,KAAK,EAAE;gBACvB,OAAO,EAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC;aACnE;iBAAM;gBACL,OAAO;oBACL,OAAO,EAAE,EAAE;oBACX,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;iBACvD,CAAC;aACH;SACF;IACH,CAAC;CACF;AAzDD,oCAyDC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Clause } from './clause_types';
|
|
2
|
-
export type FilterType = 'boolean' | 'number' | 'string' | 'date';
|
|
3
|
-
export interface FilterSerializerResponse {
|
|
4
|
-
result: string;
|
|
5
|
-
error?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare class FilterSerializer {
|
|
8
|
-
private input;
|
|
9
|
-
private type;
|
|
10
|
-
constructor(input: Clause[], type: FilterType);
|
|
11
|
-
private initSerializer;
|
|
12
|
-
serialize(): FilterSerializerResponse;
|
|
13
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FilterSerializer = void 0;
|
|
4
|
-
const boolean_serializer_1 = require("./boolean_serializer");
|
|
5
|
-
const string_serializer_1 = require("./string_serializer");
|
|
6
|
-
const number_serializer_1 = require("./number_serializer");
|
|
7
|
-
const date_serializer_1 = require("./date_serializer");
|
|
8
|
-
class FilterSerializer {
|
|
9
|
-
constructor(input, type) {
|
|
10
|
-
this.input = input;
|
|
11
|
-
this.type = type;
|
|
12
|
-
this.input = input;
|
|
13
|
-
this.type = type;
|
|
14
|
-
}
|
|
15
|
-
initSerializer() {
|
|
16
|
-
switch (this.type) {
|
|
17
|
-
case 'boolean':
|
|
18
|
-
return new boolean_serializer_1.BooleanSerializer(this.input);
|
|
19
|
-
case 'number':
|
|
20
|
-
return new number_serializer_1.NumberSerializer(this.input);
|
|
21
|
-
case 'string':
|
|
22
|
-
return new string_serializer_1.StringSerializer(this.input);
|
|
23
|
-
case 'date':
|
|
24
|
-
return new date_serializer_1.DateSerializer(this.input);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
serialize() {
|
|
28
|
-
try {
|
|
29
|
-
const serializer = this.initSerializer();
|
|
30
|
-
return { result: serializer.serialize() };
|
|
31
|
-
}
|
|
32
|
-
catch (ex) {
|
|
33
|
-
if (ex instanceof Error) {
|
|
34
|
-
return { result: '', error: ex.message };
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
return { result: '', error: 'Unknown error ' + ex };
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
exports.FilterSerializer = FilterSerializer;
|
|
43
|
-
//# sourceMappingURL=filter_serializer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter_serializer.js","sourceRoot":"","sources":["../src/filter_serializer.ts"],"names":[],"mappings":";;;AACA,6DAAuD;AACvD,2DAAqD;AACrD,2DAAqD;AACrD,uDAAiD;AAUjD,MAAa,gBAAgB;IAC3B,YACU,KAAe,EACf,IAAgB;QADhB,UAAK,GAAL,KAAK,CAAU;QACf,SAAI,GAAJ,IAAI,CAAY;QAExB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,cAAc;QACpB,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,SAAS;gBACZ,OAAO,IAAI,sCAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,KAAK,QAAQ;gBACX,OAAO,IAAI,oCAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,KAAK,QAAQ;gBACX,OAAO,IAAI,oCAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,KAAK,MAAM;gBACT,OAAO,IAAI,gCAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzC;IACH,CAAC;IAEM,SAAS;QACd,IAAI;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACzC,OAAO,EAAC,MAAM,EAAE,UAAU,CAAC,SAAS,EAAE,EAAC,CAAC;SACzC;QAAC,OAAO,EAAmB,EAAE;YAC5B,IAAI,EAAE,YAAY,KAAK,EAAE;gBACvB,OAAO,EAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAC,CAAC;aACxC;iBAAM;gBACL,OAAO,EAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,GAAG,EAAE,EAAC,CAAC;aACnD;SACF;IACH,CAAC;CACF;AAlCD,4CAkCC"}
|
package/dist/filter_types.d.ts
DELETED
package/dist/filter_types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filter_types.js","sourceRoot":"","sources":["../src/filter_types.ts"],"names":[],"mappings":""}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import {FilterSerializer} from './filter_serializer';
|
|
2
|
-
import {
|
|
3
|
-
NumberClause,
|
|
4
|
-
StringCondition,
|
|
5
|
-
BooleanClause,
|
|
6
|
-
DateClause,
|
|
7
|
-
} from './clause_types';
|
|
8
|
-
|
|
9
|
-
/* eslint-disable no-console */
|
|
10
|
-
function aSimpleSerializer() {
|
|
11
|
-
const strings: StringCondition[] = [{operator: '=', values: ['CAT', 'DOG']}];
|
|
12
|
-
let response = new FilterSerializer(strings, 'string').serialize();
|
|
13
|
-
console.log(...strings, '\n', response.result, '\n');
|
|
14
|
-
|
|
15
|
-
const numbers: NumberClause[] = [
|
|
16
|
-
{
|
|
17
|
-
operator: 'range',
|
|
18
|
-
startOperator: '>=',
|
|
19
|
-
startValue: -5.5,
|
|
20
|
-
endOperator: '<',
|
|
21
|
-
endValue: 10,
|
|
22
|
-
},
|
|
23
|
-
];
|
|
24
|
-
response = new FilterSerializer(numbers, 'number').serialize();
|
|
25
|
-
console.log(...numbers, '\n', response.result, '\n');
|
|
26
|
-
|
|
27
|
-
const booleans: BooleanClause[] = [{operator: 'NULL'}, {operator: 'TRUE'}];
|
|
28
|
-
|
|
29
|
-
response = new FilterSerializer(booleans, 'boolean').serialize();
|
|
30
|
-
console.log(...booleans, '\n', response.result, '\n');
|
|
31
|
-
|
|
32
|
-
const dates: DateClause[] = [
|
|
33
|
-
{operator: 'YESTERDAY'},
|
|
34
|
-
{operator: 'NEXT', unit: 'TUESDAY'},
|
|
35
|
-
];
|
|
36
|
-
response = new FilterSerializer(dates, 'date').serialize();
|
|
37
|
-
console.log(...dates, '\n', response.result, '\n');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
aSimpleSerializer();
|
package/src/base_serializer.ts
DELETED
package/src/filter_parser.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import {FilterError, FilterParserResponse} from './filter_types';
|
|
2
|
-
import {Token} from './token_types';
|
|
3
|
-
import {BooleanParser} from './boolean_parser';
|
|
4
|
-
import {StringParser} from './string_parser';
|
|
5
|
-
import {NumberParser} from './number_parser';
|
|
6
|
-
import {DateParser} from './date_parser';
|
|
7
|
-
import {BaseParser} from './base_parser';
|
|
8
|
-
|
|
9
|
-
export type FilterType = 'boolean' | 'number' | 'string' | 'date';
|
|
10
|
-
|
|
11
|
-
export class FilterParser {
|
|
12
|
-
constructor(
|
|
13
|
-
private input: string,
|
|
14
|
-
private type: FilterType
|
|
15
|
-
) {
|
|
16
|
-
this.input = input;
|
|
17
|
-
this.type = type;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
private initParser(): BaseParser {
|
|
21
|
-
switch (this.type) {
|
|
22
|
-
case 'boolean':
|
|
23
|
-
return new BooleanParser(this.input);
|
|
24
|
-
case 'number':
|
|
25
|
-
return new NumberParser(this.input);
|
|
26
|
-
case 'string':
|
|
27
|
-
return new StringParser(this.input);
|
|
28
|
-
case 'date':
|
|
29
|
-
return new DateParser(this.input);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* eslint-disable no-console */
|
|
34
|
-
public getTokens(): Token[] {
|
|
35
|
-
let tokens: Token[] = [];
|
|
36
|
-
try {
|
|
37
|
-
const parser = this.initParser();
|
|
38
|
-
tokens = parser.getTokens();
|
|
39
|
-
} catch (ex: Error | unknown) {
|
|
40
|
-
if (ex instanceof Error) console.error('Error: ', ex.message, '\n');
|
|
41
|
-
else {
|
|
42
|
-
console.error('Unknown error: ', ex, '\n');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return tokens;
|
|
46
|
-
}
|
|
47
|
-
/* eslint-enable no-console */
|
|
48
|
-
|
|
49
|
-
private makeErrorMessage(message: string): FilterError {
|
|
50
|
-
return {message, startIndex: 0, endIndex: this.input.length};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public parse(): FilterParserResponse {
|
|
54
|
-
try {
|
|
55
|
-
const parser = this.initParser();
|
|
56
|
-
return parser.parse();
|
|
57
|
-
} catch (ex: Error | unknown) {
|
|
58
|
-
if (ex instanceof Error) {
|
|
59
|
-
return {clauses: [], errors: [this.makeErrorMessage(ex.message)]};
|
|
60
|
-
} else {
|
|
61
|
-
return {
|
|
62
|
-
clauses: [],
|
|
63
|
-
errors: [this.makeErrorMessage('Unknown error ' + ex)],
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
package/src/filter_serializer.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import {Clause} from './clause_types';
|
|
2
|
-
import {BooleanSerializer} from './boolean_serializer';
|
|
3
|
-
import {StringSerializer} from './string_serializer';
|
|
4
|
-
import {NumberSerializer} from './number_serializer';
|
|
5
|
-
import {DateSerializer} from './date_serializer';
|
|
6
|
-
import {BaseSerializer} from './base_serializer';
|
|
7
|
-
|
|
8
|
-
export type FilterType = 'boolean' | 'number' | 'string' | 'date';
|
|
9
|
-
|
|
10
|
-
export interface FilterSerializerResponse {
|
|
11
|
-
result: string;
|
|
12
|
-
error?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class FilterSerializer {
|
|
16
|
-
constructor(
|
|
17
|
-
private input: Clause[],
|
|
18
|
-
private type: FilterType
|
|
19
|
-
) {
|
|
20
|
-
this.input = input;
|
|
21
|
-
this.type = type;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
private initSerializer(): BaseSerializer {
|
|
25
|
-
switch (this.type) {
|
|
26
|
-
case 'boolean':
|
|
27
|
-
return new BooleanSerializer(this.input);
|
|
28
|
-
case 'number':
|
|
29
|
-
return new NumberSerializer(this.input);
|
|
30
|
-
case 'string':
|
|
31
|
-
return new StringSerializer(this.input);
|
|
32
|
-
case 'date':
|
|
33
|
-
return new DateSerializer(this.input);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public serialize(): FilterSerializerResponse {
|
|
38
|
-
try {
|
|
39
|
-
const serializer = this.initSerializer();
|
|
40
|
-
return {result: serializer.serialize()};
|
|
41
|
-
} catch (ex: Error | unknown) {
|
|
42
|
-
if (ex instanceof Error) {
|
|
43
|
-
return {result: '', error: ex.message};
|
|
44
|
-
} else {
|
|
45
|
-
return {result: '', error: 'Unknown error ' + ex};
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
package/src/filter_types.ts
DELETED