@malloydata/malloy 0.0.80-dev230907183434 → 0.0.80

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.
Files changed (32) hide show
  1. package/dist/lang/ast/expressions/expr-aggregate-function.d.ts +8 -2
  2. package/dist/lang/ast/expressions/expr-aggregate-function.js +211 -12
  3. package/dist/lang/ast/expressions/expr-asymmetric.d.ts +2 -1
  4. package/dist/lang/ast/expressions/expr-asymmetric.js +5 -2
  5. package/dist/lang/ast/expressions/expr-avg.d.ts +1 -1
  6. package/dist/lang/ast/expressions/expr-avg.js +2 -2
  7. package/dist/lang/ast/expressions/expr-sum.d.ts +1 -1
  8. package/dist/lang/ast/expressions/expr-sum.js +2 -2
  9. package/dist/lang/ast/field-space/static-space.js +19 -2
  10. package/dist/lang/ast/field-space/struct-space-field-base.d.ts +2 -1
  11. package/dist/lang/ast/field-space/struct-space-field-base.js +3 -0
  12. package/dist/lang/ast/types/lookup-result.d.ts +5 -0
  13. package/dist/lang/ast/types/malloy-element.d.ts +1 -0
  14. package/dist/lang/ast/types/malloy-element.js +4 -0
  15. package/dist/lang/lib/Malloy/MalloyLexer.d.ts +75 -74
  16. package/dist/lang/lib/Malloy/MalloyLexer.js +1101 -1094
  17. package/dist/lang/lib/Malloy/MalloyParser.d.ts +91 -78
  18. package/dist/lang/lib/Malloy/MalloyParser.js +866 -801
  19. package/dist/lang/lib/Malloy/MalloyParserListener.d.ts +13 -0
  20. package/dist/lang/lib/Malloy/MalloyParserVisitor.d.ts +8 -0
  21. package/dist/lang/malloy-to-ast.d.ts +3 -0
  22. package/dist/lang/malloy-to-ast.js +76 -25
  23. package/dist/lang/parse-malloy.d.ts +1 -0
  24. package/dist/lang/parse-malloy.js +13 -0
  25. package/dist/lang/test/expressions.spec.js +241 -25
  26. package/dist/lang/test/parse.spec.js +1 -127
  27. package/dist/lang/test/query.spec.js +1 -1
  28. package/dist/lang/test/test-translator.d.ts +7 -1
  29. package/dist/lang/test/test-translator.js +40 -13
  30. package/dist/model/utils.d.ts +1 -0
  31. package/dist/model/utils.js +101 -1
  32. package/package.json +1 -1
@@ -28,7 +28,7 @@ export declare class TestTranslator extends MalloyTranslator {
28
28
  readonly testSrc: string;
29
29
  testRoot?: TestRoot;
30
30
  internalModel: ModelDef;
31
- constructor(testSrc: string, rootRule?: string);
31
+ constructor(testSrc: string, rootRule?: string, internalModel?: ModelDef);
32
32
  translate(): TranslateResponse;
33
33
  addChild(url: string): void;
34
34
  ast(): MalloyElement | undefined;
@@ -44,6 +44,7 @@ export declare class TestTranslator extends MalloyTranslator {
44
44
  export declare class BetaExpression extends TestTranslator {
45
45
  private compiled?;
46
46
  constructor(src: string);
47
+ private testFS;
47
48
  compile(): void;
48
49
  generated(): ExprValue;
49
50
  }
@@ -62,6 +63,11 @@ interface HasTranslator extends MarkedSource {
62
63
  }
63
64
  export declare function expr(unmarked: TemplateStringsArray, ...marked: string[]): HasTranslator;
64
65
  export declare function model(unmarked: TemplateStringsArray, ...marked: string[]): HasTranslator;
66
+ export declare function makeModelFunc(options: {
67
+ model?: ModelDef;
68
+ prefix?: string;
69
+ wrap?: (code: string) => string;
70
+ }): (unmarked: TemplateStringsArray, ...marked: string[]) => HasTranslator;
65
71
  export declare function markSource(unmarked: TemplateStringsArray, ...marked: string[]): MarkedSource;
66
72
  export declare function getSelectOneStruct(sqlBlock: SQLBlockSource): SQLBlockStructDef;
67
73
  export {};
@@ -23,7 +23,7 @@
23
23
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
24
  */
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.getSelectOneStruct = exports.markSource = exports.model = exports.expr = exports.getJoinField = exports.getQueryField = exports.getFieldDef = exports.getModelQuery = exports.getExplore = exports.BetaExpression = exports.TestTranslator = exports.TestChildTranslator = exports.aTableDef = exports.pretty = void 0;
26
+ exports.getSelectOneStruct = exports.markSource = exports.makeModelFunc = exports.model = exports.expr = exports.getJoinField = exports.getQueryField = exports.getFieldDef = exports.getModelQuery = exports.getExplore = exports.BetaExpression = exports.TestTranslator = exports.TestChildTranslator = exports.aTableDef = exports.pretty = void 0;
27
27
  const util_1 = require("util");
28
28
  const malloy_types_1 = require("../../model/malloy_types");
29
29
  const ast_1 = require("../ast");
@@ -51,6 +51,14 @@ const mockSchema = {
51
51
  { type: 'timestamp', name: 'ats' },
52
52
  { type: 'unsupported', name: 'aun' },
53
53
  { type: 'unsupported', name: 'aweird', rawType: 'weird' },
54
+ {
55
+ type: 'struct',
56
+ name: 'astruct',
57
+ structSource: { type: 'nested' },
58
+ structRelationship: { type: 'inline' },
59
+ fields: [{ type: 'number', name: 'column', numberType: 'integer' }],
60
+ dialect: 'standardsql',
61
+ },
54
62
  ],
55
63
  },
56
64
  'malloytest.carriers': {
@@ -188,7 +196,7 @@ class TestChildTranslator extends parse_malloy_1.MalloyChildTranslator {
188
196
  exports.TestChildTranslator = TestChildTranslator;
189
197
  const testURI = 'internal://test/langtests/root.malloy';
190
198
  class TestTranslator extends parse_malloy_1.MalloyTranslator {
191
- constructor(testSrc, rootRule = 'malloyDocument') {
199
+ constructor(testSrc, rootRule = 'malloyDocument', internalModel) {
192
200
  super(testURI);
193
201
  this.testSrc = testSrc;
194
202
  /*
@@ -252,6 +260,9 @@ class TestTranslator extends parse_malloy_1.MalloyTranslator {
252
260
  };
253
261
  this.grammarRule = rootRule;
254
262
  this.importZone.define(testURI, testSrc);
263
+ if (internalModel !== undefined) {
264
+ this.internalModel = internalModel;
265
+ }
255
266
  for (const tableName in mockSchema) {
256
267
  this.schemaZone.define(tableName, mockSchema[tableName]);
257
268
  this.schemaZone.define('conn:' + tableName, mockSchema[tableName]);
@@ -357,20 +368,24 @@ class BetaExpression extends TestTranslator {
357
368
  constructor(src) {
358
369
  super(src, 'justExpr');
359
370
  }
371
+ testFS() {
372
+ const aStruct = this.internalModel.contents['ab'];
373
+ if (aStruct.type === 'struct') {
374
+ const tstFS = new static_space_1.StaticSpace(aStruct);
375
+ return tstFS;
376
+ }
377
+ else {
378
+ throw new Error("Can't get simple namespace for expression tests");
379
+ }
380
+ }
360
381
  compile() {
361
382
  const exprAst = this.ast();
362
383
  if (exprAst instanceof ast_1.ExpressionDef) {
363
- const aStruct = this.internalModel.contents['ab'];
364
- if (aStruct.type === 'struct') {
365
- const tstFS = new static_space_1.StaticSpace(aStruct);
366
- const exprDef = exprAst.getExpression(tstFS);
367
- this.compiled = exprDef;
368
- if (TestTranslator.inspectCompile) {
369
- console.log('EXPRESSION: ', pretty(exprDef));
370
- }
371
- }
372
- else {
373
- throw new Error("Can't get simple namespace for expression tests");
384
+ const tstFS = this.testFS();
385
+ const exprDef = exprAst.getExpression(tstFS);
386
+ this.compiled = exprDef;
387
+ if (TestTranslator.inspectCompile) {
388
+ console.log('EXPRESSION: ', pretty(exprDef));
374
389
  }
375
390
  }
376
391
  else if (this.logger.hasErrors()) {
@@ -447,6 +462,18 @@ function model(unmarked, ...marked) {
447
462
  };
448
463
  }
449
464
  exports.model = model;
465
+ function makeModelFunc(options) {
466
+ return function model(unmarked, ...marked) {
467
+ var _a;
468
+ const ms = markSource(unmarked, ...marked);
469
+ return {
470
+ ...ms,
471
+ translator: new TestTranslator(((_a = options.prefix) !== null && _a !== void 0 ? _a : '') +
472
+ (options.wrap ? options.wrap(ms.code) : ms.code), undefined, options === null || options === void 0 ? void 0 : options.model),
473
+ };
474
+ };
475
+ }
476
+ exports.makeModelFunc = makeModelFunc;
450
477
  function markSource(unmarked, ...marked) {
451
478
  let code = '';
452
479
  const locations = [];
@@ -22,5 +22,6 @@ export declare class AndChain {
22
22
  }
23
23
  export declare function generateHash(input: string): string;
24
24
  export declare function exprMap(expr: Expr, func: (fragment: Fragment) => Expr): Expr;
25
+ export declare function exprWalk(expr: Expr, func: (fragment: Fragment) => void): void;
25
26
  export declare function joinWith<T>(els: T[][], sep: T): T[];
26
27
  export declare function range(start: number, end: number): number[];
@@ -22,7 +22,7 @@
22
22
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
23
  */
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.range = exports.joinWith = exports.exprMap = exports.generateHash = exports.AndChain = exports.generateSQLStringLiteral = exports.indent = void 0;
25
+ exports.range = exports.joinWith = exports.exprWalk = exports.exprMap = exports.generateHash = exports.AndChain = exports.generateSQLStringLiteral = exports.indent = void 0;
26
26
  const uuid_1 = require("uuid");
27
27
  /** simple indent function */
28
28
  function indent(s) {
@@ -199,6 +199,106 @@ function exprMap(expr, func) {
199
199
  });
200
200
  }
201
201
  exports.exprMap = exprMap;
202
+ function exprWalk(expr, func) {
203
+ expr.forEach(fragment => {
204
+ func(fragment);
205
+ if (typeof fragment === 'string') {
206
+ return fragment;
207
+ }
208
+ switch (fragment.type) {
209
+ case 'aggregate':
210
+ case 'all':
211
+ case 'spread':
212
+ case 'sql_expression':
213
+ case 'exclude':
214
+ return {
215
+ ...fragment,
216
+ e: exprWalk(fragment.e, func),
217
+ };
218
+ case 'apply':
219
+ return {
220
+ ...fragment,
221
+ to: exprWalk(fragment.to, func),
222
+ value: exprWalk(fragment.value, func),
223
+ };
224
+ case 'applyVal':
225
+ case 'field':
226
+ case 'function_parameter':
227
+ case 'parameter':
228
+ case 'outputField':
229
+ return fragment;
230
+ case 'function_call':
231
+ return {
232
+ ...fragment,
233
+ args: fragment.args.map(arg => exprWalk(arg, func)),
234
+ };
235
+ case 'filterExpression':
236
+ return {
237
+ ...fragment,
238
+ e: exprWalk(fragment.e, func),
239
+ filterList: fragment.filterList.map(filter => {
240
+ return {
241
+ ...filter,
242
+ expression: exprWalk(filter.expression, func),
243
+ };
244
+ }),
245
+ };
246
+ case 'dialect': {
247
+ switch (fragment.function) {
248
+ case 'cast':
249
+ case 'regexpMatch':
250
+ return {
251
+ ...fragment,
252
+ expr: exprWalk(fragment.expr, func),
253
+ };
254
+ case 'delta':
255
+ return {
256
+ ...fragment,
257
+ delta: exprWalk(fragment.delta, func),
258
+ };
259
+ case 'div':
260
+ return {
261
+ ...fragment,
262
+ denominator: exprWalk(fragment.denominator, func),
263
+ numerator: exprWalk(fragment.numerator, func),
264
+ };
265
+ case 'now':
266
+ case 'numberLiteral':
267
+ case 'stringLiteral':
268
+ case 'timeLiteral':
269
+ case 'regexpLiteral':
270
+ return fragment;
271
+ case 'extract':
272
+ case 'trunc':
273
+ return {
274
+ ...fragment,
275
+ expr: {
276
+ ...fragment.expr,
277
+ value: exprWalk(fragment.expr.value, func),
278
+ },
279
+ };
280
+ case 'timeDiff':
281
+ return {
282
+ ...fragment,
283
+ left: {
284
+ ...fragment.left,
285
+ value: exprWalk(fragment.left.value, func),
286
+ },
287
+ right: {
288
+ ...fragment.left,
289
+ value: exprWalk(fragment.left.value, func),
290
+ },
291
+ };
292
+ default:
293
+ throw new Error('unexpected dialect function');
294
+ }
295
+ }
296
+ default:
297
+ throw new Error('unexpected');
298
+ }
299
+ });
300
+ }
301
+ exports.exprWalk = exprWalk;
202
302
  function joinWith(els, sep) {
203
303
  const result = [];
204
304
  for (let i = 0; i < els.length; i++) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@malloydata/malloy",
3
- "version": "0.0.80-dev230907183434",
3
+ "version": "0.0.80",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",