@malloydata/malloy 0.0.304 → 0.0.305

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 (74) hide show
  1. package/dist/dialect/dialect.d.ts +1 -1
  2. package/dist/dialect/duckdb/duckdb.d.ts +1 -1
  3. package/dist/dialect/duckdb/duckdb.js +2 -6
  4. package/dist/dialect/mysql/mysql.d.ts +1 -1
  5. package/dist/dialect/mysql/mysql.js +2 -6
  6. package/dist/dialect/postgres/postgres.d.ts +1 -1
  7. package/dist/dialect/postgres/postgres.js +2 -6
  8. package/dist/dialect/snowflake/snowflake.d.ts +1 -1
  9. package/dist/dialect/snowflake/snowflake.js +2 -5
  10. package/dist/dialect/standardsql/standardsql.d.ts +1 -1
  11. package/dist/dialect/standardsql/standardsql.js +2 -6
  12. package/dist/dialect/trino/trino.d.ts +1 -1
  13. package/dist/dialect/trino/trino.js +2 -6
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.js +2 -3
  16. package/dist/lang/ast/expressions/expr-aggregate-function.js +12 -2
  17. package/dist/lang/ast/expressions/expr-count.js +3 -1
  18. package/dist/lang/ast/expressions/expr-func.js +34 -10
  19. package/dist/lang/ast/expressions/expr-props.js +1 -1
  20. package/dist/lang/ast/expressions/expr-ungroup.js +7 -3
  21. package/dist/lang/ast/expressions/function-ordering.d.ts +19 -5
  22. package/dist/lang/ast/expressions/function-ordering.js +61 -9
  23. package/dist/lang/ast/field-space/include-utils.js +1 -1
  24. package/dist/lang/ast/field-space/index-field-space.js +3 -1
  25. package/dist/lang/ast/field-space/query-spaces.js +20 -11
  26. package/dist/lang/ast/query-builders/index-builder.js +1 -1
  27. package/dist/lang/ast/query-builders/reduce-builder.js +1 -1
  28. package/dist/lang/ast/query-elements/query-arrow.js +14 -4
  29. package/dist/lang/ast/query-elements/query-base.d.ts +1 -0
  30. package/dist/lang/ast/query-elements/query-base.js +14 -4
  31. package/dist/lang/ast/query-elements/query-refine.js +2 -0
  32. package/dist/lang/ast/query-properties/drill.js +1 -1
  33. package/dist/lang/ast/source-properties/join.js +6 -2
  34. package/dist/lang/ast/statements/define-source.js +1 -1
  35. package/dist/lang/ast/types/expr-value.js +1 -1
  36. package/dist/lang/ast/view-elements/reference-view.js +4 -1
  37. package/dist/lang/ast/view-elements/refine-utils.js +1 -1
  38. package/dist/{model/composite_source_utils.d.ts → lang/composite-source-utils.d.ts} +4 -17
  39. package/dist/{model/composite_source_utils.js → lang/composite-source-utils.js} +274 -44
  40. package/dist/lang/test/parse-expects.d.ts +1 -1
  41. package/dist/lang/test/parse-expects.js +6 -2
  42. package/dist/lang/test/test-translator.js +1 -1
  43. package/dist/malloy.js +1 -1
  44. package/dist/model/expression_compiler.d.ts +27 -0
  45. package/dist/model/expression_compiler.js +780 -0
  46. package/dist/model/field_instance.d.ts +108 -0
  47. package/dist/model/field_instance.js +520 -0
  48. package/dist/model/index.d.ts +5 -1
  49. package/dist/model/index.js +25 -4
  50. package/dist/model/join_instance.d.ts +18 -0
  51. package/dist/model/join_instance.js +71 -0
  52. package/dist/model/malloy_types.d.ts +48 -2
  53. package/dist/model/malloy_types.js +39 -1
  54. package/dist/model/query_model.d.ts +2 -0
  55. package/dist/model/query_model.js +7 -0
  56. package/dist/model/query_model_contract.d.ts +32 -0
  57. package/dist/model/query_model_contract.js +7 -0
  58. package/dist/model/query_model_impl.d.ts +30 -0
  59. package/dist/model/query_model_impl.js +266 -0
  60. package/dist/model/query_node.d.ts +132 -0
  61. package/dist/model/query_node.js +638 -0
  62. package/dist/model/query_query.d.ts +86 -0
  63. package/dist/model/query_query.js +1724 -0
  64. package/dist/model/sql_block.js +2 -2
  65. package/dist/model/stage_writer.d.ts +25 -0
  66. package/dist/model/stage_writer.js +120 -0
  67. package/dist/model/utils.d.ts +18 -1
  68. package/dist/model/utils.js +66 -1
  69. package/dist/to_stable.js +3 -4
  70. package/dist/version.d.ts +1 -1
  71. package/dist/version.js +1 -1
  72. package/package.json +4 -4
  73. package/dist/model/malloy_query.d.ts +0 -391
  74. package/dist/model/malloy_query.js +0 -3926
@@ -64,7 +64,7 @@ const field_references_1 = require("../query-items/field-references");
64
64
  const refined_space_1 = require("./refined-space");
65
65
  const static_space_1 = require("./static-space");
66
66
  const query_input_space_1 = require("./query-input-space");
67
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
67
+ const composite_source_utils_1 = require("../../composite-source-utils");
68
68
  const error_factory_1 = require("../error-factory");
69
69
  const reference_field_1 = require("./reference-field");
70
70
  const refine_from_space_field_1 = require("./refine-from-space-field");
@@ -245,10 +245,18 @@ class QuerySpace extends QueryOperationSpace {
245
245
  return fields.map(f => f.queryFieldDef);
246
246
  }
247
247
  getOutputFieldDef(queryFieldDef, typeDesc) {
248
- var _a, _b;
249
- const name = queryFieldDef.type === 'fieldref'
250
- ? queryFieldDef.path[queryFieldDef.path.length - 1]
251
- : (_a = queryFieldDef.as) !== null && _a !== void 0 ? _a : queryFieldDef.name;
248
+ var _a, _b, _c;
249
+ let location = undefined;
250
+ let name;
251
+ if (queryFieldDef.type === 'fieldref') {
252
+ name = queryFieldDef.path[queryFieldDef.path.length - 1];
253
+ location = queryFieldDef.at;
254
+ }
255
+ else {
256
+ name = (_a = queryFieldDef.as) !== null && _a !== void 0 ? _a : queryFieldDef.name;
257
+ location = queryFieldDef.location;
258
+ }
259
+ let ret;
252
260
  if (typeDesc.type === 'turtle') {
253
261
  const pipeline = typeDesc.pipeline;
254
262
  const lastSegment = pipeline[pipeline.length - 1];
@@ -259,7 +267,7 @@ class QuerySpace extends QueryOperationSpace {
259
267
  : true
260
268
  : true;
261
269
  if (isRepeated) {
262
- return {
270
+ ret = {
263
271
  ...outputStruct,
264
272
  elementTypeDef: { type: 'record_element' },
265
273
  name: name,
@@ -269,7 +277,7 @@ class QuerySpace extends QueryOperationSpace {
269
277
  };
270
278
  }
271
279
  else {
272
- return {
280
+ ret = {
273
281
  ...outputStruct,
274
282
  name: name,
275
283
  type: 'record',
@@ -279,16 +287,17 @@ class QuerySpace extends QueryOperationSpace {
279
287
  }
280
288
  }
281
289
  else if (model.TD.isAtomic(typeDesc)) {
282
- const td = model.mkFieldDef(typeDesc, name);
283
- return {
284
- ...td,
290
+ ret = {
291
+ ...model.mkFieldDef(typeDesc, name),
285
292
  expressionType: 'scalar',
286
- e: undefined,
293
+ location,
287
294
  };
288
295
  }
289
296
  else {
290
297
  throw new Error('Invalid type for fieldref');
291
298
  }
299
+ ret.location = (_c = ret.location) !== null && _c !== void 0 ? _c : this.astEl.location;
300
+ return ret;
292
301
  }
293
302
  // Gets the primary key field for the output struct of this query;
294
303
  // If there is exactly one scalar field, that is the primary key
@@ -30,7 +30,7 @@ const indexing_1 = require("../query-properties/indexing");
30
30
  const limit_1 = require("../query-properties/limit");
31
31
  const sampling_1 = require("../query-properties/sampling");
32
32
  const index_field_space_1 = require("../field-space/index-field-space");
33
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
33
+ const composite_source_utils_1 = require("../../composite-source-utils");
34
34
  class IndexBuilder {
35
35
  constructor(inputFS, refineThis, isNestIn, astEl) {
36
36
  this.filters = [];
@@ -30,7 +30,7 @@ const limit_1 = require("../query-properties/limit");
30
30
  const ordering_1 = require("../query-properties/ordering");
31
31
  const query_spaces_1 = require("../field-space/query-spaces");
32
32
  const definition_list_1 = require("../types/definition-list");
33
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
33
+ const composite_source_utils_1 = require("../../composite-source-utils");
34
34
  function queryFieldName(qf) {
35
35
  if (qf.type === 'fieldref') {
36
36
  return qf.path[qf.path.length - 1];
@@ -27,7 +27,7 @@ const malloy_types_1 = require("../../../model/malloy_types");
27
27
  const source_1 = require("../source-elements/source");
28
28
  const static_space_1 = require("../field-space/static-space");
29
29
  const query_base_1 = require("./query-base");
30
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
30
+ const composite_source_utils_1 = require("../../composite-source-utils");
31
31
  /**
32
32
  * A query operation that adds segments to a LHS source or query.
33
33
  *
@@ -69,14 +69,14 @@ class QueryArrow extends query_base_1.QueryBase {
69
69
  inputStruct = lhsQuery.outputStruct;
70
70
  fieldSpace = new static_space_1.StaticSourceSpace(lhsQuery.outputStruct, 'public');
71
71
  }
72
- const { pipeline, annotation, outputStruct, name } = this.view.pipelineComp(fieldSpace);
72
+ const { pipeline: rhsPipeline, annotation, outputStruct, name, } = this.view.pipelineComp(fieldSpace);
73
73
  const query = {
74
74
  ...queryBase,
75
75
  name,
76
76
  annotation,
77
- pipeline: [...queryBase.pipeline, ...pipeline],
77
+ pipeline: [...queryBase.pipeline, ...rhsPipeline],
78
78
  };
79
- const compositeResolvedSourceDef = (_a = query.compositeResolvedSourceDef) !== null && _a !== void 0 ? _a : this.resolveCompositeSource(inputStruct, pipeline);
79
+ const compositeResolvedSourceDef = (_a = query.compositeResolvedSourceDef) !== null && _a !== void 0 ? _a : this.resolveCompositeSource(inputStruct, rhsPipeline);
80
80
  const segment = query.pipeline[0];
81
81
  if (segment !== undefined) {
82
82
  const unsatisfiedGroupBys = (0, composite_source_utils_1.checkRequiredGroupBys)(compositeResolvedSourceDef !== null && compositeResolvedSourceDef !== void 0 ? compositeResolvedSourceDef : inputStruct, segment);
@@ -86,10 +86,20 @@ class QueryArrow extends query_base_1.QueryBase {
86
86
  });
87
87
  }
88
88
  }
89
+ const pipelineWithExpandedFieldUsage = [
90
+ // The base query (if it exists) will already have its `expandedFieldUsage` computed
91
+ ...queryBase.pipeline,
92
+ ...this.expandFieldUsage(this.source instanceof source_1.Source
93
+ ? // If `source ->` then use the composite resolved struct,
94
+ compositeResolvedSourceDef !== null && compositeResolvedSourceDef !== void 0 ? compositeResolvedSourceDef : inputStruct
95
+ : // Otherwise just use the `inputStruct`
96
+ inputStruct, rhsPipeline),
97
+ ];
89
98
  return {
90
99
  query: {
91
100
  ...query,
92
101
  compositeResolvedSourceDef,
102
+ pipeline: pipelineWithExpandedFieldUsage,
93
103
  },
94
104
  outputStruct,
95
105
  inputStruct,
@@ -3,6 +3,7 @@ import { MalloyElement } from '../types/malloy-element';
3
3
  import type { QueryComp } from '../types/query-comp';
4
4
  export declare abstract class QueryBase extends MalloyElement {
5
5
  abstract queryComp(isRefOk: boolean): QueryComp;
6
+ protected expandFieldUsage(inputSource: SourceDef, pipeline: PipeSegment[]): PipeSegment[];
6
7
  protected resolveCompositeSource(inputSource: SourceDef, pipeline: PipeSegment[]): SourceDef | undefined;
7
8
  query(): Query;
8
9
  }
@@ -23,13 +23,24 @@
23
23
  */
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.QueryBase = void 0;
26
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
26
+ const composite_source_utils_1 = require("../../composite-source-utils");
27
27
  const malloy_types_1 = require("../../../model/malloy_types");
28
+ const error_factory_1 = require("../error-factory");
28
29
  const query_utils_1 = require("../query-utils");
29
30
  const malloy_element_1 = require("../types/malloy-element");
30
31
  class QueryBase extends malloy_element_1.MalloyElement {
32
+ expandFieldUsage(inputSource, pipeline) {
33
+ const ret = [];
34
+ let stageInput = inputSource;
35
+ for (const segment of pipeline) {
36
+ const newSegment = (0, composite_source_utils_1.getExpandedSegment)(segment, stageInput);
37
+ ret.push(newSegment);
38
+ // Get the output struct for the next stage
39
+ stageInput = newSegment.outputStruct || error_factory_1.ErrorFactory.structDef;
40
+ }
41
+ return ret;
42
+ }
31
43
  resolveCompositeSource(inputSource, pipeline) {
32
- var _a;
33
44
  const stage1 = pipeline[0];
34
45
  if (stage1 === undefined)
35
46
  return undefined;
@@ -38,8 +49,7 @@ class QueryBase extends malloy_element_1.MalloyElement {
38
49
  // which hides the fact that this code doesn't handle sources in `extend:`.
39
50
  if (((0, malloy_types_1.isQuerySegment)(stage1) || (0, malloy_types_1.isIndexSegment)(stage1)) &&
40
51
  (0, composite_source_utils_1.hasCompositesAnywhere)(inputSource)) {
41
- const fieldUsage = (_a = stage1.fieldUsage) !== null && _a !== void 0 ? _a : (0, composite_source_utils_1.emptyFieldUsage)();
42
- const resolved = (0, composite_source_utils_1.resolveCompositeSources)(inputSource, stage1, fieldUsage);
52
+ const resolved = (0, composite_source_utils_1.resolveCompositeSources)(inputSource, stage1);
43
53
  if (resolved.error) {
44
54
  (0, composite_source_utils_1.logCompositeError)(resolved.error, this);
45
55
  }
@@ -46,10 +46,12 @@ class QueryRefine extends query_base_1.QueryBase {
46
46
  pipeline,
47
47
  };
48
48
  const compositeResolvedSourceDef = this.resolveCompositeSource(q.inputStruct, pipeline);
49
+ const pipelineWithExpandedFieldUsage = this.expandFieldUsage(compositeResolvedSourceDef !== null && compositeResolvedSourceDef !== void 0 ? compositeResolvedSourceDef : q.inputStruct, pipeline);
49
50
  return {
50
51
  query: {
51
52
  ...query,
52
53
  compositeResolvedSourceDef,
54
+ pipeline: pipelineWithExpandedFieldUsage,
53
55
  },
54
56
  // TODO bleh
55
57
  outputStruct: pipeline[pipeline.length - 1].outputStruct,
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.Drill = exports.DrillField = void 0;
10
10
  exports.updateNestedDrillPaths = updateNestedDrillPaths;
11
11
  exports.attachDrillPaths = attachDrillPaths;
12
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
12
+ const composite_source_utils_1 = require("../../composite-source-utils");
13
13
  const malloy_types_1 = require("../../../model/malloy_types");
14
14
  const utils_1 = require("../../utils");
15
15
  const expr_compare_1 = require("../expressions/expr-compare");
@@ -30,6 +30,7 @@ const malloy_element_1 = require("../types/malloy-element");
30
30
  const noteable_1 = require("../types/noteable");
31
31
  const error_factory_1 = require("../error-factory");
32
32
  const query_property_interface_1 = require("../types/query-property-interface");
33
+ const composite_source_utils_1 = require("../../composite-source-utils");
33
34
  class Join extends malloy_element_1.MalloyElement {
34
35
  constructor() {
35
36
  super(...arguments);
@@ -87,19 +88,22 @@ class KeyJoin extends Join {
87
88
  const pkey = inStruct.fields.find(f => (f.as || f.name) === inStruct.primaryKey);
88
89
  if (pkey) {
89
90
  if (pkey.type === exprX.type) {
91
+ const keyPath = [this.name.refString, inStruct.primaryKey];
90
92
  inStruct.join = 'one';
91
93
  inStruct.onExpression = {
92
94
  node: '=',
93
95
  kids: {
94
96
  left: {
95
97
  node: 'field',
96
- path: [this.name.refString, inStruct.primaryKey],
98
+ path: keyPath,
97
99
  at: this.keyExpr.location,
98
100
  },
99
101
  right: exprX.value,
100
102
  },
101
103
  };
102
- inStruct.fieldUsage = exprX.fieldUsage;
104
+ inStruct.fieldUsage = (0, composite_source_utils_1.mergeFieldUsage)(exprX.fieldUsage, [
105
+ { path: keyPath },
106
+ ]);
103
107
  return;
104
108
  }
105
109
  else {
@@ -26,7 +26,7 @@ exports.DefineSourceList = exports.DefineSource = void 0;
26
26
  const error_factory_1 = require("../error-factory");
27
27
  const malloy_element_1 = require("../types/malloy-element");
28
28
  const noteable_1 = require("../types/noteable");
29
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
29
+ const composite_source_utils_1 = require("../../composite-source-utils");
30
30
  class DefineSource extends malloy_element_1.MalloyElement {
31
31
  constructor(name, sourceExpr, exported, parameters) {
32
32
  super();
@@ -30,7 +30,7 @@ exports.literalTimeResult = literalTimeResult;
30
30
  exports.mergeGroupedBys = mergeGroupedBys;
31
31
  exports.mergeUngroupings = mergeUngroupings;
32
32
  const model_1 = require("../../../model");
33
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
33
+ const composite_source_utils_1 = require("../../composite-source-utils");
34
34
  function computedExprValue({ value, dataType, from, }) {
35
35
  return {
36
36
  ...dataType,
@@ -23,6 +23,7 @@
23
23
  */
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.ReferenceView = void 0;
26
+ const composite_source_utils_1 = require("../../composite-source-utils");
26
27
  const malloy_types_1 = require("../../../model/malloy_types");
27
28
  const error_factory_1 = require("../error-factory");
28
29
  const drill_1 = require("../query-properties/drill");
@@ -82,7 +83,9 @@ class ReferenceView extends view_1.View {
82
83
  const newSegment = {
83
84
  type: 'reduce',
84
85
  queryFields: [this.reference.refToField],
85
- fieldUsage: fieldDef.fieldUsage,
86
+ fieldUsage: (0, composite_source_utils_1.mergeFieldUsage)(fieldDef.fieldUsage, [
87
+ { path: this.reference.refToField.path, at: this.reference.location },
88
+ ]),
86
89
  outputStruct,
87
90
  // An atomic lens results in a array segment if it is a scalar
88
91
  isRepeated: (0, malloy_types_1.expressionIsScalar)(fieldDef.expressionType),
@@ -24,7 +24,7 @@
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.refine = refine;
26
26
  const model_1 = require("../../../model");
27
- const composite_source_utils_1 = require("../../../model/composite_source_utils");
27
+ const composite_source_utils_1 = require("../../composite-source-utils");
28
28
  const field_utils_1 = require("../../field-utils");
29
29
  function refine(logTo, refineTo, refineFrom) {
30
30
  var _a, _b;
@@ -1,6 +1,5 @@
1
- import type { BooleanFilter, NumberFilter, StringFilter, TemporalFilter } from '@malloydata/malloy-filter';
2
- import type { MalloyElement } from '../lang/ast';
3
- import type { FieldUsage, PipeSegment, SourceDef, Expr, RequiredGroupBy, Annotation, PartitionCompositeDesc, StructDef } from './malloy_types';
1
+ import type { MalloyElement } from './ast';
2
+ import type { FieldUsage, PipeSegment, SourceDef, RequiredGroupBy, Annotation, PartitionCompositeDesc, StructDef } from '../model/malloy_types';
4
3
  type CompositeCouldNotFindFieldError = {
5
4
  code: 'could_not_find_field';
6
5
  data: {
@@ -51,6 +50,7 @@ interface CompositeFailure {
51
50
  source: SourceDef;
52
51
  issues: CompositeIssue[];
53
52
  }
53
+ export declare function getExpandedSegment(segment: PipeSegment, inputSource: SourceDef): PipeSegment;
54
54
  export declare function getPartitionCompositeDesc(annotation: Annotation | undefined, structDef: StructDef, logTo: MalloyElement): PartitionCompositeDesc | undefined;
55
55
  type SingleNarrowedCompositeFieldResolution = {
56
56
  source: SourceDef;
@@ -63,7 +63,7 @@ export interface NarrowedCompositeFieldResolution {
63
63
  source: SingleNarrowedCompositeFieldResolution | undefined;
64
64
  joined: NarrowedCompositeFieldResolutionByJoinName;
65
65
  }
66
- export declare function resolveCompositeSources(source: SourceDef, segment: PipeSegment, fieldUsage: FieldUsage[]): {
66
+ export declare function resolveCompositeSources(source: SourceDef, segment: PipeSegment): {
67
67
  sourceDef: SourceDef | undefined;
68
68
  error: undefined;
69
69
  } | {
@@ -87,17 +87,4 @@ export declare function pathEq(a: string[], b: string[]): boolean;
87
87
  export declare function pathBegins(path: string[], prefix: string[]): boolean;
88
88
  export declare function hasCompositesAnywhere(source: SourceDef): boolean;
89
89
  export declare function logCompositeError(error: CompositeError, logTo: MalloyElement): void;
90
- export declare function compileFilterExpression(ft: string, fexpr: Expr): {
91
- kind: 'date' | 'timestamp';
92
- parsed: TemporalFilter;
93
- } | {
94
- kind: 'string';
95
- parsed: StringFilter;
96
- } | {
97
- kind: 'boolean';
98
- parsed: BooleanFilter;
99
- } | {
100
- kind: 'number';
101
- parsed: NumberFilter;
102
- } | undefined;
103
90
  export {};