@malloydata/malloy-query-builder 0.0.240-dev250311202829 → 0.0.240-dev250311214430

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/query-ast.js CHANGED
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.ASTAnnotation = exports.ASTAnnotationList = exports.ASTLimitViewOperation = exports.ASTView = exports.ASTFilterWithFilterString = exports.ASTFilter = exports.ASTWhereViewOperation = exports.ASTNestViewOperation = exports.ASTFilteredFieldExpression = exports.ASTWhereList = exports.ASTWhere = exports.ASTTimeTruncationExpression = exports.ASTReferenceExpression = exports.ASTExpression = exports.ASTField = exports.ASTAggregateViewOperation = exports.ASTGroupByViewOperation = exports.ASTOrderByViewOperation = exports.ASTViewOperation = exports.ASTViewOperationList = exports.ASTSegmentViewDefinition = exports.ASTRefinementViewDefinition = exports.ASTArrowViewDefinition = exports.ASTReferenceViewDefinition = exports.ASTReferenceQueryDefinition = exports.ASTRefinementQueryDefinition = exports.ASTArrowQueryDefinition = exports.ASTQueryDefinition = exports.ASTUnimplemented = exports.ASTTimestampLiteralValue = exports.ASTDateLiteralValue = exports.ASTBooleanLiteralValue = exports.ASTNumberLiteralValue = exports.ASTNullLiteralValue = exports.ASTStringLiteralValue = exports.LiteralValueAST = exports.ASTParameterValue = exports.ASTParameterValueList = exports.ASTSourceReference = exports.ASTFieldReference = exports.ASTReference = exports.ASTQuery = void 0;
26
+ exports.ASTAnnotation = exports.ASTAnnotationList = exports.ASTLimitViewOperation = exports.ASTView = exports.ASTFilterWithFilterString = exports.ASTFilter = exports.ASTWhereViewOperation = exports.ASTNestViewOperation = exports.ASTFilteredFieldExpression = exports.ASTWhereList = exports.ASTWhere = exports.ASTTimeTruncationExpression = exports.ASTReferenceExpression = exports.ASTExpression = exports.ASTField = exports.ASTAggregateViewOperation = exports.ASTGroupByViewOperation = exports.ASTOrderByViewOperation = exports.ASTViewOperation = exports.ASTViewOperationList = exports.ASTSegmentViewDefinition = exports.ASTRefinementViewDefinition = exports.ASTArrowViewDefinition = exports.ASTReferenceViewDefinition = exports.ASTReferenceQueryArrowSource = exports.ASTReferenceQueryDefinition = exports.ASTRefinementQueryDefinition = exports.ASTArrowQueryDefinition = exports.ASTQueryDefinition = exports.ASTQueryArrowSource = exports.ASTUnimplemented = exports.ASTTimestampLiteralValue = exports.ASTDateLiteralValue = exports.ASTBooleanLiteralValue = exports.ASTNumberLiteralValue = exports.ASTNullLiteralValue = exports.ASTStringLiteralValue = exports.LiteralValueAST = exports.ASTParameterValue = exports.ASTParameterValueList = exports.ASTFieldReference = exports.ASTReference = exports.ASTQuery = void 0;
27
27
  /*
28
28
  * Copyright (c) Meta Platforms, Inc. and affiliates.
29
29
  *
@@ -63,10 +63,10 @@ class ASTNode {
63
63
  return node;
64
64
  throw new Error('Not an ASTReference');
65
65
  },
66
- SourceReference() {
67
- if (node instanceof ASTSourceReference)
66
+ ReferenceQueryArrowSource() {
67
+ if (node instanceof ASTReferenceQueryArrowSource)
68
68
  return node;
69
- throw new Error('Not an ASTSourceReference');
69
+ throw new Error('Not an ASTReferenceQueryArrowSource');
70
70
  },
71
71
  ParameterValueList() {
72
72
  if (node instanceof ASTParameterValueList)
@@ -200,8 +200,8 @@ class ASTNode {
200
200
  Reference(path) {
201
201
  return node.findAny(path).as.Reference();
202
202
  },
203
- SourceReference(path) {
204
- return node.findAny(path).as.SourceReference();
203
+ ReferenceQueryArrowSource(path) {
204
+ return node.findAny(path).as.ReferenceQueryArrowSource();
205
205
  },
206
206
  ParameterValueList(path) {
207
207
  return node.findAny(path).as.ParameterValueList();
@@ -519,8 +519,9 @@ class ASTQuery extends ASTObjectNode {
519
519
  }
520
520
  if (options.query) {
521
521
  const definition = options.query.definition;
522
- if (definition.kind === 'arrow') {
523
- const name = definition.source_reference.name;
522
+ if (definition.kind === 'arrow' &&
523
+ definition.source.kind === 'source_reference') {
524
+ const name = definition.source.name;
524
525
  chosenSource = options.model.entries.find(e => e.name === name);
525
526
  if (chosenSource === undefined) {
526
527
  throw new Error(`Model does not contain source or query named ${name}`);
@@ -538,7 +539,8 @@ class ASTQuery extends ASTObjectNode {
538
539
  const query = (_a = options.query) !== null && _a !== void 0 ? _a : {
539
540
  definition: {
540
541
  kind: 'arrow',
541
- source_reference: {
542
+ source: {
543
+ kind: 'source_reference',
542
544
  name: source.name,
543
545
  },
544
546
  view: {
@@ -607,7 +609,7 @@ class ASTQuery extends ASTObjectNode {
607
609
  }
608
610
  this.definition = new ASTArrowQueryDefinition({
609
611
  kind: 'arrow',
610
- source_reference: this.definition.sourceReference.build(),
612
+ source: this.definition.source.build(),
611
613
  view: {
612
614
  kind: 'segment',
613
615
  operations: [],
@@ -618,6 +620,11 @@ class ASTQuery extends ASTObjectNode {
618
620
  isRunnable() {
619
621
  return this.definition.isRunnable();
620
622
  }
623
+ isEmpty() {
624
+ return (this.definition instanceof ASTArrowQueryDefinition &&
625
+ this.definition.view instanceof ASTSegmentViewDefinition &&
626
+ this.definition.view.operations.length === 0);
627
+ }
621
628
  /**
622
629
  * Gets an {@link ASTSegmentViewDefinition} for the "default" place to add query
623
630
  * operations, or creates one if it doesn't exist.
@@ -660,7 +667,8 @@ class ASTQuery extends ASTObjectNode {
660
667
  */
661
668
  setSource(name) {
662
669
  if (this.definition instanceof ASTArrowQueryDefinition) {
663
- if (this.definition.sourceReference.name === name) {
670
+ if (this.definition.source instanceof ASTReferenceQueryArrowSource &&
671
+ this.definition.source.name === name) {
664
672
  return;
665
673
  }
666
674
  }
@@ -670,7 +678,10 @@ class ASTQuery extends ASTObjectNode {
670
678
  }
671
679
  this.definition = new ASTArrowQueryDefinition({
672
680
  kind: 'arrow',
673
- source_reference: { name },
681
+ source: {
682
+ kind: 'source_reference',
683
+ name,
684
+ },
674
685
  view: this.definition instanceof ASTArrowQueryDefinition
675
686
  ? this.definition.view.build()
676
687
  : {
@@ -761,7 +772,7 @@ class ASTQuery extends ASTObjectNode {
761
772
  }
762
773
  this.definition = new ASTArrowQueryDefinition({
763
774
  kind: 'arrow',
764
- source_reference: this.definition.sourceReference.build(),
775
+ source: this.definition.source.build(),
765
776
  view: {
766
777
  kind: 'view_reference',
767
778
  name,
@@ -769,21 +780,23 @@ class ASTQuery extends ASTObjectNode {
769
780
  });
770
781
  return this.definition.view.as.ReferenceViewDefinition();
771
782
  }
772
- getInheritedAnnotations() {
773
- var _a, _b;
774
- if (this.definition instanceof ASTReferenceQueryDefinition) {
775
- const query = this.getQueryInfo(this.definition.name);
783
+ _getInheritedAnnotations(definition) {
784
+ var _a;
785
+ if (definition instanceof ASTReferenceQueryDefinition) {
786
+ const query = this.getQueryInfo(definition.name);
776
787
  return (_a = query.annotations) !== null && _a !== void 0 ? _a : [];
777
788
  }
778
- else if (this.definition instanceof ASTRefinementQueryDefinition) {
779
- const query = this.getQueryInfo(this.definition.queryReference.name);
780
- return (_b = query.annotations) !== null && _b !== void 0 ? _b : [];
789
+ else if (definition instanceof ASTRefinementQueryDefinition) {
790
+ return this._getInheritedAnnotations(definition.base);
781
791
  }
782
- else if (this.definition instanceof ASTArrowQueryDefinition) {
783
- return this.definition.view.getInheritedAnnotations();
792
+ else if (definition instanceof ASTArrowQueryDefinition) {
793
+ return definition.view.getInheritedAnnotations();
784
794
  }
785
795
  return [];
786
796
  }
797
+ getInheritedAnnotations() {
798
+ return this._getInheritedAnnotations(this.definition);
799
+ }
787
800
  }
788
801
  exports.ASTQuery = ASTQuery;
789
802
  class ASTReference extends ASTObjectNode {
@@ -888,43 +901,6 @@ class ASTFieldReference extends ASTReference {
888
901
  }
889
902
  }
890
903
  exports.ASTFieldReference = ASTFieldReference;
891
- class ASTSourceReference extends ASTReference {
892
- /**
893
- * @internal
894
- */
895
- get query() {
896
- return this.parent.parent.as.Query();
897
- }
898
- /**
899
- * Gets the `Malloy.SourceInfo` for the referenced source
900
- *
901
- * @returns The source information for the referenced source
902
- */
903
- getSourceInfo() {
904
- const info = this.query.model.entries.find(e => e.name === this.name);
905
- if (info === undefined) {
906
- throw new Error('No source info found');
907
- }
908
- return info;
909
- }
910
- getSourceParameters() {
911
- var _a;
912
- return (_a = this.getSourceInfo().parameters) !== null && _a !== void 0 ? _a : [];
913
- }
914
- areRequiredParametersSet() {
915
- const sourceParameters = this.getSourceParameters();
916
- for (const parameterInfo of sourceParameters) {
917
- if (parameterInfo.default_value !== undefined)
918
- continue;
919
- const parameter = this.tryGetParameter(parameterInfo.name);
920
- if (parameter === undefined) {
921
- return false;
922
- }
923
- }
924
- return true;
925
- }
926
- }
927
- exports.ASTSourceReference = ASTSourceReference;
928
904
  class ASTParameterValueList extends ASTListNode {
929
905
  constructor(parameters) {
930
906
  super(parameters, parameters.map(p => new ASTParameterValue(p)));
@@ -1097,8 +1073,18 @@ class ASTUnimplemented extends ASTNode {
1097
1073
  }
1098
1074
  }
1099
1075
  exports.ASTUnimplemented = ASTUnimplemented;
1076
+ exports.ASTQueryArrowSource = {
1077
+ from(definition) {
1078
+ switch (definition.kind) {
1079
+ case 'refinement':
1080
+ return new ASTRefinementQueryDefinition(definition);
1081
+ case 'source_reference':
1082
+ return new ASTReferenceQueryArrowSource(definition);
1083
+ }
1084
+ },
1085
+ };
1100
1086
  exports.ASTQueryDefinition = {
1101
- from: (definition) => {
1087
+ from(definition) {
1102
1088
  switch (definition.kind) {
1103
1089
  case 'arrow':
1104
1090
  return new ASTArrowQueryDefinition(definition);
@@ -1113,7 +1099,7 @@ class ASTArrowQueryDefinition extends ASTObjectNode {
1113
1099
  constructor(node) {
1114
1100
  super(node, {
1115
1101
  kind: 'arrow',
1116
- source_reference: new ASTSourceReference(node.source_reference),
1102
+ source: exports.ASTQueryArrowSource.from(node.source),
1117
1103
  view: ASTViewDefinition.from(node.view),
1118
1104
  });
1119
1105
  this.node = node;
@@ -1126,20 +1112,24 @@ class ASTArrowQueryDefinition extends ASTObjectNode {
1126
1112
  this.children.view = view;
1127
1113
  view.parent = this;
1128
1114
  }
1129
- get sourceReference() {
1130
- return this.children.source_reference;
1115
+ get source() {
1116
+ return this.children.source;
1117
+ }
1118
+ set source(source) {
1119
+ this.edit();
1120
+ this.children.source = source;
1131
1121
  }
1132
1122
  getOrAddDefaultSegment() {
1133
1123
  return this.view.getOrAddDefaultSegment();
1134
1124
  }
1135
1125
  getSourceInfo() {
1136
- return this.sourceReference.getSourceInfo();
1126
+ return this.source.getSourceInfo();
1137
1127
  }
1138
1128
  getOutputSchema() {
1139
1129
  return this.view.getRefinementSchema();
1140
1130
  }
1141
1131
  isRunnable() {
1142
- return (this.view.isRunnable() && this.sourceReference.areRequiredParametersSet());
1132
+ return this.view.isRunnable() && this.source.isRunnable();
1143
1133
  }
1144
1134
  /**
1145
1135
  * @internal
@@ -1174,13 +1164,13 @@ class ASTRefinementQueryDefinition extends ASTObjectNode {
1174
1164
  constructor(node) {
1175
1165
  super(node, {
1176
1166
  kind: 'refinement',
1177
- query_reference: new ASTReference(node.query_reference),
1167
+ base: exports.ASTQueryDefinition.from(node.base),
1178
1168
  refinement: ASTViewDefinition.from(node.refinement),
1179
1169
  });
1180
1170
  this.node = node;
1181
1171
  }
1182
- get queryReference() {
1183
- return this.children.query_reference;
1172
+ get base() {
1173
+ return this.children.base;
1184
1174
  }
1185
1175
  get refinement() {
1186
1176
  return this.children.refinement;
@@ -1203,12 +1193,7 @@ class ASTRefinementQueryDefinition extends ASTObjectNode {
1203
1193
  return this.refinement.getOrAddDefaultSegment();
1204
1194
  }
1205
1195
  getOutputSchema() {
1206
- const model = this.query.model;
1207
- const query = model.entries.find(e => e.name === this.queryReference.name);
1208
- if (query === undefined) {
1209
- throw new Error(`Query not found with name ${this.queryReference.name}`);
1210
- }
1211
- const base = query.schema;
1196
+ const base = this.base.getOutputSchema();
1212
1197
  const refinement = this.refinement.getRefinementSchema();
1213
1198
  return ASTQuery.schemaMerge(base, refinement);
1214
1199
  }
@@ -1228,6 +1213,9 @@ class ASTRefinementQueryDefinition extends ASTObjectNode {
1228
1213
  reorderFields(names) {
1229
1214
  this.query.getOrAddAnnotations().setTagProperty(['field_order'], names);
1230
1215
  }
1216
+ getSourceInfo() {
1217
+ return this.base.getSourceInfo();
1218
+ }
1231
1219
  }
1232
1220
  exports.ASTRefinementQueryDefinition = ASTRefinementQueryDefinition;
1233
1221
  class ASTReferenceQueryDefinition extends ASTObjectNode {
@@ -1260,14 +1248,9 @@ class ASTReferenceQueryDefinition extends ASTObjectNode {
1260
1248
  return this.children.path;
1261
1249
  }
1262
1250
  getOrAddDefaultSegment() {
1263
- var _a;
1264
1251
  const newQuery = new ASTRefinementQueryDefinition({
1265
1252
  kind: 'refinement',
1266
- query_reference: {
1267
- name: this.name,
1268
- path: this.path,
1269
- parameters: (_a = this.parameters) === null || _a === void 0 ? void 0 : _a.build(),
1270
- },
1253
+ base: this.build(),
1271
1254
  refinement: {
1272
1255
  kind: 'segment',
1273
1256
  operations: [],
@@ -1300,8 +1283,123 @@ class ASTReferenceQueryDefinition extends ASTObjectNode {
1300
1283
  tryGetParameter(name) {
1301
1284
  return ASTReference.tryGetParameter(this, name);
1302
1285
  }
1286
+ getOutputSchema() {
1287
+ return this.getSourceInfo().schema;
1288
+ }
1289
+ getSourceInfo() {
1290
+ const model = this.query.model;
1291
+ const query = model.entries.find(e => e.name === this.name);
1292
+ if (query === undefined) {
1293
+ throw new Error(`Query not found with name ${this.name}`);
1294
+ }
1295
+ return query;
1296
+ }
1303
1297
  }
1304
1298
  exports.ASTReferenceQueryDefinition = ASTReferenceQueryDefinition;
1299
+ class ASTReferenceQueryArrowSource extends ASTObjectNode {
1300
+ constructor(node) {
1301
+ super(node, {
1302
+ kind: 'source_reference',
1303
+ name: node.name,
1304
+ path: node.path,
1305
+ parameters: node.parameters && new ASTParameterValueList(node.parameters),
1306
+ });
1307
+ this.node = node;
1308
+ }
1309
+ isRunnable() {
1310
+ return this.areRequiredParametersSet();
1311
+ }
1312
+ get name() {
1313
+ return this.children.name;
1314
+ }
1315
+ get arrow() {
1316
+ return this.parent.as.ArrowQueryDefinition();
1317
+ }
1318
+ get parameters() {
1319
+ return this.children.parameters;
1320
+ }
1321
+ set parameters(parameters) {
1322
+ this.edit();
1323
+ this.children.parameters = parameters;
1324
+ }
1325
+ get path() {
1326
+ return this.children.path;
1327
+ }
1328
+ getSourceInfo() {
1329
+ const entry = this.arrow.query.model.entries.find(entry => entry.name === this.name);
1330
+ if (entry === undefined) {
1331
+ throw new Error(`No query or source named ${this.name}`);
1332
+ }
1333
+ return entry;
1334
+ }
1335
+ getOrAddDefaultSegment() {
1336
+ const entry = this.getSourceInfo();
1337
+ if (entry.kind !== 'query') {
1338
+ throw new Error(`Cannot refine source ${this.name}`);
1339
+ }
1340
+ const newQuery = new ASTRefinementQueryDefinition({
1341
+ kind: 'refinement',
1342
+ base: {
1343
+ ...this.build(),
1344
+ kind: 'query_reference',
1345
+ },
1346
+ refinement: {
1347
+ kind: 'segment',
1348
+ operations: [],
1349
+ },
1350
+ });
1351
+ this.arrow.source = newQuery;
1352
+ return newQuery.refinement.as.SegmentViewDefinition();
1353
+ }
1354
+ /**
1355
+ * @internal
1356
+ */
1357
+ propagateUp(_f) {
1358
+ return;
1359
+ }
1360
+ /**
1361
+ * @internal
1362
+ */
1363
+ propagateDown(_f) {
1364
+ return;
1365
+ }
1366
+ getOrAddParameters() {
1367
+ return ASTReference.getOrAddParameters(this);
1368
+ }
1369
+ setParameter(name, value) {
1370
+ return ASTReference.setParameter(this, name, value);
1371
+ }
1372
+ tryGetParameter(name) {
1373
+ return ASTReference.tryGetParameter(this, name);
1374
+ }
1375
+ /**
1376
+ * @internal
1377
+ */
1378
+ get query() {
1379
+ return this.parent.parent.as.Query();
1380
+ }
1381
+ getSourceParameters() {
1382
+ var _a;
1383
+ const sourceInfo = this.getSourceInfo();
1384
+ if (sourceInfo.kind === 'query') {
1385
+ return [];
1386
+ }
1387
+ return (_a = sourceInfo.parameters) !== null && _a !== void 0 ? _a : [];
1388
+ }
1389
+ areRequiredParametersSet() {
1390
+ const sourceParameters = this.getSourceParameters();
1391
+ for (const parameterInfo of sourceParameters) {
1392
+ if (parameterInfo.default_value !== undefined)
1393
+ continue;
1394
+ const parameter = this.tryGetParameter(parameterInfo.name);
1395
+ if (parameter === undefined) {
1396
+ return false;
1397
+ }
1398
+ }
1399
+ return true;
1400
+ }
1401
+ }
1402
+ exports.ASTReferenceQueryArrowSource = ASTReferenceQueryArrowSource;
1305
1403
  const ASTViewDefinition = {
1306
1404
  from(definition) {
1307
1405
  switch (definition.kind) {
@@ -3375,13 +3473,13 @@ function tagFromAnnotations(prefix, annotations = [], inherited) {
3375
3473
  function serializeFilter(filter) {
3376
3474
  switch (filter.kind) {
3377
3475
  case 'string':
3378
- return new Filter.StringSerializer(filter.clauses).serialize();
3476
+ return Filter.StringFilterExpression.unparse(filter.parsed);
3379
3477
  case 'number':
3380
- return new Filter.NumberSerializer(filter.clauses).serialize();
3478
+ return Filter.NumberFilterExpression.unparse(filter.parsed);
3381
3479
  case 'boolean':
3382
- return new Filter.BooleanSerializer(filter.clauses).serialize();
3383
- case 'date':
3384
- return new Filter.DateSerializer(filter.clauses).serialize();
3480
+ return Filter.BooleanFilterExpression.unparse(filter.parsed);
3481
+ case 'temporal':
3482
+ return Filter.TemporalFilterExpression.unparse(filter.parsed);
3385
3483
  }
3386
3484
  }
3387
3485
  function parseFilter(filterString, kind) {
@@ -3393,24 +3491,24 @@ function parseFilter(filterString, kind) {
3393
3491
  }
3394
3492
  switch (kind) {
3395
3493
  case 'string': {
3396
- const result = new Filter.StringParser(filterString).parse();
3397
- handleError(result.logs);
3398
- return { kind, clauses: result.clauses };
3494
+ const result = Filter.StringFilterExpression.parse(filterString);
3495
+ handleError(result.log);
3496
+ return { kind, parsed: result.parsed };
3399
3497
  }
3400
3498
  case 'number': {
3401
- const result = new Filter.NumberParser(filterString).parse();
3402
- handleError(result.logs);
3403
- return { kind, clauses: result.clauses };
3499
+ const result = Filter.NumberFilterExpression.parse(filterString);
3500
+ handleError(result.log);
3501
+ return { kind, parsed: result.parsed };
3404
3502
  }
3405
3503
  case 'boolean': {
3406
- const result = new Filter.BooleanParser(filterString).parse();
3407
- handleError(result.logs);
3408
- return { kind, clauses: result.clauses };
3504
+ const result = Filter.BooleanFilterExpression.parse(filterString);
3505
+ handleError(result.log);
3506
+ return { kind, parsed: result.parsed };
3409
3507
  }
3410
- case 'date': {
3411
- const result = new Filter.DateParser(filterString).parse();
3412
- handleError(result.logs);
3413
- return { kind, clauses: result.clauses };
3508
+ case 'temporal': {
3509
+ const result = Filter.TemporalFilterExpression.parse(filterString);
3510
+ handleError(result.log);
3511
+ return { kind, parsed: result.parsed };
3414
3512
  }
3415
3513
  case 'other':
3416
3514
  throw new Error('Not implemented');
@@ -3464,7 +3562,7 @@ function getFilterType(fieldInfo) {
3464
3562
  return 'number';
3465
3563
  case 'date_type':
3466
3564
  case 'timestamp_type':
3467
- return 'date';
3565
+ return 'temporal';
3468
3566
  default:
3469
3567
  return 'other';
3470
3568
  }