@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,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Tokenizer = void 0;
|
|
4
|
+
class Tokenizer {
|
|
5
|
+
constructor(input, params) {
|
|
6
|
+
this.index = 0;
|
|
7
|
+
this.specialSubstrings = params.specialSubstrings;
|
|
8
|
+
this.specialWords = params.specialWords;
|
|
9
|
+
this.params = params;
|
|
10
|
+
this.input = input;
|
|
11
|
+
}
|
|
12
|
+
tokenize() {
|
|
13
|
+
let tokens = [];
|
|
14
|
+
let wordStart = -1;
|
|
15
|
+
let wordEnd = -1;
|
|
16
|
+
let special;
|
|
17
|
+
while (this.hasMoreInput()) {
|
|
18
|
+
if (this.params.splitOnWhitespace && this.isWhitespace(this.index)) {
|
|
19
|
+
this.maybeConsumeWord(wordStart, wordEnd, tokens);
|
|
20
|
+
wordStart = -1;
|
|
21
|
+
this.consumeWhitespace();
|
|
22
|
+
}
|
|
23
|
+
else if (this.input[this.index] === '\\') {
|
|
24
|
+
if (wordStart === -1) {
|
|
25
|
+
wordStart = this.index;
|
|
26
|
+
}
|
|
27
|
+
wordEnd = this.index;
|
|
28
|
+
this.index++;
|
|
29
|
+
if (this.hasMoreInput()) {
|
|
30
|
+
// Unless backslash is at the end, handle next char.
|
|
31
|
+
wordEnd = this.index;
|
|
32
|
+
this.index++;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if ((special = this.isSpecialSubstring())) {
|
|
36
|
+
this.maybeConsumeWord(wordStart, wordEnd, tokens);
|
|
37
|
+
wordStart = -1;
|
|
38
|
+
this.consumeSpecialSubstring(special, tokens);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if (wordStart === -1) {
|
|
42
|
+
wordStart = this.index;
|
|
43
|
+
}
|
|
44
|
+
wordEnd = this.index;
|
|
45
|
+
this.index++;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.maybeConsumeWord(wordStart, wordEnd, tokens);
|
|
49
|
+
tokens = Tokenizer.convertSpecialWords(tokens, this.specialWords);
|
|
50
|
+
if (this.params.combineAdjacentWords) {
|
|
51
|
+
tokens = Tokenizer.combineAdjacentWords(tokens);
|
|
52
|
+
}
|
|
53
|
+
if (this.params.trimWordWhitespace) {
|
|
54
|
+
tokens = Tokenizer.trimWordWhitespace(tokens);
|
|
55
|
+
}
|
|
56
|
+
return tokens;
|
|
57
|
+
}
|
|
58
|
+
parse() {
|
|
59
|
+
let tokens = this.tokenize();
|
|
60
|
+
if (this.params.trimWordWhitespace) {
|
|
61
|
+
tokens = Tokenizer.trimWordWhitespace(tokens);
|
|
62
|
+
}
|
|
63
|
+
return tokens;
|
|
64
|
+
}
|
|
65
|
+
hasMoreInput() {
|
|
66
|
+
return this.index < this.input.length;
|
|
67
|
+
}
|
|
68
|
+
isWhitespace(idx) {
|
|
69
|
+
return /\s/.test(this.input[idx]);
|
|
70
|
+
}
|
|
71
|
+
consumeWhitespace() {
|
|
72
|
+
while (this.hasMoreInput() && this.isWhitespace(this.index)) {
|
|
73
|
+
this.index++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
maybeConsumeWord(wordStart, wordEnd, tokens) {
|
|
77
|
+
if (wordStart >= 0 && wordEnd >= wordStart) {
|
|
78
|
+
tokens.push({
|
|
79
|
+
type: 'word',
|
|
80
|
+
value: this.input.substring(wordStart, wordEnd + 1),
|
|
81
|
+
startIndex: wordStart,
|
|
82
|
+
endIndex: wordEnd + 1,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
isSpecialSubstring() {
|
|
87
|
+
for (const special of this.specialSubstrings) {
|
|
88
|
+
if (special.value instanceof RegExp) {
|
|
89
|
+
const shifted = this.input.substring(this.index); // create a substring starting at index.
|
|
90
|
+
const matcher = special.value.exec(shifted);
|
|
91
|
+
if (matcher) {
|
|
92
|
+
return {
|
|
93
|
+
type: special.type,
|
|
94
|
+
value: special.value,
|
|
95
|
+
matchedString: matcher[0],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const subString = this.input.slice(this.index, this.index + special.value.length);
|
|
101
|
+
const matches = special.ignoreCase
|
|
102
|
+
? subString.toLowerCase() === special.value.toLowerCase()
|
|
103
|
+
: subString === special.value;
|
|
104
|
+
if (matches) {
|
|
105
|
+
const value = special.ignoreCase
|
|
106
|
+
? subString.toUpperCase()
|
|
107
|
+
: subString;
|
|
108
|
+
return {
|
|
109
|
+
type: special.type,
|
|
110
|
+
value: special.value,
|
|
111
|
+
matchedString: value,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
consumeSpecialSubstring(special, tokens) {
|
|
119
|
+
tokens.push({
|
|
120
|
+
type: special.type,
|
|
121
|
+
value: special.matchedString,
|
|
122
|
+
startIndex: this.index,
|
|
123
|
+
endIndex: this.index + special.matchedString.length,
|
|
124
|
+
});
|
|
125
|
+
this.index += special.matchedString.length;
|
|
126
|
+
}
|
|
127
|
+
static combineAdjacentWords(tokens) {
|
|
128
|
+
const output = [];
|
|
129
|
+
let previousToken = undefined;
|
|
130
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
131
|
+
const currentToken = tokens[i];
|
|
132
|
+
if (currentToken.type === 'word' &&
|
|
133
|
+
previousToken &&
|
|
134
|
+
previousToken.type === 'word') {
|
|
135
|
+
previousToken.value += currentToken.value;
|
|
136
|
+
previousToken.endIndex = currentToken.endIndex;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
output.push(currentToken);
|
|
140
|
+
}
|
|
141
|
+
previousToken = currentToken;
|
|
142
|
+
}
|
|
143
|
+
return output;
|
|
144
|
+
}
|
|
145
|
+
static trimWordWhitespace(tokens) {
|
|
146
|
+
const output = [];
|
|
147
|
+
for (const token of tokens) {
|
|
148
|
+
if (token.type === 'word') {
|
|
149
|
+
token.value = token.value.trim();
|
|
150
|
+
}
|
|
151
|
+
output.push(token);
|
|
152
|
+
}
|
|
153
|
+
return output;
|
|
154
|
+
}
|
|
155
|
+
static isSpecialWord(token, specials) {
|
|
156
|
+
for (const special of specials) {
|
|
157
|
+
if (special.value instanceof RegExp) {
|
|
158
|
+
const regexp = special.value;
|
|
159
|
+
regexp.lastIndex = 0; // Set the starting index for the search
|
|
160
|
+
if (regexp.test(token.value)) {
|
|
161
|
+
const value = special.ignoreCase
|
|
162
|
+
? token.value.toUpperCase()
|
|
163
|
+
: token.value;
|
|
164
|
+
return {
|
|
165
|
+
type: special.type,
|
|
166
|
+
value: value,
|
|
167
|
+
startIndex: token.startIndex,
|
|
168
|
+
endIndex: token.endIndex,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const matches = special.ignoreCase
|
|
174
|
+
? token.value.toLowerCase() === special.value.toLowerCase()
|
|
175
|
+
: token.value === special.value;
|
|
176
|
+
if (matches) {
|
|
177
|
+
const value = special.ignoreCase
|
|
178
|
+
? token.value.toUpperCase()
|
|
179
|
+
: token.value;
|
|
180
|
+
return {
|
|
181
|
+
type: special.type,
|
|
182
|
+
value: value,
|
|
183
|
+
startIndex: token.startIndex,
|
|
184
|
+
endIndex: token.endIndex,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
static convertSpecialWords(tokens, specials) {
|
|
192
|
+
const output = [];
|
|
193
|
+
let special = undefined;
|
|
194
|
+
for (const token of tokens) {
|
|
195
|
+
if (token.type === 'word' &&
|
|
196
|
+
(special = Tokenizer.isSpecialWord(token, specials))) {
|
|
197
|
+
output.push(special);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
output.push(token);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return output;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Checks if the token types starting at the given index match the types in the input string.
|
|
207
|
+
*
|
|
208
|
+
* @param types - A string of types separated by '|'. Eg 'TYPEA|TYPEB|TYPEC'
|
|
209
|
+
* @param tokens - An array of tokens.
|
|
210
|
+
* @param index - The index into the token array to start checking from.
|
|
211
|
+
* @returns True if the token types match, false otherwise.
|
|
212
|
+
*/
|
|
213
|
+
static matchTypes(types, tokens, index) {
|
|
214
|
+
const typeArray = types.split('|');
|
|
215
|
+
if (index < 0 || index + typeArray.length > tokens.length) {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
// Iterate over the types and check if they match the token types
|
|
219
|
+
for (let i = 0; i < typeArray.length; i++) {
|
|
220
|
+
if (index + i >= tokens.length) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
if (tokens[index + i].type !== typeArray[i]) {
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return tokens.slice(index, index + typeArray.length);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Merges tokens that match a given type string into a single token with a specified merge type.
|
|
231
|
+
*
|
|
232
|
+
* @param types - A string of types separated by '|'.
|
|
233
|
+
* @param tokens - An array of tokens.
|
|
234
|
+
* @param mergeType - The type to use for the merged token.
|
|
235
|
+
* @returns The updated token list with merged tokens.
|
|
236
|
+
*/
|
|
237
|
+
static mergeTypes(types, tokens, mergeType) {
|
|
238
|
+
const output = [];
|
|
239
|
+
let i = 0;
|
|
240
|
+
while (i < tokens.length) {
|
|
241
|
+
// Check if the current token matches the type string
|
|
242
|
+
const matchedTokens = Tokenizer.matchTypes(types, tokens, i);
|
|
243
|
+
if (matchedTokens && matchedTokens.length > 0) {
|
|
244
|
+
const mergedToken = {
|
|
245
|
+
type: mergeType,
|
|
246
|
+
value: '',
|
|
247
|
+
values: matchedTokens,
|
|
248
|
+
startIndex: matchedTokens[0].startIndex,
|
|
249
|
+
endIndex: matchedTokens[matchedTokens.length - 1].endIndex,
|
|
250
|
+
};
|
|
251
|
+
output.push(mergedToken);
|
|
252
|
+
i += matchedTokens.length;
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
output.push(tokens[i]);
|
|
256
|
+
i++;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return output;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.Tokenizer = Tokenizer;
|
|
263
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tokenizer_1 = require("./tokenizer");
|
|
4
|
+
function makeParams() {
|
|
5
|
+
const specialSubstrings = [
|
|
6
|
+
{ type: ',', value: ',' },
|
|
7
|
+
{ type: 'VARIABLE', value: /^\$\{[^}]+\}/ },
|
|
8
|
+
];
|
|
9
|
+
const specialWords = [
|
|
10
|
+
{ type: 'NULL', value: 'null', ignoreCase: true },
|
|
11
|
+
{ type: 'EMPTY', value: 'empty', ignoreCase: true },
|
|
12
|
+
{ type: 'NOTNULL', value: '-null', ignoreCase: true },
|
|
13
|
+
{ type: 'NOTEMPTY', value: '-empty', ignoreCase: true },
|
|
14
|
+
{
|
|
15
|
+
type: 'DAYOFWEEK',
|
|
16
|
+
value: /^(monday|tuesday|wednesday|thursday|friday|saturday|sunday)$/i,
|
|
17
|
+
ignoreCase: true,
|
|
18
|
+
},
|
|
19
|
+
{ type: 'STATE', value: /^(California|Washington)$/i },
|
|
20
|
+
{ type: 'DATE', value: /^\d\d\d\d-\d\d-\d\d$/ },
|
|
21
|
+
{ type: 'DATE', value: /^\d\d\d\d-\d\d$/ },
|
|
22
|
+
{ type: 'DATE', value: /^\d\d\d\d$/ },
|
|
23
|
+
];
|
|
24
|
+
return {
|
|
25
|
+
splitOnWhitespace: true,
|
|
26
|
+
trimWordWhitespace: true,
|
|
27
|
+
specialSubstrings,
|
|
28
|
+
specialWords,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
describe('Tokenizer', () => {
|
|
32
|
+
const makeToken = (type, value, startIndex, endIndex) => ({ type, value, startIndex, endIndex });
|
|
33
|
+
it('should tokenize a simple string', () => {
|
|
34
|
+
const input = 'hello world';
|
|
35
|
+
const expectedTokens = [
|
|
36
|
+
makeToken('word', 'hello', 0, 5),
|
|
37
|
+
makeToken('word', 'world', 6, 11),
|
|
38
|
+
];
|
|
39
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
40
|
+
});
|
|
41
|
+
it('should split adjacent characters when no whitespace', () => {
|
|
42
|
+
const specialSubstrings = [
|
|
43
|
+
{ type: ',', value: ',' },
|
|
44
|
+
{ type: 'exclamation', value: '!' },
|
|
45
|
+
{ type: 'bracket', value: '[' },
|
|
46
|
+
];
|
|
47
|
+
const input = '[hello],big,world!';
|
|
48
|
+
const expectedTokens = [
|
|
49
|
+
makeToken('bracket', '[', 0, 1),
|
|
50
|
+
makeToken('word', 'hello]', 1, 7),
|
|
51
|
+
makeToken(',', ',', 7, 8),
|
|
52
|
+
makeToken('word', 'big', 8, 11),
|
|
53
|
+
makeToken(',', ',', 11, 12),
|
|
54
|
+
makeToken('word', 'world', 12, 17),
|
|
55
|
+
makeToken('exclamation', '!', 17, 18),
|
|
56
|
+
];
|
|
57
|
+
expect(new tokenizer_1.Tokenizer(input, { ...makeParams(), specialSubstrings }).parse()).toEqual(expectedTokens);
|
|
58
|
+
});
|
|
59
|
+
it('should match special tokens', () => {
|
|
60
|
+
const input = 'hello NULL world,-Null,-\'NULL" ,NULL, NULL , ';
|
|
61
|
+
const expectedTokens = [
|
|
62
|
+
makeToken('word', 'hello', 0, 5),
|
|
63
|
+
makeToken('NULL', 'NULL', 6, 10),
|
|
64
|
+
makeToken('word', 'world', 11, 16),
|
|
65
|
+
makeToken(',', ',', 16, 17),
|
|
66
|
+
makeToken('NOTNULL', '-NULL', 17, 22),
|
|
67
|
+
makeToken(',', ',', 22, 23),
|
|
68
|
+
makeToken('word', '-\'NULL"', 23, 30),
|
|
69
|
+
makeToken(',', ',', 31, 32),
|
|
70
|
+
makeToken('NULL', 'NULL', 32, 36),
|
|
71
|
+
makeToken(',', ',', 36, 37),
|
|
72
|
+
makeToken('NULL', 'NULL', 38, 42),
|
|
73
|
+
makeToken(',', ',', 43, 44),
|
|
74
|
+
];
|
|
75
|
+
const params = makeParams();
|
|
76
|
+
expect(new tokenizer_1.Tokenizer(input, params).parse()).toEqual(expectedTokens);
|
|
77
|
+
});
|
|
78
|
+
it('should not combine adjacent words', () => {
|
|
79
|
+
const input = 'ABC DEF';
|
|
80
|
+
const expectedTokens = [
|
|
81
|
+
makeToken('word', 'ABC', 0, 3),
|
|
82
|
+
makeToken('word', 'DEF', 4, 7),
|
|
83
|
+
];
|
|
84
|
+
const params = makeParams();
|
|
85
|
+
expect(new tokenizer_1.Tokenizer(input, params).parse()).toEqual(expectedTokens);
|
|
86
|
+
});
|
|
87
|
+
it('should combine adjacent words when combineAdjacentWords', () => {
|
|
88
|
+
const input = 'ABC DEF';
|
|
89
|
+
const expectedTokens = [makeToken('word', 'ABCDEF', 0, 7)];
|
|
90
|
+
const params = { ...makeParams(), combineAdjacentWords: true };
|
|
91
|
+
expect(new tokenizer_1.Tokenizer(input, params).parse()).toEqual(expectedTokens);
|
|
92
|
+
});
|
|
93
|
+
it('escaping should prevent special token matching', () => {
|
|
94
|
+
const input = 'N\\ULL';
|
|
95
|
+
const expectedTokens = [makeToken('word', 'N\\ULL', 0, 5)];
|
|
96
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
97
|
+
});
|
|
98
|
+
it('should match escaped characters', () => {
|
|
99
|
+
const input = 'hello \\n world';
|
|
100
|
+
const expectedTokens = [
|
|
101
|
+
makeToken('word', 'hello', 0, 5),
|
|
102
|
+
makeToken('word', '\\n', 6, 8),
|
|
103
|
+
makeToken('word', 'world', 9, 14),
|
|
104
|
+
];
|
|
105
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
106
|
+
});
|
|
107
|
+
it('should preserve all escaped characters', () => {
|
|
108
|
+
const input = "he'llo \\t \\${w}or\\,ld";
|
|
109
|
+
const expectedTokens = [
|
|
110
|
+
makeToken('word', "he'llo", 0, 6),
|
|
111
|
+
makeToken('word', '\\t', 7, 9),
|
|
112
|
+
makeToken('word', '\\${w}or\\,ld', 10, 21),
|
|
113
|
+
];
|
|
114
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
115
|
+
});
|
|
116
|
+
it('should match regexp and capitalize special matches', () => {
|
|
117
|
+
const input = "hello tuesDAY,ttuesday, tuesdayy ,Tuesday , ttuesday, 'TUESday' ";
|
|
118
|
+
const expectedTokens = [
|
|
119
|
+
makeToken('word', 'hello', 0, 5),
|
|
120
|
+
makeToken('DAYOFWEEK', 'TUESDAY', 6, 13),
|
|
121
|
+
makeToken(',', ',', 13, 14),
|
|
122
|
+
makeToken('word', 'ttuesday', 14, 22),
|
|
123
|
+
makeToken(',', ',', 22, 23),
|
|
124
|
+
makeToken('word', 'tuesdayy', 24, 32),
|
|
125
|
+
makeToken(',', ',', 33, 34),
|
|
126
|
+
makeToken('DAYOFWEEK', 'TUESDAY', 34, 41),
|
|
127
|
+
makeToken(',', ',', 42, 43),
|
|
128
|
+
makeToken('word', 'ttuesday', 44, 52),
|
|
129
|
+
makeToken(',', ',', 52, 53),
|
|
130
|
+
makeToken('word', "'TUESday'", 54, 63),
|
|
131
|
+
];
|
|
132
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
133
|
+
});
|
|
134
|
+
it('should match regexp and not capitalize', () => {
|
|
135
|
+
const input = 'Washington, Washingo,washington,wWashington ';
|
|
136
|
+
const expectedTokens = [
|
|
137
|
+
makeToken('STATE', 'Washington', 0, 10),
|
|
138
|
+
makeToken(',', ',', 10, 11),
|
|
139
|
+
makeToken('word', 'Washingo', 12, 20),
|
|
140
|
+
makeToken(',', ',', 20, 21),
|
|
141
|
+
makeToken('STATE', 'washington', 21, 31),
|
|
142
|
+
makeToken(',', ',', 31, 32),
|
|
143
|
+
makeToken('word', 'wWashington', 32, 43),
|
|
144
|
+
];
|
|
145
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
146
|
+
});
|
|
147
|
+
it('should match substring regexp', () => {
|
|
148
|
+
const input = 'hello \\${var1},aa${var2}bb, cc${var3} dd';
|
|
149
|
+
const expectedTokens = [
|
|
150
|
+
makeToken('word', 'hello', 0, 5),
|
|
151
|
+
makeToken('word', '\\${var1}', 7, 15),
|
|
152
|
+
makeToken(',', ',', 15, 16),
|
|
153
|
+
makeToken('word', 'aa', 16, 18),
|
|
154
|
+
makeToken('VARIABLE', '${var2}', 18, 25),
|
|
155
|
+
makeToken('word', 'bb', 25, 27),
|
|
156
|
+
makeToken(',', ',', 27, 28),
|
|
157
|
+
makeToken('word', 'cc', 29, 31),
|
|
158
|
+
makeToken('VARIABLE', '${var3}', 31, 38),
|
|
159
|
+
makeToken('word', 'dd', 39, 41),
|
|
160
|
+
];
|
|
161
|
+
expect(new tokenizer_1.Tokenizer(input, makeParams()).parse()).toEqual(expectedTokens);
|
|
162
|
+
});
|
|
163
|
+
describe('mergeTypes', () => {
|
|
164
|
+
it('should return an empty array when input is empty', () => {
|
|
165
|
+
const result = tokenizer_1.Tokenizer.mergeTypes('', [], 'merged');
|
|
166
|
+
expect(result).toEqual([]);
|
|
167
|
+
});
|
|
168
|
+
it('should not merge tokens when no match is found', () => {
|
|
169
|
+
const tokens = [
|
|
170
|
+
{ type: 'x', value: '1', startIndex: 0, endIndex: 1 },
|
|
171
|
+
{ type: 'y', value: '2', startIndex: 1, endIndex: 2 },
|
|
172
|
+
];
|
|
173
|
+
const result = tokenizer_1.Tokenizer.mergeTypes('a|b', tokens, 'merged');
|
|
174
|
+
expect(result).toEqual(tokens);
|
|
175
|
+
});
|
|
176
|
+
it('should merge tokens when a single match is found', () => {
|
|
177
|
+
const tokens = [
|
|
178
|
+
{ type: 'a', value: '1', startIndex: 0, endIndex: 1 },
|
|
179
|
+
{ type: 'b', value: '2', startIndex: 1, endIndex: 2 },
|
|
180
|
+
];
|
|
181
|
+
const expected = [
|
|
182
|
+
{
|
|
183
|
+
type: 'merged',
|
|
184
|
+
value: '',
|
|
185
|
+
values: [tokens[0], tokens[1]],
|
|
186
|
+
startIndex: 0,
|
|
187
|
+
endIndex: 2,
|
|
188
|
+
},
|
|
189
|
+
];
|
|
190
|
+
const result = tokenizer_1.Tokenizer.mergeTypes('a|b', tokens, 'merged');
|
|
191
|
+
expect(result).toEqual(expected);
|
|
192
|
+
});
|
|
193
|
+
it('should merge multiple matches', () => {
|
|
194
|
+
const tokens = [
|
|
195
|
+
{ type: 'a', value: '1', startIndex: 0, endIndex: 1 },
|
|
196
|
+
{ type: 'b', value: '2', startIndex: 1, endIndex: 2 },
|
|
197
|
+
{ type: 'a', value: '3', startIndex: 2, endIndex: 3 },
|
|
198
|
+
{ type: 'b', value: '4', startIndex: 3, endIndex: 4 },
|
|
199
|
+
];
|
|
200
|
+
const expected = [
|
|
201
|
+
{
|
|
202
|
+
type: 'merged',
|
|
203
|
+
value: '',
|
|
204
|
+
values: [tokens[0], tokens[1]],
|
|
205
|
+
startIndex: 0,
|
|
206
|
+
endIndex: 2,
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
type: 'merged',
|
|
210
|
+
value: '',
|
|
211
|
+
values: [tokens[2], tokens[3]],
|
|
212
|
+
startIndex: 2,
|
|
213
|
+
endIndex: 4,
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
const result = tokenizer_1.Tokenizer.mergeTypes('a|b', tokens, 'merged');
|
|
217
|
+
expect(result).toEqual(expected);
|
|
218
|
+
});
|
|
219
|
+
it('should not merge partial matches', () => {
|
|
220
|
+
const tokens = [
|
|
221
|
+
{ type: 'a', value: '1', startIndex: 0, endIndex: 1 },
|
|
222
|
+
{ type: 'b', value: '2', startIndex: 1, endIndex: 2 },
|
|
223
|
+
];
|
|
224
|
+
const result = tokenizer_1.Tokenizer.mergeTypes('a|b|c', tokens, 'merged');
|
|
225
|
+
expect(result).toEqual(tokens);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
describe('matchTypes', () => {
|
|
229
|
+
it('should return tokens when types match', () => {
|
|
230
|
+
const tokens = [makeToken('a', '1', 0, 1), makeToken('b', '2', 1, 2)];
|
|
231
|
+
expect(tokenizer_1.Tokenizer.matchTypes('a|b', tokens, 0)).toEqual(tokens);
|
|
232
|
+
});
|
|
233
|
+
it('should return undefined when types do not match', () => {
|
|
234
|
+
const tokens = [makeToken('x', '1', 0, 1), makeToken('y', '2', 1, 2)];
|
|
235
|
+
expect(tokenizer_1.Tokenizer.matchTypes('a|b', tokens, 0)).toBeUndefined();
|
|
236
|
+
});
|
|
237
|
+
it('should return undefined when index is out of range', () => {
|
|
238
|
+
const tokens = [makeToken('a', '1', 0, 1)];
|
|
239
|
+
expect(tokenizer_1.Tokenizer.matchTypes('a|b', tokens, 1)).toBeUndefined();
|
|
240
|
+
});
|
|
241
|
+
it('should return all matching tokens when multiple types match', () => {
|
|
242
|
+
const tokens = [
|
|
243
|
+
makeToken('a', '1', 0, 1),
|
|
244
|
+
makeToken('b', '2', 1, 2),
|
|
245
|
+
makeToken('c', '3', 2, 3),
|
|
246
|
+
];
|
|
247
|
+
expect(tokenizer_1.Tokenizer.matchTypes('a|b|c', tokens, 0)).toEqual(tokens);
|
|
248
|
+
});
|
|
249
|
+
it('should return only matching tokens when partial match occurs', () => {
|
|
250
|
+
const tokens = [makeToken('a', '1', 0, 1), makeToken('b', '2', 1, 2)];
|
|
251
|
+
expect(tokenizer_1.Tokenizer.matchTypes('a|b|c', tokens, 0)).toBeUndefined();
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
//# sourceMappingURL=tokenizer.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.spec.js","sourceRoot":"","sources":["../src/tokenizer.spec.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@malloydata/malloy-filter",
|
|
3
|
+
"version": "0.0.237-dev250221201621",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "",
|
|
6
|
+
"main": "dist/string_parser.js",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/malloydata/malloy"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc --build",
|
|
13
|
+
"samples": "node dist/generate_samples.js",
|
|
14
|
+
"asimpleparser": "node dist/a_simple_parser.js",
|
|
15
|
+
"asimpleserializer": "node dist/a_simple_serializer.js",
|
|
16
|
+
"test": "jest --runInBand",
|
|
17
|
+
"test:tokenizer": "jest tokenizer.spec.ts"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [],
|
|
20
|
+
"author": ""
|
|
21
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Testing
|
|
2
|
+
|
|
3
|
+
The `malloy-filter` tests use Jest. Install Jest using:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install --save-dev jest @types/jest ts-jest
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Tokenizer Testing
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm run test:tokenizer
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
# generate_samples
|
|
16
|
+
|
|
17
|
+
The `generate_samples.ts` script creates the suite of examples in ../SAMPLES.md. As such, it is also a terrific tool for testing and validating changes to any of the parsers. Feel free to add new examples to `generate_samples.ts` as new features are added to the parsers.
|
|
18
|
+
|
|
19
|
+
To create the samples:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run build
|
|
23
|
+
npm run samples
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Comment/uncomment individual lines in `generateSamples()` to enable/disable sample generation for the different parsers.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {FilterParser} from './filter_parser';
|
|
2
|
+
|
|
3
|
+
/* eslint-disable no-console */
|
|
4
|
+
function aSimpleParser() {
|
|
5
|
+
let str = 'CAT,DOG';
|
|
6
|
+
let response = new FilterParser(str, 'string').parse();
|
|
7
|
+
console.log(str, '\n', ...response.clauses, '\n');
|
|
8
|
+
|
|
9
|
+
str = '-5.5, 10, 2.3e7';
|
|
10
|
+
response = new FilterParser(str, 'number').parse();
|
|
11
|
+
console.log(str, '\n', ...response.clauses, '\n');
|
|
12
|
+
|
|
13
|
+
str = 'null, false';
|
|
14
|
+
response = new FilterParser(str, 'boolean').parse();
|
|
15
|
+
console.log(str, '\n', ...response.clauses, '\n');
|
|
16
|
+
|
|
17
|
+
str = 'after 2025-10-05';
|
|
18
|
+
response = new FilterParser(str, 'date').parse();
|
|
19
|
+
console.log(str, '\n', ...response.clauses, '\n');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
aSimpleParser();
|