@malloydata/malloy 0.0.217-dev241118224156 → 0.0.217
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.
|
@@ -94,7 +94,7 @@ class ExprAggregateFunction extends expression_def_1.ExpressionDef {
|
|
|
94
94
|
evalSpace: footType.evalSpace,
|
|
95
95
|
compositeFieldUsage: footType.compositeFieldUsage,
|
|
96
96
|
};
|
|
97
|
-
structPath = this.source.path;
|
|
97
|
+
structPath = this.source.path.slice(0, -1);
|
|
98
98
|
// Here we handle a special case where you write `foo.agg()` and `foo` is a
|
|
99
99
|
// dimension which uses only one distinct join path; in this case, we set the
|
|
100
100
|
// locality to be that join path
|
|
@@ -29,13 +29,14 @@ const query_utils_1 = require("../query-utils");
|
|
|
29
29
|
const malloy_element_1 = require("../types/malloy-element");
|
|
30
30
|
class QueryBase extends malloy_element_1.MalloyElement {
|
|
31
31
|
query() {
|
|
32
|
+
var _a;
|
|
32
33
|
const { inputStruct, query } = this.queryComp(true);
|
|
33
34
|
// TODO add an error if a raw/index query is done against a composite source
|
|
34
35
|
let compositeResolvedSourceDef = undefined;
|
|
35
36
|
if (query.pipeline[0] && (0, malloy_types_1.isQuerySegment)(query.pipeline[0])) {
|
|
36
|
-
const compositeFieldUsage = query.pipeline[0].compositeFieldUsage;
|
|
37
|
-
if (compositeFieldUsage
|
|
38
|
-
|
|
37
|
+
const compositeFieldUsage = (_a = query.pipeline[0].compositeFieldUsage) !== null && _a !== void 0 ? _a : (0, composite_source_utils_1.emptyCompositeFieldUsage)();
|
|
38
|
+
if (!(0, composite_source_utils_1.isEmptyCompositeFieldUsage)(compositeFieldUsage) ||
|
|
39
|
+
inputStruct.type === 'composite') {
|
|
39
40
|
const resolved = (0, composite_source_utils_1.resolveCompositeSources)(inputStruct, compositeFieldUsage);
|
|
40
41
|
compositeResolvedSourceDef = resolved.sourceDef;
|
|
41
42
|
}
|
|
@@ -42,6 +42,7 @@ describe('composite sources', () => {
|
|
|
42
42
|
##! experimental.composite_sources
|
|
43
43
|
source: x is compose(ab, ab) extend {
|
|
44
44
|
dimension: aif is ai + af
|
|
45
|
+
measure: ss is ai.sum()
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
source: y is compose(ab, ab) extend {
|
|
@@ -74,6 +75,10 @@ describe('composite sources', () => {
|
|
|
74
75
|
['x', 'af'],
|
|
75
76
|
]));
|
|
76
77
|
});
|
|
78
|
+
test('measure defined in composite source', () => {
|
|
79
|
+
const mexpr = (0, test_translator_1.makeExprFunc)(m.translator.modelDef, 'x');
|
|
80
|
+
expect(mexpr `ss`).hasCompositeUsage(paths([['ai']]));
|
|
81
|
+
});
|
|
77
82
|
});
|
|
78
83
|
describe('composite source resolution and validation', () => {
|
|
79
84
|
test('compose fails on group_by that is relevant', () => {
|
|
@@ -10,9 +10,10 @@ exports.compositeFieldUsageJoinPaths = exports.joinedCompositeFieldUsage = expor
|
|
|
10
10
|
const utils_1 = require("../lang/utils");
|
|
11
11
|
const malloy_types_1 = require("./malloy_types");
|
|
12
12
|
function _resolveCompositeSources(path, source, compositeFieldUsage, narrowedCompositeFieldResolution = undefined) {
|
|
13
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
14
14
|
let base = { ...source };
|
|
15
15
|
let narrowedSources = undefined;
|
|
16
|
+
const nonCompositeFields = getNonCompositeFields(source);
|
|
16
17
|
if (compositeFieldUsage.fields.length > 0) {
|
|
17
18
|
if (source.type === 'composite') {
|
|
18
19
|
let found = false;
|
|
@@ -36,7 +37,6 @@ function _resolveCompositeSources(path, source, compositeFieldUsage, narrowedCom
|
|
|
36
37
|
continue overSources;
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
const nonCompositeFields = getNonCompositeFields(source);
|
|
40
40
|
if (inputSource.type === 'composite') {
|
|
41
41
|
const resolveInner = _resolveCompositeSources(path, inputSource, compositeFieldUsageWithoutNonCompositeFields(compositeFieldUsage, inputSource),
|
|
42
42
|
// This looks wonky, but what we're doing is taking the nested sources
|
|
@@ -86,10 +86,18 @@ function _resolveCompositeSources(path, source, compositeFieldUsage, narrowedCom
|
|
|
86
86
|
return { error: { code: 'not_a_composite_source', data: { path } } };
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
+
else if (source.type === 'composite') {
|
|
90
|
+
const first = source.sources[0];
|
|
91
|
+
base = {
|
|
92
|
+
...first,
|
|
93
|
+
fields: [...nonCompositeFields, ...base.fields],
|
|
94
|
+
filterList: [...((_e = source.filterList) !== null && _e !== void 0 ? _e : []), ...((_f = first.filterList) !== null && _f !== void 0 ? _f : [])],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
89
97
|
const fieldsByName = {};
|
|
90
|
-
const narrowedJoinedSources = (
|
|
98
|
+
const narrowedJoinedSources = (_g = narrowedCompositeFieldResolution === null || narrowedCompositeFieldResolution === void 0 ? void 0 : narrowedCompositeFieldResolution.joined) !== null && _g !== void 0 ? _g : {};
|
|
91
99
|
for (const field of base.fields) {
|
|
92
|
-
fieldsByName[(
|
|
100
|
+
fieldsByName[(_h = field.as) !== null && _h !== void 0 ? _h : field.name] = field;
|
|
93
101
|
}
|
|
94
102
|
for (const [joinName, joinedUsage] of Object.entries(compositeFieldUsage.joinedUsage)) {
|
|
95
103
|
const join = fieldsByName[joinName];
|
|
@@ -119,7 +127,7 @@ function _resolveCompositeSources(path, source, compositeFieldUsage, narrowedCom
|
|
|
119
127
|
fieldsByName[joinName] = {
|
|
120
128
|
...resolved.success,
|
|
121
129
|
join: join.join,
|
|
122
|
-
as: (
|
|
130
|
+
as: (_j = join.as) !== null && _j !== void 0 ? _j : join.name,
|
|
123
131
|
onExpression: join.onExpression,
|
|
124
132
|
};
|
|
125
133
|
narrowedJoinedSources[joinName] = resolved.narrowedCompositeFieldResolution;
|