@malloydata/malloy-filter 0.0.237-dev250221201621
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/README.md +81 -0
- package/SAMPLES.md +381 -0
- package/SERIALIZE_SAMPLES.md +300 -0
- package/dist/a_simple_parser.d.ts +1 -0
- package/dist/a_simple_parser.js +20 -0
- package/dist/a_simple_parser.js.map +1 -0
- package/dist/a_simple_serializer.d.ts +1 -0
- package/dist/a_simple_serializer.js +31 -0
- package/dist/a_simple_serializer.js.map +1 -0
- package/dist/base_parser.d.ts +13 -0
- package/dist/base_parser.js +33 -0
- package/dist/base_parser.js.map +1 -0
- package/dist/base_serializer.d.ts +6 -0
- package/dist/base_serializer.js +11 -0
- package/dist/base_serializer.js.map +1 -0
- package/dist/boolean_parser.d.ts +7 -0
- package/dist/boolean_parser.js +59 -0
- package/dist/boolean_parser.js.map +1 -0
- package/dist/boolean_serializer.d.ts +8 -0
- package/dist/boolean_serializer.js +31 -0
- package/dist/boolean_serializer.js.map +1 -0
- package/dist/clause_types.d.ts +70 -0
- package/dist/clause_types.js +3 -0
- package/dist/clause_types.js.map +1 -0
- package/dist/date_parser.d.ts +22 -0
- package/dist/date_parser.js +315 -0
- package/dist/date_parser.js.map +1 -0
- package/dist/date_serializer.d.ts +10 -0
- package/dist/date_serializer.js +100 -0
- package/dist/date_serializer.js.map +1 -0
- package/dist/filter_parser.d.ts +12 -0
- package/dist/filter_parser.js +66 -0
- package/dist/filter_parser.js.map +1 -0
- package/dist/filter_serializer.d.ts +13 -0
- package/dist/filter_serializer.js +43 -0
- package/dist/filter_serializer.js.map +1 -0
- package/dist/filter_types.d.ts +10 -0
- package/dist/filter_types.js +3 -0
- package/dist/filter_types.js.map +1 -0
- package/dist/generate_samples.d.ts +1 -0
- package/dist/generate_samples.js +344 -0
- package/dist/generate_samples.js.map +1 -0
- package/dist/number_parser.d.ts +20 -0
- package/dist/number_parser.js +275 -0
- package/dist/number_parser.js.map +1 -0
- package/dist/number_serializer.d.ts +11 -0
- package/dist/number_serializer.js +76 -0
- package/dist/number_serializer.js.map +1 -0
- package/dist/string_parser.d.ts +18 -0
- package/dist/string_parser.js +198 -0
- package/dist/string_parser.js.map +1 -0
- package/dist/string_serializer.d.ts +11 -0
- package/dist/string_serializer.js +77 -0
- package/dist/string_serializer.js.map +1 -0
- package/dist/token_types.d.ts +7 -0
- package/dist/token_types.js +3 -0
- package/dist/token_types.js.map +1 -0
- package/dist/tokenizer.d.ts +52 -0
- package/dist/tokenizer.js +263 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/tokenizer.spec.d.ts +1 -0
- package/dist/tokenizer.spec.js +255 -0
- package/dist/tokenizer.spec.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +21 -0
- package/src/DEVELOPING.md +26 -0
- package/src/a_simple_parser.ts +22 -0
- package/src/a_simple_serializer.ts +40 -0
- package/src/base_parser.ts +45 -0
- package/src/base_serializer.ts +9 -0
- package/src/boolean_parser.ts +60 -0
- package/src/boolean_serializer.ts +32 -0
- package/src/clause_types.ts +160 -0
- package/src/date_parser.ts +413 -0
- package/src/date_serializer.ts +114 -0
- package/src/filter_parser.ts +68 -0
- package/src/filter_serializer.ts +49 -0
- package/src/filter_types.ts +12 -0
- package/src/generate_samples.ts +387 -0
- package/src/number_parser.ts +308 -0
- package/src/number_serializer.ts +96 -0
- package/src/string_parser.ts +193 -0
- package/src/string_serializer.ts +87 -0
- package/src/token_types.ts +7 -0
- package/src/tokenizer.spec.ts +273 -0
- package/src/tokenizer.ts +320 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NumberSerializer = void 0;
|
|
4
|
+
const base_serializer_1 = require("./base_serializer");
|
|
5
|
+
class NumberSerializer extends base_serializer_1.BaseSerializer {
|
|
6
|
+
constructor(clauses) {
|
|
7
|
+
super(clauses);
|
|
8
|
+
}
|
|
9
|
+
serialize() {
|
|
10
|
+
const result = NumberSerializer.clauseToString(this.clauses);
|
|
11
|
+
return result.trim().replace(/,$/, '');
|
|
12
|
+
}
|
|
13
|
+
// NumberOperator = '<=' | '>=' | '!=' | '=' | '>' | '<';
|
|
14
|
+
static numberConditionToString(operator, value) {
|
|
15
|
+
if (value === null) {
|
|
16
|
+
return operator === '=' ? 'NULL' : '-NULL';
|
|
17
|
+
}
|
|
18
|
+
const operatorString = operator === '=' ? '' : operator; // Remove operator for eg "5, 7, 9"
|
|
19
|
+
return operatorString + value;
|
|
20
|
+
}
|
|
21
|
+
static getNegatedType(operator) {
|
|
22
|
+
switch (operator) {
|
|
23
|
+
case '<':
|
|
24
|
+
return '>=';
|
|
25
|
+
case '<=':
|
|
26
|
+
return '>';
|
|
27
|
+
case '>':
|
|
28
|
+
return '<=';
|
|
29
|
+
case '>=':
|
|
30
|
+
return '<';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
static isNumberOperator(value) {
|
|
34
|
+
return ['<=', '>=', '!=', '=', '>', '<'].includes(value);
|
|
35
|
+
}
|
|
36
|
+
static rangeToString(clause) {
|
|
37
|
+
const negated = clause.startOperator === '<' || clause.startOperator === '<=' ? '!=' : '';
|
|
38
|
+
const startOperator = negated
|
|
39
|
+
? NumberSerializer.getNegatedType(clause.startOperator)
|
|
40
|
+
: clause.startOperator;
|
|
41
|
+
const endOperator = negated
|
|
42
|
+
? NumberSerializer.getNegatedType(clause.endOperator)
|
|
43
|
+
: clause.endOperator;
|
|
44
|
+
const leftBracket = startOperator === '>' ? '(' : '[';
|
|
45
|
+
const rightBracket = endOperator === '<' ? ')' : ']';
|
|
46
|
+
return (negated +
|
|
47
|
+
leftBracket +
|
|
48
|
+
clause.startValue +
|
|
49
|
+
', ' +
|
|
50
|
+
clause.endValue +
|
|
51
|
+
rightBracket);
|
|
52
|
+
}
|
|
53
|
+
static clauseToString(clauses) {
|
|
54
|
+
let result = '';
|
|
55
|
+
for (const clause of clauses) {
|
|
56
|
+
if ('operator' in clause && clause.operator === 'range') {
|
|
57
|
+
result += NumberSerializer.rangeToString(clause);
|
|
58
|
+
result += ', ';
|
|
59
|
+
}
|
|
60
|
+
else if ('operator' in clause &&
|
|
61
|
+
NumberSerializer.isNumberOperator(clause.operator)) {
|
|
62
|
+
const numberClause = clause;
|
|
63
|
+
for (const value of numberClause.values) {
|
|
64
|
+
result += NumberSerializer.numberConditionToString(numberClause.operator, value);
|
|
65
|
+
result += ', ';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw new Error('Invalid number clause ' + JSON.stringify(clause));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.NumberSerializer = NumberSerializer;
|
|
76
|
+
//# sourceMappingURL=number_serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number_serializer.js","sourceRoot":"","sources":["../src/number_serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseParser } from './base_parser';
|
|
2
|
+
import { FilterParserResponse } from './filter_types';
|
|
3
|
+
export declare class StringParser extends BaseParser {
|
|
4
|
+
private static readonly percentRegex;
|
|
5
|
+
private static readonly underscoreRegex;
|
|
6
|
+
private static readonly percentStartRegex;
|
|
7
|
+
private static readonly percentEndRegex;
|
|
8
|
+
private static readonly negatedStartRegex;
|
|
9
|
+
private static readonly singleBackslashRegex;
|
|
10
|
+
constructor(input: string);
|
|
11
|
+
private tokenize;
|
|
12
|
+
parse(): FilterParserResponse;
|
|
13
|
+
private static findQuotes;
|
|
14
|
+
private static groupClauses;
|
|
15
|
+
private static percentInMiddle;
|
|
16
|
+
private static removeBackslashes;
|
|
17
|
+
private checkSimpleWord;
|
|
18
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StringParser = void 0;
|
|
4
|
+
const tokenizer_1 = require("./tokenizer");
|
|
5
|
+
const base_parser_1 = require("./base_parser");
|
|
6
|
+
class StringParser extends base_parser_1.BaseParser {
|
|
7
|
+
constructor(input) {
|
|
8
|
+
super(input);
|
|
9
|
+
}
|
|
10
|
+
tokenize() {
|
|
11
|
+
const specialSubstrings = [{ type: ',', value: ',' }];
|
|
12
|
+
const specialWords = [
|
|
13
|
+
{ type: 'NULL', value: 'null', ignoreCase: true },
|
|
14
|
+
{ type: 'EMPTY', value: 'empty', ignoreCase: true },
|
|
15
|
+
{ type: 'NOTNULL', value: '-null', ignoreCase: true },
|
|
16
|
+
{ type: 'NOTEMPTY', value: '-empty', ignoreCase: true },
|
|
17
|
+
];
|
|
18
|
+
const params = {
|
|
19
|
+
trimWordWhitespace: true,
|
|
20
|
+
combineAdjacentWords: true,
|
|
21
|
+
specialSubstrings,
|
|
22
|
+
specialWords: specialWords,
|
|
23
|
+
};
|
|
24
|
+
const tokenizer = new tokenizer_1.Tokenizer(this.inputString, params);
|
|
25
|
+
this.tokens = tokenizer.parse();
|
|
26
|
+
this.tokens = tokenizer_1.Tokenizer.convertSpecialWords(this.tokens, specialWords);
|
|
27
|
+
}
|
|
28
|
+
parse() {
|
|
29
|
+
this.index = 0;
|
|
30
|
+
this.tokenize();
|
|
31
|
+
const clauses = [];
|
|
32
|
+
const errors = [];
|
|
33
|
+
while (this.index < this.tokens.length) {
|
|
34
|
+
const token = this.getNext();
|
|
35
|
+
if (token.type === ',') {
|
|
36
|
+
this.index++;
|
|
37
|
+
}
|
|
38
|
+
else if (token.type === 'NULL') {
|
|
39
|
+
clauses.push({ operator: '=', values: [null] });
|
|
40
|
+
this.index++;
|
|
41
|
+
}
|
|
42
|
+
else if (token.type === 'EMPTY') {
|
|
43
|
+
clauses.push({ operator: 'EMPTY', values: [null] });
|
|
44
|
+
this.index++;
|
|
45
|
+
}
|
|
46
|
+
else if (token.type === 'NOTNULL') {
|
|
47
|
+
clauses.push({ operator: '!=', values: [null] });
|
|
48
|
+
this.index++;
|
|
49
|
+
}
|
|
50
|
+
else if (token.type === 'NOTEMPTY') {
|
|
51
|
+
clauses.push({ operator: 'NOTEMPTY', values: [null] });
|
|
52
|
+
this.index++;
|
|
53
|
+
}
|
|
54
|
+
else if (this.checkSimpleWord(clauses)) {
|
|
55
|
+
this.index++;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
errors.push({
|
|
59
|
+
message: 'Invalid expression',
|
|
60
|
+
startIndex: token.startIndex,
|
|
61
|
+
endIndex: token.endIndex,
|
|
62
|
+
});
|
|
63
|
+
this.index++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { clauses: StringParser.groupClauses(clauses), errors };
|
|
67
|
+
}
|
|
68
|
+
static findQuotes(str) {
|
|
69
|
+
const quotes = new Set();
|
|
70
|
+
let i = 0;
|
|
71
|
+
while (i < str.length) {
|
|
72
|
+
// Check for triple quotes first to avoid false positives
|
|
73
|
+
if (str.slice(i, i + 3) === "'''") {
|
|
74
|
+
quotes.add('TRIPLESINGLE');
|
|
75
|
+
i += 3;
|
|
76
|
+
}
|
|
77
|
+
else if (str.slice(i, i + 3) === '"""') {
|
|
78
|
+
quotes.add('TRIPLEDOUBLE');
|
|
79
|
+
i += 3;
|
|
80
|
+
}
|
|
81
|
+
else if (str[i] === '\\') {
|
|
82
|
+
// Check for escaped quotes
|
|
83
|
+
if (i + 1 < str.length) {
|
|
84
|
+
switch (str[i + 1]) {
|
|
85
|
+
case "'":
|
|
86
|
+
quotes.add('ESCAPEDSINGLE');
|
|
87
|
+
break;
|
|
88
|
+
case '"':
|
|
89
|
+
quotes.add('ESCAPEDDOUBLE');
|
|
90
|
+
break;
|
|
91
|
+
case '`':
|
|
92
|
+
quotes.add('ESCAPEDBACKTICK');
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
i += 2;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
i++;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Check for single quotes
|
|
103
|
+
switch (str[i]) {
|
|
104
|
+
case "'":
|
|
105
|
+
quotes.add('SINGLE');
|
|
106
|
+
break;
|
|
107
|
+
case '"':
|
|
108
|
+
quotes.add('DOUBLE');
|
|
109
|
+
break;
|
|
110
|
+
case '`':
|
|
111
|
+
quotes.add('BACKTICK');
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
i++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return Array.from(quotes);
|
|
118
|
+
}
|
|
119
|
+
static groupClauses(clauses) {
|
|
120
|
+
if (clauses.length < 2) {
|
|
121
|
+
return clauses;
|
|
122
|
+
}
|
|
123
|
+
let previous = clauses[0];
|
|
124
|
+
const outputs = [previous];
|
|
125
|
+
for (let i = 1; i < clauses.length; i++) {
|
|
126
|
+
if (previous.operator === clauses[i].operator) {
|
|
127
|
+
previous.values.push(...clauses[i].values);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
previous = clauses[i];
|
|
131
|
+
outputs.push(previous);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return outputs;
|
|
135
|
+
}
|
|
136
|
+
static percentInMiddle(word) {
|
|
137
|
+
if (word.length < 3)
|
|
138
|
+
return false;
|
|
139
|
+
word = word.substring(1, word.length - 1);
|
|
140
|
+
return StringParser.percentRegex.test(word);
|
|
141
|
+
}
|
|
142
|
+
static removeBackslashes(word) {
|
|
143
|
+
StringParser.singleBackslashRegex.lastIndex = 0;
|
|
144
|
+
return word.replace(StringParser.singleBackslashRegex, _match => '');
|
|
145
|
+
}
|
|
146
|
+
checkSimpleWord(clauses) {
|
|
147
|
+
const token = this.getNext();
|
|
148
|
+
if (token.type !== 'word') {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const negatedMatch = StringParser.negatedStartRegex.exec(token.value);
|
|
152
|
+
let word = negatedMatch ? negatedMatch[1] : token.value;
|
|
153
|
+
const isPercentStart = StringParser.percentStartRegex.test(word);
|
|
154
|
+
const isPercentEnd = StringParser.percentEndRegex.test(word);
|
|
155
|
+
const isPercentBoth = isPercentStart && isPercentEnd;
|
|
156
|
+
const isUnderscore = StringParser.underscoreRegex.test(word);
|
|
157
|
+
const isPercentMiddle = StringParser.percentInMiddle(word);
|
|
158
|
+
let operator = negatedMatch ? '!=' : '=';
|
|
159
|
+
if (isUnderscore || isPercentMiddle || (isPercentBoth && word.length < 3)) {
|
|
160
|
+
operator = negatedMatch ? '!~' : '~';
|
|
161
|
+
}
|
|
162
|
+
else if (isPercentBoth && word.length > 2) {
|
|
163
|
+
operator = negatedMatch ? 'notContains' : 'contains';
|
|
164
|
+
word = word.substring(1, word.length - 1);
|
|
165
|
+
word = StringParser.removeBackslashes(word);
|
|
166
|
+
}
|
|
167
|
+
else if (isPercentStart) {
|
|
168
|
+
operator = negatedMatch ? 'notEnds' : 'ends';
|
|
169
|
+
word = word.substring(1, word.length);
|
|
170
|
+
word = StringParser.removeBackslashes(word);
|
|
171
|
+
}
|
|
172
|
+
else if (isPercentEnd) {
|
|
173
|
+
operator = negatedMatch ? 'notStarts' : 'starts';
|
|
174
|
+
word = word.substring(0, word.length - 1);
|
|
175
|
+
word = StringParser.removeBackslashes(word);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// = or !=
|
|
179
|
+
word = StringParser.removeBackslashes(word);
|
|
180
|
+
}
|
|
181
|
+
if (word.length === 0) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const clause = { operator: operator, values: [word] };
|
|
185
|
+
//const quotes: QuoteType[] = StringParser.findQuotes(word);
|
|
186
|
+
//if (quotes.length > 0) { clause.quotes = quotes; }
|
|
187
|
+
clauses.push(clause);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
exports.StringParser = StringParser;
|
|
192
|
+
StringParser.percentRegex = /(?<!\\)%/;
|
|
193
|
+
StringParser.underscoreRegex = /(?<!\\)_/;
|
|
194
|
+
StringParser.percentStartRegex = /^%/;
|
|
195
|
+
StringParser.percentEndRegex = /(?<!\\)%$/;
|
|
196
|
+
StringParser.negatedStartRegex = /^-(.+)$/;
|
|
197
|
+
StringParser.singleBackslashRegex = /(?<!\\)\\(?!\\)/g;
|
|
198
|
+
//# sourceMappingURL=string_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string_parser.js","sourceRoot":"","sources":["../src/string_parser.ts"],"names":[],"mappings":";;;AAAA,2CAAqE;AAErE,+CAAyC;AAGzC,MAAa,YAAa,SAAQ,wBAAU;IAQ1C,YAAY,KAAa;QACvB,KAAK,CAAC,KAAK,CAAC,CAAC;IACf,CAAC;IAEO,QAAQ;QACd,MAAM,iBAAiB,GAAmB,CAAC,EAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAmB;YACnC,EAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAC;YAC/C,EAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACjD,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC;YACnD,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAC;SACtD,CAAC;QACF,MAAM,MAAM,GAAoB;YAC9B,kBAAkB,EAAE,IAAI;YACxB,oBAAoB,EAAE,IAAI;YAC1B,iBAAiB;YACjB,YAAY,EAAE,YAAY;SAC3B,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,qBAAS,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE;gBACtB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;gBAChC,OAAO,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC;gBAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;gBACjC,OAAO,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC;gBAClD,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;gBACnC,OAAO,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;gBACpC,OAAO,CAAC,IAAI,CAAC,EAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE;gBACxC,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC;oBACV,OAAO,EAAE,oBAAoB;oBAC7B,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;SACF;QACD,OAAO,EAAC,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAC,CAAC;IAC/D,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,GAAW;QACnC,MAAM,MAAM,GAAmB,IAAI,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;YACrB,yDAAyD;YACzD,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;gBACjC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC3B,CAAC,IAAI,CAAC,CAAC;aACR;iBAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE;gBACxC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC3B,CAAC,IAAI,CAAC,CAAC;aACR;iBAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBAC1B,2BAA2B;gBAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE;oBACtB,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;wBAClB,KAAK,GAAG;4BACN,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BAC5B,MAAM;wBACR,KAAK,GAAG;4BACN,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BAC5B,MAAM;wBACR,KAAK,GAAG;4BACN,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;4BAC9B,MAAM;qBACT;oBACD,CAAC,IAAI,CAAC,CAAC;iBACR;qBAAM;oBACL,CAAC,EAAE,CAAC;iBACL;aACF;iBAAM;gBACL,0BAA0B;gBAC1B,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE;oBACd,KAAK,GAAG;wBACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACrB,MAAM;oBACR,KAAK,GAAG;wBACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACrB,MAAM;oBACR,KAAK,GAAG;wBACN,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBACvB,MAAM;iBACT;gBACD,CAAC,EAAE,CAAC;aACL;SACF;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,OAA0B;QACpD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,OAAO,OAAO,CAAC;SAChB;QACD,IAAI,QAAQ,GAAoB,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAsB,CAAC,QAAQ,CAAC,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,IAAI,QAAQ,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC7C,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;aAC5C;iBAAM;gBACL,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACxB;SACF;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,IAAY;QACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,IAAY;QAC3C,YAAY,CAAC,oBAAoB,CAAC,SAAS,GAAG,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAEO,eAAe,CAAC,OAA0B;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;YACzB,OAAO,KAAK,CAAC;SACd;QACD,MAAM,YAAY,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;QAExD,MAAM,cAAc,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,cAAc,IAAI,YAAY,CAAC;QACrD,MAAM,YAAY,GAAG,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAE3D,IAAI,QAAQ,GAAmB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,IAAI,YAAY,IAAI,eAAe,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzE,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;SACtC;aAAM,IAAI,aAAa,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC3C,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAC7C;aAAM,IAAI,cAAc,EAAE;YACzB,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAC7C;aAAM,IAAI,YAAY,EAAE;YACvB,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YACjD,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,IAAI,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAC7C;aAAM;YACL,UAAU;YACV,IAAI,GAAG,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;SAC7C;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,OAAO,KAAK,CAAC;SACd;QAED,MAAM,MAAM,GAAoB,EAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,EAAC,CAAC;QACrE,4DAA4D;QAC5D,oDAAoD;QACpD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;;AA1LH,oCA2LC;AA1LyB,yBAAY,GAAW,UAAU,CAAC;AAClC,4BAAe,GAAW,UAAU,CAAC;AACrC,8BAAiB,GAAW,IAAI,CAAC;AACjC,4BAAe,GAAW,WAAW,CAAC;AACtC,8BAAiB,GAAW,SAAS,CAAC;AACtC,iCAAoB,GAAW,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Clause } from './clause_types';
|
|
2
|
+
import { BaseSerializer } from './base_serializer';
|
|
3
|
+
export declare class StringSerializer extends BaseSerializer {
|
|
4
|
+
constructor(clauses: Clause[]);
|
|
5
|
+
serialize(): string;
|
|
6
|
+
private static isNegated;
|
|
7
|
+
private static escapeSpecialCharacters;
|
|
8
|
+
private static escapeWildcardCharacters;
|
|
9
|
+
private static stringConditionToString;
|
|
10
|
+
private static clauseToString;
|
|
11
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StringSerializer = void 0;
|
|
4
|
+
const base_serializer_1 = require("./base_serializer");
|
|
5
|
+
class StringSerializer extends base_serializer_1.BaseSerializer {
|
|
6
|
+
constructor(clauses) {
|
|
7
|
+
super(clauses);
|
|
8
|
+
}
|
|
9
|
+
serialize() {
|
|
10
|
+
const result = StringSerializer.clauseToString(this.clauses);
|
|
11
|
+
return result.trim().replace(/,$/, '');
|
|
12
|
+
}
|
|
13
|
+
static isNegated(operator) {
|
|
14
|
+
return (operator === 'NOTEMPTY' ||
|
|
15
|
+
operator === '!~' ||
|
|
16
|
+
operator === '!=' ||
|
|
17
|
+
operator === 'notStarts' ||
|
|
18
|
+
operator === 'notEnds' ||
|
|
19
|
+
operator === 'notContains');
|
|
20
|
+
}
|
|
21
|
+
static escapeSpecialCharacters(input) {
|
|
22
|
+
return input.replace(/[,\\]/g, match => `\\${match}`);
|
|
23
|
+
}
|
|
24
|
+
static escapeWildcardCharacters(input) {
|
|
25
|
+
return input.replace(/[_%]/g, match => `\\${match}`);
|
|
26
|
+
}
|
|
27
|
+
// export type StringOperator = 'EMPTY' | 'NOTEMPTY' | 'starts' | 'ends' | 'contains' | 'notStarts' |
|
|
28
|
+
// 'notEnds' | 'notContains' | '~' | '=' | '!~' | '!=';
|
|
29
|
+
static stringConditionToString(operator, value) {
|
|
30
|
+
if (operator === 'EMPTY') {
|
|
31
|
+
return 'EMPTY';
|
|
32
|
+
}
|
|
33
|
+
else if (operator === 'NOTEMPTY') {
|
|
34
|
+
return '-EMPTY';
|
|
35
|
+
}
|
|
36
|
+
const negated = StringSerializer.isNegated(operator);
|
|
37
|
+
if (value === null) {
|
|
38
|
+
return negated ? '-NULL' : 'NULL';
|
|
39
|
+
}
|
|
40
|
+
if (value === 'NULL' || value === '-NULL') {
|
|
41
|
+
return (negated ? '-' : '') + '\\' + value;
|
|
42
|
+
}
|
|
43
|
+
value = StringSerializer.escapeSpecialCharacters(value);
|
|
44
|
+
if (operator === 'starts' || operator === 'notStarts') {
|
|
45
|
+
value = StringSerializer.escapeWildcardCharacters(value);
|
|
46
|
+
return (negated ? '-' : '') + value + '%';
|
|
47
|
+
}
|
|
48
|
+
else if (operator === 'ends' || operator === 'notEnds') {
|
|
49
|
+
value = StringSerializer.escapeWildcardCharacters(value);
|
|
50
|
+
return (negated ? '-' : '') + '%' + value;
|
|
51
|
+
}
|
|
52
|
+
else if (operator === 'contains' || operator === 'notContains') {
|
|
53
|
+
value = StringSerializer.escapeWildcardCharacters(value);
|
|
54
|
+
return (negated ? '-' : '') + '%' + value + '%';
|
|
55
|
+
}
|
|
56
|
+
else if (operator === '=' || operator === '!=') {
|
|
57
|
+
value = StringSerializer.escapeWildcardCharacters(value);
|
|
58
|
+
return (negated ? '-' : '') + value;
|
|
59
|
+
}
|
|
60
|
+
return (negated ? '-' : '') + value;
|
|
61
|
+
}
|
|
62
|
+
static clauseToString(clauses) {
|
|
63
|
+
let result = '';
|
|
64
|
+
for (const genericClause of clauses) {
|
|
65
|
+
const clause = genericClause;
|
|
66
|
+
for (const value of clause.values) {
|
|
67
|
+
const word = StringSerializer.stringConditionToString(clause.operator, value);
|
|
68
|
+
if (word) {
|
|
69
|
+
result += word + ', ';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.StringSerializer = StringSerializer;
|
|
77
|
+
//# sourceMappingURL=string_serializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string_serializer.js","sourceRoot":"","sources":["../src/string_serializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token_types.js","sourceRoot":"","sources":["../src/token_types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Token } from './token_types';
|
|
2
|
+
export interface SpecialToken {
|
|
3
|
+
type: string;
|
|
4
|
+
value: string | RegExp;
|
|
5
|
+
ignoreCase?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface TokenizerParams {
|
|
8
|
+
specialSubstrings: SpecialToken[];
|
|
9
|
+
specialWords: SpecialToken[];
|
|
10
|
+
combineAdjacentWords?: boolean;
|
|
11
|
+
splitOnWhitespace?: boolean;
|
|
12
|
+
trimWordWhitespace?: boolean;
|
|
13
|
+
separators?: RegExp;
|
|
14
|
+
}
|
|
15
|
+
export declare class Tokenizer {
|
|
16
|
+
private input;
|
|
17
|
+
private index;
|
|
18
|
+
private specialSubstrings;
|
|
19
|
+
private specialWords;
|
|
20
|
+
private params;
|
|
21
|
+
constructor(input: string, params: TokenizerParams);
|
|
22
|
+
private tokenize;
|
|
23
|
+
parse(): Token[];
|
|
24
|
+
private hasMoreInput;
|
|
25
|
+
private isWhitespace;
|
|
26
|
+
private consumeWhitespace;
|
|
27
|
+
private maybeConsumeWord;
|
|
28
|
+
private isSpecialSubstring;
|
|
29
|
+
private consumeSpecialSubstring;
|
|
30
|
+
static combineAdjacentWords(tokens: Token[]): Token[];
|
|
31
|
+
static trimWordWhitespace(tokens: Token[]): Token[];
|
|
32
|
+
static isSpecialWord(token: Token, specials: SpecialToken[]): Token | undefined;
|
|
33
|
+
static convertSpecialWords(tokens: Token[], specials: SpecialToken[]): Token[];
|
|
34
|
+
/**
|
|
35
|
+
* Checks if the token types starting at the given index match the types in the input string.
|
|
36
|
+
*
|
|
37
|
+
* @param types - A string of types separated by '|'. Eg 'TYPEA|TYPEB|TYPEC'
|
|
38
|
+
* @param tokens - An array of tokens.
|
|
39
|
+
* @param index - The index into the token array to start checking from.
|
|
40
|
+
* @returns True if the token types match, false otherwise.
|
|
41
|
+
*/
|
|
42
|
+
static matchTypes(types: string, tokens: Token[], index: number): Token[] | undefined;
|
|
43
|
+
/**
|
|
44
|
+
* Merges tokens that match a given type string into a single token with a specified merge type.
|
|
45
|
+
*
|
|
46
|
+
* @param types - A string of types separated by '|'.
|
|
47
|
+
* @param tokens - An array of tokens.
|
|
48
|
+
* @param mergeType - The type to use for the merged token.
|
|
49
|
+
* @returns The updated token list with merged tokens.
|
|
50
|
+
*/
|
|
51
|
+
static mergeTypes(types: string, tokens: Token[], mergeType: string): Token[];
|
|
52
|
+
}
|