@malloydata/malloy 0.0.1 → 0.0.2

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.
@@ -35,7 +35,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
35
35
  return result;
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.fsPair = exports.DefSpace = exports.IndexFieldSpace = exports.ProjectFieldSpace = exports.ReduceFieldSpace = exports.QuerySpace = exports.QueryOperationSpace = exports.DynamicSpace = exports.StaticSpace = void 0;
38
+ exports.DefSpace = exports.IndexFieldSpace = exports.ProjectFieldSpace = exports.ReduceFieldSpace = exports.ResultSpace = exports.QuerySpace = exports.DynamicSpace = exports.StaticSpace = void 0;
39
39
  /* eslint-disable no-useless-constructor */
40
40
  const lodash_1 = require("lodash");
41
41
  const dialect_1 = require("../dialect");
@@ -54,8 +54,13 @@ class StaticSpace {
54
54
  whenComplete(step) {
55
55
  step();
56
56
  }
57
- getDialect() {
58
- return (0, dialect_1.getDialect)(this.fromStruct.dialect);
57
+ dialectObj() {
58
+ try {
59
+ return (0, dialect_1.getDialect)(this.fromStruct.dialect);
60
+ }
61
+ catch {
62
+ return undefined;
63
+ }
59
64
  }
60
65
  fromFieldDef(from) {
61
66
  if (from.type === "struct") {
@@ -116,6 +121,8 @@ class StaticSpace {
116
121
  }
117
122
  if (found instanceof space_field_1.SpaceField) {
118
123
  /*
124
+ * TODO cache defs, post the addReference call to whenComplete
125
+ *
119
126
  * In the cleanup phase of query space construction, it may check
120
127
  * the output space for ungrouping variables. However if an
121
128
  * ungrouping variable is a measure, the field expression value
@@ -129,18 +136,7 @@ class StaticSpace {
129
136
  * ... or this check would look at the finalized output of
130
137
  * the namespace and not re-compile ...
131
138
  */
132
- let definition = undefined;
133
- if (this instanceof QuerySpace) {
134
- const qfd = found.getQueryFieldDef(this.qfs());
135
- if (qfd &&
136
- typeof qfd != "string" &&
137
- !model.isFilteredAliasedName(qfd)) {
138
- definition = qfd;
139
- }
140
- }
141
- else {
142
- definition = found.fieldDef();
143
- }
139
+ const definition = found.fieldDef();
144
140
  if (definition) {
145
141
  head.addReference({
146
142
  type: found instanceof space_field_1.StructSpaceField
@@ -285,7 +281,7 @@ class DynamicSpace extends StaticSpace {
285
281
  def.log("Can't rename field to itself");
286
282
  continue;
287
283
  }
288
- const oldValue = def.oldName.getField(fsPair(this));
284
+ const oldValue = def.oldName.getField(this);
289
285
  if (oldValue.found) {
290
286
  if (oldValue.found instanceof space_field_1.SpaceField) {
291
287
  this.setEntry(def.newName, new space_field_1.RenameSpaceField(oldValue.found, def.newName, def.location));
@@ -360,7 +356,7 @@ class DynamicSpace extends StaticSpace {
360
356
  }
361
357
  // If we have join expressions, we need to now go back and fill them in
362
358
  for (const [join, missingOn] of fixupJoins) {
363
- join.fixupJoinOn(fsPair(this), missingOn);
359
+ join.fixupJoinOn(this, missingOn);
364
360
  }
365
361
  }
366
362
  this.isComplete();
@@ -370,25 +366,39 @@ class DynamicSpace extends StaticSpace {
370
366
  exports.DynamicSpace = DynamicSpace;
371
367
  /**
372
368
  * A namespace for Query operations. The have an input and an
373
- * output set of fields.
369
+ * output set of fields. The InputSpace is the QueryOperationSpace
370
+ * which is where all expressions are evaluated, and the output
371
+ * space is ResultSpace.
372
+ *
374
373
  */
375
- class QueryOperationSpace extends DynamicSpace {
376
- constructor(input) {
374
+ class QuerySpace extends DynamicSpace {
375
+ constructor(input, result) {
377
376
  const inputSpace = new SourceSpace(input);
378
- super({ ...inputSpace.structDef, fields: [] });
379
- this.queryInput = inputSpace;
377
+ super(inputSpace.structDef);
378
+ this.result = result;
379
+ this.extendList = [];
380
380
  }
381
- inputFS() {
382
- return this.queryInput.fieldSpace;
381
+ extendSource(extendField) {
382
+ this.addField(extendField);
383
+ if (extendField instanceof ast_1.Join) {
384
+ this.extendList.push(extendField.name.refString);
385
+ }
386
+ else {
387
+ this.extendList.push(extendField.defineName);
388
+ }
383
389
  }
384
- structDef() {
385
- // Actually since we have the input structdef and the fields, this feels
386
- // like it could return the output structdef of the query op ... except
387
- // the pipeline code merges refinements in before asking for the output
388
- // struct, and that would require a call back here somehow to get the
389
- // pre-refinement fields ... I think possibly this is always a
390
- // runtime error
391
- throw new Error("StructDef requested from QueryOperationSpace");
390
+ }
391
+ exports.QuerySpace = QuerySpace;
392
+ class ResultSpace extends DynamicSpace {
393
+ constructor(queryInputSpace) {
394
+ super(queryInputSpace.emptyStructDef());
395
+ this.queryInputSpace = queryInputSpace;
396
+ this.exprSpace = new QuerySpace(queryInputSpace, this);
397
+ }
398
+ log(s) {
399
+ if (this.astEl) {
400
+ this.astEl.log(s);
401
+ }
392
402
  }
393
403
  addMembers(members) {
394
404
  for (const member of members) {
@@ -415,45 +425,18 @@ class QueryOperationSpace extends DynamicSpace {
415
425
  addWild(wild) {
416
426
  this.setEntry(wild.refString, new space_field_1.WildSpaceField(wild.refString));
417
427
  }
418
- log(s) {
419
- if (this.astEl) {
420
- this.astEl.log(s);
421
- }
422
- }
423
- }
424
- exports.QueryOperationSpace = QueryOperationSpace;
425
- /**
426
- * Reduce and project queries use a "QuerySpace"
427
- */
428
- class QuerySpace extends QueryOperationSpace {
429
- constructor() {
430
- super(...arguments);
431
- this.extendedFields = [];
432
- }
433
- extendSource(extendField) {
434
- this.extendedFields.push(extendField instanceof ast_1.Join
435
- ? extendField.name.refString
436
- : extendField.defineName);
437
- this.extendInto().addField(extendField);
438
- }
439
- inputFS() {
440
- if (this.extendedInput) {
441
- return this.extendedInput;
442
- }
443
- return this.queryInput.fieldSpace;
444
- }
445
- qfs() {
446
- return {
447
- in: this.inputFS(),
448
- out: this,
449
- };
450
- }
428
+ /**
429
+ * Check for the definition of an ungrouping reference in the result space,
430
+ * or in the case of an exclude reference, if this query is nested
431
+ * in another query, in the result space of a query that this query
432
+ * is nested inside of.
433
+ */
451
434
  checkUngroup(fn, isExclude) {
452
- if (this.lookup([fn]).error) {
453
- if (isExclude && this.nestParent) {
454
- const parent = this.nestParent;
435
+ if (!this.entry(fn.refString)) {
436
+ if (isExclude && this.exprSpace.nestParent) {
437
+ const parent = this.exprSpace.nestParent;
455
438
  parent.whenComplete(() => {
456
- parent.checkUngroup(fn, isExclude);
439
+ parent.result.checkUngroup(fn, isExclude);
457
440
  });
458
441
  }
459
442
  else {
@@ -462,46 +445,6 @@ class QuerySpace extends QueryOperationSpace {
462
445
  }
463
446
  }
464
447
  }
465
- extendInto() {
466
- if (!this.extendedInput) {
467
- this.extendedInput = new DynamicSpace(this.queryInput.sourceSpec);
468
- }
469
- return this.extendedInput;
470
- }
471
- getPipeSegment(refineFrom) {
472
- const reduceOrProject = this.segType;
473
- if (reduceOrProject === "index") {
474
- throw new Error("IndexSegment getPipeSegment should not call super");
475
- }
476
- if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
477
- for (const xField of refineFrom.extendSource) {
478
- this.extendInto().addFieldDef(xField);
479
- }
480
- }
481
- const segment = {
482
- type: reduceOrProject,
483
- fields: this.queryFieldDefs(),
484
- };
485
- segment.fields = (0, field_utils_1.mergeFields)(refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.fields, segment.fields);
486
- if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
487
- segment.extendSource = refineFrom.extendSource;
488
- }
489
- if (this.extendedInput) {
490
- const newExtends = [];
491
- // have to get the whole structdef because we need all the join
492
- // resolution to happen and that only happens at the completion
493
- // of the structdef generation.
494
- const extendedStruct = this.extendedInput.structDef();
495
- for (const extendName of this.extendedFields) {
496
- const extendEnt = extendedStruct.fields.find((f) => (0, field_utils_1.nameOf)(f) == extendName);
497
- if (extendEnt) {
498
- newExtends.push(extendEnt);
499
- }
500
- }
501
- segment.extendSource = (0, field_utils_1.mergeFields)(segment.extendSource, newExtends);
502
- }
503
- return segment;
504
- }
505
448
  addQueryItems(...qiList) {
506
449
  for (const qi of qiList) {
507
450
  if (qi instanceof ast_1.FieldReference || qi instanceof ast_1.NestReference) {
@@ -511,8 +454,8 @@ class QuerySpace extends QueryOperationSpace {
511
454
  this.addField(qi);
512
455
  }
513
456
  else if ((0, ast_1.isNestedQuery)(qi)) {
514
- const qf = new space_field_1.QueryFieldAST(this.inputFS(), qi, qi.name);
515
- qf.nestParent = this;
457
+ const qf = new space_field_1.QueryFieldAST(this, qi, qi.name);
458
+ qf.nestParent = this.exprSpace;
516
459
  this.setEntry(qi.name, qf);
517
460
  }
518
461
  else {
@@ -528,13 +471,13 @@ class QuerySpace extends QueryOperationSpace {
528
471
  const fields = [];
529
472
  for (const [name, field] of this.entries()) {
530
473
  if (field instanceof space_field_1.SpaceField) {
531
- const fieldQueryDef = field.getQueryFieldDef(this.qfs());
474
+ const fieldQueryDef = field.getQueryFieldDef(this.exprSpace);
532
475
  if (fieldQueryDef) {
533
476
  if (this.canContain(fieldQueryDef)) {
534
477
  fields.push(fieldQueryDef);
535
478
  }
536
479
  else {
537
- this.log(`'${name}' not legal in ${this.segType}`);
480
+ this.log(`'${name}' not legal in ${this.segmentType}`);
538
481
  }
539
482
  }
540
483
  else {
@@ -545,19 +488,61 @@ class QuerySpace extends QueryOperationSpace {
545
488
  this.isComplete();
546
489
  return fields;
547
490
  }
491
+ getQuerySegment(rf) {
492
+ const p = this.getPipeSegment(rf);
493
+ if (model.isQuerySegment(p)) {
494
+ return p;
495
+ }
496
+ throw new Error("TODO NOT POSSIBLE");
497
+ }
498
+ getPipeSegment(refineFrom) {
499
+ if (this.segmentType == "index") {
500
+ // TODO ... should make this go away
501
+ throw new Error("INDEX FIELD PIPE SEGMENT MIS HANDLED");
502
+ }
503
+ if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
504
+ for (const xField of refineFrom.extendSource) {
505
+ this.exprSpace.addFieldDef(xField);
506
+ }
507
+ }
508
+ const segment = {
509
+ type: this.segmentType,
510
+ fields: this.queryFieldDefs(),
511
+ };
512
+ segment.fields = (0, field_utils_1.mergeFields)(refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.fields, segment.fields);
513
+ if (refineFrom === null || refineFrom === void 0 ? void 0 : refineFrom.extendSource) {
514
+ segment.extendSource = refineFrom.extendSource;
515
+ }
516
+ if (this.exprSpace.extendList.length > 0) {
517
+ const newExtends = [];
518
+ const extendedStruct = this.exprSpace.structDef();
519
+ for (const extendName of this.exprSpace.extendList) {
520
+ const extendEnt = extendedStruct.fields.find((f) => (0, field_utils_1.nameOf)(f) == extendName);
521
+ if (extendEnt) {
522
+ newExtends.push(extendEnt);
523
+ }
524
+ }
525
+ segment.extendSource = (0, field_utils_1.mergeFields)(segment.extendSource, newExtends);
526
+ }
527
+ this.isComplete();
528
+ return segment;
529
+ }
548
530
  }
549
- exports.QuerySpace = QuerySpace;
550
- class ReduceFieldSpace extends QuerySpace {
531
+ exports.ResultSpace = ResultSpace;
532
+ /**
533
+ * Reduce and project queries use a "QuerySpace"
534
+ */
535
+ class ReduceFieldSpace extends ResultSpace {
551
536
  constructor() {
552
537
  super(...arguments);
553
- this.segType = "reduce";
538
+ this.segmentType = "reduce";
554
539
  }
555
540
  }
556
541
  exports.ReduceFieldSpace = ReduceFieldSpace;
557
- class ProjectFieldSpace extends QuerySpace {
542
+ class ProjectFieldSpace extends ResultSpace {
558
543
  constructor() {
559
544
  super(...arguments);
560
- this.segType = "project";
545
+ this.segmentType = "project";
561
546
  }
562
547
  canContain(qd) {
563
548
  if (typeof qd !== "string") {
@@ -577,14 +562,14 @@ class ProjectFieldSpace extends QuerySpace {
577
562
  }
578
563
  }
579
564
  exports.ProjectFieldSpace = ProjectFieldSpace;
580
- class IndexFieldSpace extends QueryOperationSpace {
565
+ class IndexFieldSpace extends ResultSpace {
581
566
  constructor() {
582
567
  super(...arguments);
583
- this.segType = "index";
568
+ this.segmentType = "index";
584
569
  this.fieldList = new Set();
585
570
  }
586
571
  addReference(ref) {
587
- if (ref.getField(this.inputFS()).found) {
572
+ if (ref.getField(this.exprSpace).found) {
588
573
  this.fieldList.add(ref.refString);
589
574
  }
590
575
  }
@@ -633,19 +618,12 @@ class DefSpace {
633
618
  }
634
619
  return this.realFS.lookup(symbol);
635
620
  }
636
- getDialect() {
637
- return this.realFS.getDialect();
621
+ dialectObj() {
622
+ return this.realFS.dialectObj();
638
623
  }
639
624
  whenComplete(step) {
640
625
  this.realFS.whenComplete(step);
641
626
  }
642
627
  }
643
628
  exports.DefSpace = DefSpace;
644
- function fsPair(inFS, outFS) {
645
- return {
646
- in: inFS,
647
- out: outFS || inFS,
648
- };
649
- }
650
- exports.fsPair = fsPair;
651
629
  //# sourceMappingURL=field-space.js.map
@@ -1,5 +1,5 @@
1
1
  import * as model from "../model/malloy_types";
2
- import { FieldSpace, FSPair, DynamicSpace, QuerySpace } from "./field-space";
2
+ import { FieldSpace, DynamicSpace, QuerySpace } from "./field-space";
3
3
  import { FieldValueType, FieldDeclaration, TurtleDecl, HasParameter, Join, FieldReference } from "./ast";
4
4
  interface FieldType {
5
5
  type: FieldValueType;
@@ -28,7 +28,7 @@ export declare class AbstractParameter extends SpaceParam {
28
28
  export declare abstract class SpaceField extends SpaceEntry {
29
29
  readonly refType = "field";
30
30
  protected fieldTypeFromFieldDef(def: model.FieldDef): FieldType;
31
- getQueryFieldDef(_fs: FSPair): model.QueryFieldDef | undefined;
31
+ getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
32
32
  fieldDef(): model.FieldDef | undefined;
33
33
  }
34
34
  export declare class RenameSpaceField extends SpaceField {
@@ -43,7 +43,7 @@ export declare class WildSpaceField extends SpaceField {
43
43
  readonly wildText: string;
44
44
  constructor(wildText: string);
45
45
  type(): FieldType;
46
- getQueryFieldDef(_fs: FSPair): model.QueryFieldDef;
46
+ getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef;
47
47
  }
48
48
  export declare class StructSpaceField extends SpaceField {
49
49
  protected sourceDef: model.StructDef;
@@ -67,7 +67,8 @@ export declare class ColumnSpaceField extends SpaceField {
67
67
  export declare abstract class QueryField extends SpaceField {
68
68
  protected inSpace: FieldSpace;
69
69
  constructor(inSpace: FieldSpace);
70
- getQueryFieldDef(_fs: FSPair): model.QueryFieldDef | undefined;
70
+ abstract getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
71
+ abstract fieldDef(): model.FieldDef;
71
72
  type(): FieldType;
72
73
  }
73
74
  export declare class QueryFieldAST extends QueryField {
@@ -76,6 +77,7 @@ export declare class QueryFieldAST extends QueryField {
76
77
  renameAs?: string;
77
78
  nestParent?: QuerySpace;
78
79
  constructor(fs: FieldSpace, turtle: TurtleDecl, name: string);
80
+ getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
79
81
  fieldDef(): model.TurtleDef;
80
82
  }
81
83
  export declare class QueryFieldStruct extends QueryField {
@@ -83,6 +85,7 @@ export declare class QueryFieldStruct extends QueryField {
83
85
  constructor(fs: FieldSpace, turtleDef: model.TurtleDef);
84
86
  rename(name: string): void;
85
87
  fieldDef(): model.TurtleDef;
88
+ getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef | undefined;
86
89
  }
87
90
  /**
88
91
  * FilteredAliasedName
@@ -96,13 +99,13 @@ export declare class FANSPaceField extends SpaceField {
96
99
  name(): string;
97
100
  private filtersPresent;
98
101
  fieldDef(): model.FieldDef | undefined;
99
- getQueryFieldDef(_fs: FSPair): model.QueryFieldDef;
102
+ getQueryFieldDef(_fs: FieldSpace): model.QueryFieldDef;
100
103
  type(): FieldType;
101
104
  }
102
105
  export declare class ReferenceField extends SpaceField {
103
106
  readonly fieldRef: FieldReference;
104
107
  constructor(fieldRef: FieldReference);
105
- getQueryFieldDef(fs: FSPair): model.QueryFieldDef | undefined;
108
+ getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef | undefined;
106
109
  type(): FieldType;
107
110
  }
108
111
  export declare class ExpressionFieldFromAst extends SpaceField {
@@ -113,7 +116,7 @@ export declare class ExpressionFieldFromAst extends SpaceField {
113
116
  constructor(space: DynamicSpace, exprDef: FieldDeclaration);
114
117
  get name(): string;
115
118
  fieldDef(): model.FieldDef;
116
- getQueryFieldDef(fs: FSPair): model.QueryFieldDef;
119
+ getQueryFieldDef(fs: FieldSpace): model.QueryFieldDef;
117
120
  type(): FieldType;
118
121
  }
119
122
  export {};
@@ -176,9 +176,6 @@ class QueryField extends SpaceField {
176
176
  super();
177
177
  this.inSpace = inSpace;
178
178
  }
179
- getQueryFieldDef(_fs) {
180
- return this.fieldDef();
181
- }
182
179
  type() {
183
180
  return { type: "turtle" };
184
181
  }
@@ -190,6 +187,13 @@ class QueryFieldAST extends QueryField {
190
187
  this.turtle = turtle;
191
188
  this.name = name;
192
189
  }
190
+ getQueryFieldDef(fs) {
191
+ const def = this.turtle.getFieldDef(fs, this.nestParent);
192
+ if (this.renameAs) {
193
+ def.as = this.renameAs;
194
+ }
195
+ return def;
196
+ }
193
197
  fieldDef() {
194
198
  const def = this.turtle.getFieldDef(this.inSpace, this.nestParent);
195
199
  if (this.renameAs) {
@@ -213,6 +217,9 @@ class QueryFieldStruct extends QueryField {
213
217
  fieldDef() {
214
218
  return this.turtleDef;
215
219
  }
220
+ getQueryFieldDef(_fs) {
221
+ return this.fieldDef();
222
+ }
216
223
  }
217
224
  exports.QueryFieldStruct = QueryFieldStruct;
218
225
  /**
@@ -297,7 +304,7 @@ class ReferenceField extends SpaceField {
297
304
  }
298
305
  getQueryFieldDef(fs) {
299
306
  // Lookup string and generate error if it isn't defined.
300
- const check = this.fieldRef.getField(fs.in);
307
+ const check = this.fieldRef.getField(fs);
301
308
  if (check.error) {
302
309
  this.fieldRef.log(check.error);
303
310
  }
@@ -233,7 +233,7 @@ class BetaExpression extends Testable {
233
233
  const aStruct = this.internalModel.contents.ab;
234
234
  if (aStruct.type === "struct") {
235
235
  const tstFS = new field_space_1.StaticSpace(aStruct);
236
- const exprDef = exprAst.getExpression({ in: tstFS, out: tstFS });
236
+ const exprDef = exprAst.getExpression(tstFS);
237
237
  if (inspectCompile) {
238
238
  console.log("EXPRESSION: ", (0, test_translator_1.pretty)(exprDef));
239
239
  }
@@ -1264,6 +1264,12 @@ class QueryQuery extends QueryField {
1264
1264
  switch (expr.function) {
1265
1265
  case "now":
1266
1266
  break;
1267
+ case "div":
1268
+ expressions.push(expr.denominator);
1269
+ expressions.push(expr.numerator);
1270
+ break;
1271
+ case "timeLiteral":
1272
+ break;
1267
1273
  case "timeDiff":
1268
1274
  expressions.push(expr.left.value, expr.right.value);
1269
1275
  break;
@@ -173,7 +173,18 @@ export interface RegexpMatchFragment extends DialectFragmentBase {
173
173
  expr: Expr;
174
174
  regexp: string;
175
175
  }
176
- export declare type DialectFragment = NowFragment | TimeDeltaFragment | TimeDiffFragment | TimeTruncFragment | TypecastFragment | TimeExtractFragment | RegexpMatchFragment;
176
+ export interface DivFragment extends DialectFragmentBase {
177
+ function: "div";
178
+ numerator: Expr;
179
+ denominator: Expr;
180
+ }
181
+ export interface TimeLiteralFragment extends DialectFragmentBase {
182
+ function: "timeLiteral";
183
+ literal: string;
184
+ literalType: TimeFieldType;
185
+ timezone: string;
186
+ }
187
+ export declare type DialectFragment = DivFragment | TimeLiteralFragment | NowFragment | TimeDeltaFragment | TimeDiffFragment | TimeTruncFragment | TypecastFragment | TimeExtractFragment | RegexpMatchFragment;
177
188
  export declare type Fragment = string | ApplyFragment | ApplyValueFragment | FieldFragment | ParameterFragment | FilterFragment | AggregateFragment | UngroupFragment | DialectFragment;
178
189
  export declare type Expr = Fragment[];
179
190
  export interface TypedValue {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@malloydata/malloy",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "license": "GPL-2.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,6 +18,7 @@
18
18
  "blueimp-md5": "^2.19.0",
19
19
  "lodash": "^4.17.20",
20
20
  "luxon": "^1.26.0",
21
+ "md5": "^2.3.0",
21
22
  "url": "^0.11.0"
22
23
  },
23
24
  "devDependencies": {