@finos/legend-query-builder 4.19.12 → 4.19.13
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/lib/__lib__/QueryBuilderDocumentation.d.ts +2 -1
- package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
- package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
- package/lib/__lib__/QueryBuilderEvent.d.ts +45 -1
- package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderEvent.js +48 -0
- package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
- package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts +162 -8
- package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderTelemetryHelper.js +48 -0
- package/lib/__lib__/QueryBuilderTelemetryHelper.js.map +1 -1
- package/lib/components/QueryBuilder.d.ts.map +1 -1
- package/lib/components/QueryBuilder.js +9 -5
- package/lib/components/QueryBuilder.js.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.js +18 -1
- package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderParametersPanel.js +18 -1
- package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
- package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
- package/lib/components/QueryBuilderSideBar.js +19 -0
- package/lib/components/QueryBuilderSideBar.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +42 -1
- package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +25 -5
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +55 -0
- package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +95 -8
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +37 -4
- package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
- package/lib/components/filter/QueryBuilderFilterPanel.js +24 -5
- package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
- package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts +61 -0
- package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts.map +1 -0
- package/lib/components/result/QueryBuilderDataProductErrorPanel.js +176 -0
- package/lib/components/result/QueryBuilderDataProductErrorPanel.js.map +1 -0
- package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/result/QueryBuilderResultPanel.js +24 -18
- package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
- package/lib/data-access-overview.css +1 -1
- package/lib/index.css +2 -2
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderResultState.d.ts +11 -1
- package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderResultState.js +79 -15
- package/lib/stores/QueryBuilderResultState.js.map +1 -1
- package/lib/stores/QueryBuilderState.d.ts +131 -9
- package/lib/stores/QueryBuilderState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderState.js +124 -21
- package/lib/stores/QueryBuilderState.js.map +1 -1
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +13 -0
- package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.d.ts +33 -5
- package/lib/stores/QueryLoaderState.d.ts.map +1 -1
- package/lib/stores/QueryLoaderState.js +10 -1
- package/lib/stores/QueryLoaderState.js.map +1 -1
- package/lib/stores/data-access/DataProductAccessInfo.d.ts +37 -0
- package/lib/stores/data-access/DataProductAccessInfo.d.ts.map +1 -0
- package/lib/stores/data-access/DataProductAccessInfo.js +17 -0
- package/lib/stores/data-access/DataProductAccessInfo.js.map +1 -0
- package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js +1 -1
- package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js.map +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js +1 -1
- package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningHelper.d.ts.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js +34 -9
- package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts +5 -0
- package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts.map +1 -1
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js +13 -0
- package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts +2 -0
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts.map +1 -1
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +50 -1
- package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
- package/package.json +10 -10
- package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
- package/src/__lib__/QueryBuilderEvent.ts +52 -0
- package/src/__lib__/QueryBuilderTelemetryHelper.ts +292 -8
- package/src/components/QueryBuilder.tsx +31 -23
- package/src/components/QueryBuilderConstantExpressionPanel.tsx +24 -2
- package/src/components/QueryBuilderParametersPanel.tsx +25 -2
- package/src/components/QueryBuilderSideBar.tsx +28 -0
- package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +56 -1
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +31 -4
- package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +74 -0
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +123 -8
- package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +49 -4
- package/src/components/filter/QueryBuilderFilterPanel.tsx +31 -4
- package/src/components/result/QueryBuilderDataProductErrorPanel.tsx +441 -0
- package/src/components/result/QueryBuilderResultPanel.tsx +49 -32
- package/src/index.ts +1 -0
- package/src/stores/QueryBuilderResultState.ts +107 -19
- package/src/stores/QueryBuilderState.ts +239 -29
- package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +20 -0
- package/src/stores/QueryLoaderState.ts +47 -6
- package/src/stores/data-access/DataProductAccessInfo.ts +37 -0
- package/src/stores/data-cube/QueryBuilderDataCubeEngine.ts +1 -1
- package/src/stores/explorer/QueryBuilderExplorerState.ts +1 -1
- package/src/stores/milestoning/QueryBuilderMilestoningHelper.ts +63 -8
- package/src/stores/milestoning/QueryBuilderMilestoningState.ts +20 -0
- package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +68 -0
- package/tsconfig.json +2 -0
|
@@ -15,29 +15,205 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import type { GraphManagerOperationReport } from '@finos/legend-graph';
|
|
18
|
+
import type { TelemetryErrorFields, TimingsRecord } from '@finos/legend-shared';
|
|
18
19
|
import type { TelemetryService } from '@finos/legend-application';
|
|
19
20
|
import {
|
|
20
21
|
QUERY_BUILDER_EVENT,
|
|
21
22
|
QUERY_BUILDER_FILTER_EVENT,
|
|
22
23
|
QUERY_BUILDER_POST_FILTER_EVENT,
|
|
24
|
+
type QUERY_BUILDER_OPENED_FROM,
|
|
23
25
|
} from './QueryBuilderEvent.js';
|
|
24
|
-
import type {
|
|
26
|
+
import type {
|
|
27
|
+
QueryBuilderQueryInfo,
|
|
28
|
+
QueryBuilderTelemetryContext,
|
|
29
|
+
} from '../stores/QueryBuilderState.js';
|
|
25
30
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Every payload below extends {@link QueryBuilderTelemetryContext}, which
|
|
33
|
+
* carries two deliberately separate halves:
|
|
34
|
+
*
|
|
35
|
+
* - the entry point the query builder was *opened with* (`sourceInfo` — the
|
|
36
|
+
* route: GAV, data space, data product, service, …), spread FLAT at the top
|
|
37
|
+
* level;
|
|
38
|
+
* - the execution context it *resolved to* (class / mapping / runtime), nested
|
|
39
|
+
* under `state`.
|
|
40
|
+
*
|
|
41
|
+
* Keeping them apart is what lets a dashboard distinguish "arrived on mapping
|
|
42
|
+
* X" from "currently querying mapping X" — for a mapping-sourced query both are
|
|
43
|
+
* populated and a divergence means the user switched, while for a data space or
|
|
44
|
+
* data product query only `state` carries a mapping, because the entry point
|
|
45
|
+
* resolves to one.
|
|
46
|
+
*/
|
|
47
|
+
type QueryExecution_TelemetryData = QueryBuilderTelemetryContext &
|
|
31
48
|
GraphManagerOperationReport & {
|
|
32
49
|
dependenciesCount: number;
|
|
33
|
-
|
|
50
|
+
queryInfo?: QueryBuilderQueryInfo | undefined;
|
|
51
|
+
executionDurationMs?: number | undefined;
|
|
34
52
|
};
|
|
35
53
|
|
|
54
|
+
/**
|
|
55
|
+
* Payload for query execution / plan / export failure events. Mirrors the shape
|
|
56
|
+
* of `LegendQueryTelemetryHelper` creator-failure payloads (`errorName`,
|
|
57
|
+
* `errorMessage`, `httpStatus`) so success/failure pairs can be joined on the
|
|
58
|
+
* same set of dimensions.
|
|
59
|
+
*/
|
|
60
|
+
export type QueryExecutionFailure_TelemetryData = QueryBuilderTelemetryContext &
|
|
61
|
+
TelemetryErrorFields & {
|
|
62
|
+
/**
|
|
63
|
+
* Backend trace ID for the failed execution, when the error carries one.
|
|
64
|
+
*/
|
|
65
|
+
executionTraceId?: string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Phase timings collected up to the point of failure. Which laps are
|
|
68
|
+
* *missing* is the useful signal: no
|
|
69
|
+
* `graph-manager.v1.engine-operation.server-call.success` means the query
|
|
70
|
+
* never reached the engine, so the failure is pre-flight rather than
|
|
71
|
+
* in-flight.
|
|
72
|
+
*/
|
|
73
|
+
timings?: TimingsRecord | undefined;
|
|
74
|
+
queryInfo?: QueryBuilderQueryInfo | undefined;
|
|
75
|
+
executionDurationMs?: number | undefined;
|
|
76
|
+
} & Record<string, unknown>;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Payload for {@link QUERY_BUILDER_EVENT.OPENED}.
|
|
80
|
+
*
|
|
81
|
+
* `openedFrom` is carried here and nowhere else. Which application emitted an
|
|
82
|
+
* event is already stamped on every payload by `TelemetryServicePlugin.setup()`
|
|
83
|
+
* (`appName`), and `appSessionId` is the join key back to this event — so
|
|
84
|
+
* repeating the surface on high-frequency events like `run-query.*` would
|
|
85
|
+
* duplicate data that is already reachable.
|
|
86
|
+
*/
|
|
87
|
+
export type QueryBuilderOpened_TelemetryData = QueryBuilderTelemetryContext & {
|
|
88
|
+
openedFrom: QUERY_BUILDER_OPENED_FROM;
|
|
89
|
+
} & Record<string, unknown>;
|
|
90
|
+
|
|
91
|
+
type QueryMappingModelCoverageAnalysis_TelemetryData =
|
|
92
|
+
QueryBuilderTelemetryContext &
|
|
93
|
+
GraphManagerOperationReport & {
|
|
94
|
+
dependenciesCount: number;
|
|
95
|
+
};
|
|
96
|
+
|
|
36
97
|
type GraphFetchPanel_TelemtryData = {
|
|
37
98
|
serializationType: string | undefined;
|
|
38
99
|
};
|
|
39
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Payloads for the authoring-side `*.change` events.
|
|
103
|
+
*
|
|
104
|
+
* Each nests what the user actually did under a `change` key, leaving the top
|
|
105
|
+
* level to the shared {@link QueryBuilderTelemetryContext} envelope. Beyond
|
|
106
|
+
* consistency this avoids a real collision: `change.sourceType` on a projection
|
|
107
|
+
* event ("explorer-property") means something entirely different from the
|
|
108
|
+
* top-level `sourceType` carried by `sourceInfo` ("data-product").
|
|
109
|
+
*/
|
|
110
|
+
type ExecutionContextChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
111
|
+
change: {
|
|
112
|
+
subtype: 'class' | 'mapping' | 'runtime';
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
type ProjectionChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
117
|
+
change: {
|
|
118
|
+
action: 'add' | 'remove' | 'move' | 'clear' | 'add-derivation';
|
|
119
|
+
sourceType?:
|
|
120
|
+
| 'explorer-property'
|
|
121
|
+
| 'explorer-relation'
|
|
122
|
+
| 'function'
|
|
123
|
+
| 'filter-condition'
|
|
124
|
+
| 'derivation';
|
|
125
|
+
/**
|
|
126
|
+
* The resulting column count — except for `clear`, where it is the number
|
|
127
|
+
* of columns that were removed.
|
|
128
|
+
*/
|
|
129
|
+
columnCount: number;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
type ResultModifierChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
134
|
+
change: {
|
|
135
|
+
limitSet: boolean;
|
|
136
|
+
distinctOn: boolean;
|
|
137
|
+
sortColumnCount: number;
|
|
138
|
+
sliceSet: boolean;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
type AggregationChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
143
|
+
change: {
|
|
144
|
+
action: 'operator-change';
|
|
145
|
+
operatorName?: string | undefined;
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
type WindowChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
150
|
+
/**
|
|
151
|
+
* DnD reordering of window columns is intentionally not reported — it would
|
|
152
|
+
* emit on every hover-driven reorder, so there is no `move` action here.
|
|
153
|
+
*/
|
|
154
|
+
change: {
|
|
155
|
+
action: 'add' | 'edit' | 'remove';
|
|
156
|
+
columnCount: number;
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
type GraphFetchChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
161
|
+
change: {
|
|
162
|
+
action: 'add' | 'remove' | 'check-toggle' | 'serialization-change';
|
|
163
|
+
nodeCount: number;
|
|
164
|
+
serializationType?: string | undefined;
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
type ParameterChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
169
|
+
change: {
|
|
170
|
+
action: 'add' | 'edit' | 'remove';
|
|
171
|
+
parameterCount: number;
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
type ConstantChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
176
|
+
change: {
|
|
177
|
+
action: 'add' | 'edit' | 'remove';
|
|
178
|
+
constantCount: number;
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
type WatermarkChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
183
|
+
change: {
|
|
184
|
+
enabled: boolean;
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
type MilestoningChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
189
|
+
change: {
|
|
190
|
+
subtype:
|
|
191
|
+
| 'business-date'
|
|
192
|
+
| 'processing-date'
|
|
193
|
+
| 'all-versions'
|
|
194
|
+
| 'all-versions-in-range';
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Shared by the filter and post-filter trees. DnD reparenting/reordering of
|
|
200
|
+
* condition nodes is intentionally not reported, so there is no `move` action.
|
|
201
|
+
*/
|
|
202
|
+
type FilterChange_TelemetryData = QueryBuilderTelemetryContext & {
|
|
203
|
+
change: {
|
|
204
|
+
action: 'remove' | 'group-operation-change';
|
|
205
|
+
groupOperation?: 'and' | 'or' | undefined;
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
|
|
40
209
|
export class QueryBuilderTelemetryHelper {
|
|
210
|
+
static logEvent_QueryBuilderOpened(
|
|
211
|
+
service: TelemetryService,
|
|
212
|
+
data: QueryBuilderOpened_TelemetryData,
|
|
213
|
+
): void {
|
|
214
|
+
service.logEvent(QUERY_BUILDER_EVENT.OPENED, data);
|
|
215
|
+
}
|
|
216
|
+
|
|
41
217
|
static logEvent_QueryRunLaunched(
|
|
42
218
|
service: TelemetryService,
|
|
43
219
|
data?: Record<string, unknown> | undefined,
|
|
@@ -72,7 +248,7 @@ export class QueryBuilderTelemetryHelper {
|
|
|
72
248
|
|
|
73
249
|
static logEvent_QueryRunFailed(
|
|
74
250
|
service: TelemetryService,
|
|
75
|
-
data:
|
|
251
|
+
data: QueryExecutionFailure_TelemetryData,
|
|
76
252
|
): void {
|
|
77
253
|
service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__FAILURE, data);
|
|
78
254
|
}
|
|
@@ -91,6 +267,13 @@ export class QueryBuilderTelemetryHelper {
|
|
|
91
267
|
service.logEvent(QUERY_BUILDER_EVENT.EXPORT_QUERY_DATA__SUCCESS, data);
|
|
92
268
|
}
|
|
93
269
|
|
|
270
|
+
static logEvent_ExportQueryDataFailed(
|
|
271
|
+
service: TelemetryService,
|
|
272
|
+
data: QueryExecutionFailure_TelemetryData,
|
|
273
|
+
): void {
|
|
274
|
+
service.logEvent(QUERY_BUILDER_EVENT.EXPORT_QUERY_DATA__FAILURE, data);
|
|
275
|
+
}
|
|
276
|
+
|
|
94
277
|
static logEvent_ExecutionPlanGenerationSucceeded(
|
|
95
278
|
service: TelemetryService,
|
|
96
279
|
data: QueryExecution_TelemetryData,
|
|
@@ -101,6 +284,16 @@ export class QueryBuilderTelemetryHelper {
|
|
|
101
284
|
);
|
|
102
285
|
}
|
|
103
286
|
|
|
287
|
+
static logEvent_ExecutionPlanGenerationFailed(
|
|
288
|
+
service: TelemetryService,
|
|
289
|
+
data: QueryExecutionFailure_TelemetryData,
|
|
290
|
+
): void {
|
|
291
|
+
service.logEvent(
|
|
292
|
+
QUERY_BUILDER_EVENT.GENERATE_EXECUTION_PLAN__FAILURE,
|
|
293
|
+
data,
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
104
297
|
static logEvent_ExecutionPlanDebugSucceeded(
|
|
105
298
|
service: TelemetryService,
|
|
106
299
|
data: QueryExecution_TelemetryData,
|
|
@@ -108,6 +301,13 @@ export class QueryBuilderTelemetryHelper {
|
|
|
108
301
|
service.logEvent(QUERY_BUILDER_EVENT.DEBUG_EXECUTION_PLAN__SUCCESS, data);
|
|
109
302
|
}
|
|
110
303
|
|
|
304
|
+
static logEvent_ExecutionPlanDebugFailed(
|
|
305
|
+
service: TelemetryService,
|
|
306
|
+
data: QueryExecutionFailure_TelemetryData,
|
|
307
|
+
): void {
|
|
308
|
+
service.logEvent(QUERY_BUILDER_EVENT.DEBUG_EXECUTION_PLAN__FAILURE, data);
|
|
309
|
+
}
|
|
310
|
+
|
|
111
311
|
static logEvent_EmbeddedDataCubeQueryRunSucceeded(
|
|
112
312
|
service: TelemetryService,
|
|
113
313
|
data: QueryExecution_TelemetryData,
|
|
@@ -289,4 +489,88 @@ export class QueryBuilderTelemetryHelper {
|
|
|
289
489
|
): void {
|
|
290
490
|
service.logEvent(QUERY_BUILDER_EVENT.PANEL_GRAPH_FETCH_RENDER, data);
|
|
291
491
|
}
|
|
492
|
+
|
|
493
|
+
static logEvent_ExecutionContextChanged(
|
|
494
|
+
service: TelemetryService,
|
|
495
|
+
data: ExecutionContextChange_TelemetryData,
|
|
496
|
+
): void {
|
|
497
|
+
service.logEvent(QUERY_BUILDER_EVENT.EXECUTION_CONTEXT__CHANGE, data);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
static logEvent_ProjectionChanged(
|
|
501
|
+
service: TelemetryService,
|
|
502
|
+
data: ProjectionChange_TelemetryData,
|
|
503
|
+
): void {
|
|
504
|
+
service.logEvent(QUERY_BUILDER_EVENT.PROJECTION__CHANGE, data);
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
static logEvent_ResultModifierChanged(
|
|
508
|
+
service: TelemetryService,
|
|
509
|
+
data: ResultModifierChange_TelemetryData,
|
|
510
|
+
): void {
|
|
511
|
+
service.logEvent(QUERY_BUILDER_EVENT.RESULT_MODIFIER__CHANGE, data);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
static logEvent_AggregationChanged(
|
|
515
|
+
service: TelemetryService,
|
|
516
|
+
data: AggregationChange_TelemetryData,
|
|
517
|
+
): void {
|
|
518
|
+
service.logEvent(QUERY_BUILDER_EVENT.AGGREGATION__CHANGE, data);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
static logEvent_WindowChanged(
|
|
522
|
+
service: TelemetryService,
|
|
523
|
+
data: WindowChange_TelemetryData,
|
|
524
|
+
): void {
|
|
525
|
+
service.logEvent(QUERY_BUILDER_EVENT.WINDOW__CHANGE, data);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
static logEvent_GraphFetchChanged(
|
|
529
|
+
service: TelemetryService,
|
|
530
|
+
data: GraphFetchChange_TelemetryData,
|
|
531
|
+
): void {
|
|
532
|
+
service.logEvent(QUERY_BUILDER_EVENT.GRAPH_FETCH__CHANGE, data);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
static logEvent_ParameterChanged(
|
|
536
|
+
service: TelemetryService,
|
|
537
|
+
data: ParameterChange_TelemetryData,
|
|
538
|
+
): void {
|
|
539
|
+
service.logEvent(QUERY_BUILDER_EVENT.PARAMETER__CHANGE, data);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
static logEvent_ConstantChanged(
|
|
543
|
+
service: TelemetryService,
|
|
544
|
+
data: ConstantChange_TelemetryData,
|
|
545
|
+
): void {
|
|
546
|
+
service.logEvent(QUERY_BUILDER_EVENT.CONSTANT__CHANGE, data);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
static logEvent_WatermarkChanged(
|
|
550
|
+
service: TelemetryService,
|
|
551
|
+
data: WatermarkChange_TelemetryData,
|
|
552
|
+
): void {
|
|
553
|
+
service.logEvent(QUERY_BUILDER_EVENT.WATERMARK__CHANGE, data);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
static logEvent_MilestoningChanged(
|
|
557
|
+
service: TelemetryService,
|
|
558
|
+
data: MilestoningChange_TelemetryData,
|
|
559
|
+
): void {
|
|
560
|
+
service.logEvent(QUERY_BUILDER_EVENT.MILESTONING__CHANGE, data);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
static logEvent_FilterChanged(
|
|
564
|
+
service: TelemetryService,
|
|
565
|
+
data: FilterChange_TelemetryData,
|
|
566
|
+
): void {
|
|
567
|
+
service.logEvent(QUERY_BUILDER_EVENT.FILTER__CHANGE, data);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
static logEvent_PostFilterChanged(
|
|
571
|
+
service: TelemetryService,
|
|
572
|
+
data: FilterChange_TelemetryData,
|
|
573
|
+
): void {
|
|
574
|
+
service.logEvent(QUERY_BUILDER_EVENT.POST_FILTER__CHANGE, data);
|
|
575
|
+
}
|
|
292
576
|
}
|
|
@@ -71,6 +71,7 @@ import {
|
|
|
71
71
|
import { QueryBuilderParametersPanel } from './QueryBuilderParametersPanel.js';
|
|
72
72
|
import { QueryBuilderFunctionsExplorerPanel } from './explorer/QueryBuilderFunctionsExplorerPanel.js';
|
|
73
73
|
import { QueryBuilderTDSState } from '../stores/fetch-structure/tds/QueryBuilderTDSState.js';
|
|
74
|
+
import { DataProductQueryBuilderState } from '../stores/workflows/dataProduct/DataProductQueryBuilderState.js';
|
|
74
75
|
import { QueryBuilderDiffViewPanelDiaglog } from './QueryBuilderDiffPanel.js';
|
|
75
76
|
import { guaranteeType, returnUndefOnError } from '@finos/legend-shared';
|
|
76
77
|
import { QueryBuilderGraphFetchTreeState } from '../stores/fetch-structure/graph-fetch/QueryBuilderGraphFetchTreeState.js';
|
|
@@ -778,29 +779,36 @@ export const QueryBuilder = observer(
|
|
|
778
779
|
</MenuContentItemLabel>
|
|
779
780
|
</MenuContentItem>
|
|
780
781
|
<MenuContentDivider />
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
782
|
+
{!(
|
|
783
|
+
queryBuilderState instanceof
|
|
784
|
+
DataProductQueryBuilderState
|
|
785
|
+
) && (
|
|
786
|
+
<MenuContentItem
|
|
787
|
+
onClick={openCheckEntitlmentsEditor}
|
|
788
|
+
disabled={
|
|
789
|
+
(queryBuilderState.isQuerySupported &&
|
|
790
|
+
queryBuilderState.fetchStructureState
|
|
791
|
+
.implementation instanceof
|
|
792
|
+
QueryBuilderTDSState &&
|
|
793
|
+
queryBuilderState.fetchStructureState
|
|
794
|
+
.implementation.projectionColumns.length ===
|
|
795
|
+
0) ||
|
|
796
|
+
!queryBuilderState.canBuildQuery
|
|
797
|
+
}
|
|
798
|
+
title={
|
|
799
|
+
!queryBuilderState.canBuildQuery
|
|
800
|
+
? 'Please fix query errors to check entitlements'
|
|
801
|
+
: ''
|
|
802
|
+
}
|
|
803
|
+
>
|
|
804
|
+
<MenuContentItemIcon>
|
|
805
|
+
<DataAccessIcon />
|
|
806
|
+
</MenuContentItemIcon>
|
|
807
|
+
<MenuContentItemLabel>
|
|
808
|
+
Check Entitlements
|
|
809
|
+
</MenuContentItemLabel>
|
|
810
|
+
</MenuContentItem>
|
|
811
|
+
)}
|
|
804
812
|
<MenuContentItem
|
|
805
813
|
onClick={editPure}
|
|
806
814
|
disabled={!queryBuilderState.canBuildQuery}
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
import { BasicValueSpecificationEditor } from './shared/BasicValueSpecificationEditor.js';
|
|
59
59
|
import { QUERY_BUILDER_TEST_ID } from '../__lib__/QueryBuilderTesting.js';
|
|
60
60
|
import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
|
|
61
|
+
import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
|
|
61
62
|
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
62
63
|
import { variableExpression_setName } from '../stores/shared/ValueSpecificationModifierHelper.js';
|
|
63
64
|
import { LambdaEditor } from './shared/LambdaEditor.js';
|
|
@@ -175,6 +176,16 @@ const QueryBuilderSimpleConstantExpressionEditor = observer(
|
|
|
175
176
|
if (isCreating) {
|
|
176
177
|
variableState.addConstant(constantState);
|
|
177
178
|
}
|
|
179
|
+
QueryBuilderTelemetryHelper.logEvent_ConstantChanged(
|
|
180
|
+
applicationStore.telemetryService,
|
|
181
|
+
{
|
|
182
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
183
|
+
change: {
|
|
184
|
+
action: isCreating ? 'add' : 'edit',
|
|
185
|
+
constantCount: variableState.constants.length,
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
);
|
|
178
189
|
handleCancel();
|
|
179
190
|
};
|
|
180
191
|
|
|
@@ -547,8 +558,19 @@ export const QueryBuilderConstantExpressionPanel = observer(
|
|
|
547
558
|
actions={{
|
|
548
559
|
editVariable: () =>
|
|
549
560
|
constantState.setSelectedConstant(constState),
|
|
550
|
-
deleteVariable: () =>
|
|
551
|
-
constantState.removeConstant(constState)
|
|
561
|
+
deleteVariable: () => {
|
|
562
|
+
constantState.removeConstant(constState);
|
|
563
|
+
QueryBuilderTelemetryHelper.logEvent_ConstantChanged(
|
|
564
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
565
|
+
{
|
|
566
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
567
|
+
change: {
|
|
568
|
+
action: 'remove',
|
|
569
|
+
constantCount: constantState.constants.length,
|
|
570
|
+
},
|
|
571
|
+
},
|
|
572
|
+
);
|
|
573
|
+
},
|
|
552
574
|
}}
|
|
553
575
|
extraContextMenuActions={getExtraContextMenu(constState)}
|
|
554
576
|
isReadOnly={isReadOnly}
|
|
@@ -50,6 +50,7 @@ import { LambdaParameterValuesEditor } from './shared/LambdaParameterValuesEdito
|
|
|
50
50
|
import { VariableViewer } from './shared/QueryBuilderVariableSelector.js';
|
|
51
51
|
import { QUERY_BUILDER_TEST_ID } from '../__lib__/QueryBuilderTesting.js';
|
|
52
52
|
import { QUERY_BUILDER_DOCUMENTATION_KEY } from '../__lib__/QueryBuilderDocumentation.js';
|
|
53
|
+
import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
|
|
53
54
|
import { useCallback, useState } from 'react';
|
|
54
55
|
import {
|
|
55
56
|
buildElementOption,
|
|
@@ -166,6 +167,16 @@ const VariableExpressionEditor = observer(
|
|
|
166
167
|
defaultMilestoningValue,
|
|
167
168
|
);
|
|
168
169
|
}
|
|
170
|
+
QueryBuilderTelemetryHelper.logEvent_ParameterChanged(
|
|
171
|
+
applicationStore.telemetryService,
|
|
172
|
+
{
|
|
173
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
174
|
+
change: {
|
|
175
|
+
action: isCreating ? 'add' : 'edit',
|
|
176
|
+
parameterCount: queryParametersState.parameterStates.length,
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
);
|
|
169
180
|
|
|
170
181
|
handleCancel();
|
|
171
182
|
};
|
|
@@ -390,8 +401,20 @@ export const QueryBuilderParametersPanel = observer(
|
|
|
390
401
|
actions={{
|
|
391
402
|
editVariable: () =>
|
|
392
403
|
queryParameterState.setSelectedParameter(pState),
|
|
393
|
-
deleteVariable: () =>
|
|
394
|
-
queryParameterState.removeParameter(pState)
|
|
404
|
+
deleteVariable: () => {
|
|
405
|
+
queryParameterState.removeParameter(pState);
|
|
406
|
+
QueryBuilderTelemetryHelper.logEvent_ParameterChanged(
|
|
407
|
+
queryBuilderState.applicationStore.telemetryService,
|
|
408
|
+
{
|
|
409
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
410
|
+
change: {
|
|
411
|
+
action: 'remove',
|
|
412
|
+
parameterCount:
|
|
413
|
+
queryParameterState.parameterStates.length,
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
);
|
|
417
|
+
},
|
|
395
418
|
}}
|
|
396
419
|
/>
|
|
397
420
|
))}
|
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
type PackageableElementOption,
|
|
48
48
|
} from '@finos/legend-lego/graph-editor';
|
|
49
49
|
import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
|
|
50
|
+
import { QueryBuilderTelemetryHelper } from '../__lib__/QueryBuilderTelemetryHelper.js';
|
|
50
51
|
|
|
51
52
|
export const getParameterValue = (
|
|
52
53
|
parameter: ValueSpecification | undefined,
|
|
@@ -130,6 +131,15 @@ export const QueryBuilderClassSelector = observer(
|
|
|
130
131
|
return;
|
|
131
132
|
}
|
|
132
133
|
queryBuilderState.changeSourceElement(val.value);
|
|
134
|
+
QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
|
|
135
|
+
applicationStore.telemetryService,
|
|
136
|
+
{
|
|
137
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
138
|
+
change: {
|
|
139
|
+
subtype: 'class',
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
);
|
|
133
143
|
onClassChange?.(val.value);
|
|
134
144
|
};
|
|
135
145
|
|
|
@@ -256,6 +266,15 @@ const BasicQueryBuilderSetup = observer(
|
|
|
256
266
|
return;
|
|
257
267
|
}
|
|
258
268
|
queryBuilderState.changeMapping(val.value);
|
|
269
|
+
QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
|
|
270
|
+
applicationStore.telemetryService,
|
|
271
|
+
{
|
|
272
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
273
|
+
change: {
|
|
274
|
+
subtype: 'mapping',
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
);
|
|
259
278
|
};
|
|
260
279
|
const mappingFilterOption = createFilter({
|
|
261
280
|
ignoreCase: true,
|
|
@@ -287,6 +306,15 @@ const BasicQueryBuilderSetup = observer(
|
|
|
287
306
|
return;
|
|
288
307
|
}
|
|
289
308
|
queryBuilderState.changeRuntime(val.value);
|
|
309
|
+
QueryBuilderTelemetryHelper.logEvent_ExecutionContextChanged(
|
|
310
|
+
applicationStore.telemetryService,
|
|
311
|
+
{
|
|
312
|
+
...queryBuilderState.safeGetTelemetryContext(),
|
|
313
|
+
change: {
|
|
314
|
+
subtype: 'runtime',
|
|
315
|
+
},
|
|
316
|
+
},
|
|
317
|
+
);
|
|
290
318
|
};
|
|
291
319
|
const runtimeFilterOption = createFilter({
|
|
292
320
|
ignoreCase: true,
|
|
@@ -409,6 +409,17 @@ export const QueryBuilderGraphFetchExternalConfig = observer(
|
|
|
409
409
|
} else {
|
|
410
410
|
removeNodeRecursively(serializationTreeData, node);
|
|
411
411
|
serializationState.setGraphFetchTree({ ...serializationTreeData });
|
|
412
|
+
QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
|
|
413
|
+
graphFetchState.queryBuilderState.applicationStore.telemetryService,
|
|
414
|
+
{
|
|
415
|
+
...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
|
|
416
|
+
change: {
|
|
417
|
+
action: 'remove',
|
|
418
|
+
nodeCount: serializationTreeData.nodes.size,
|
|
419
|
+
serializationType: serializationState.getLabel(),
|
|
420
|
+
},
|
|
421
|
+
},
|
|
422
|
+
);
|
|
412
423
|
}
|
|
413
424
|
};
|
|
414
425
|
|
|
@@ -533,10 +544,31 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
|
|
|
533
544
|
updateTreeData({ ...serializationState.treeData });
|
|
534
545
|
}
|
|
535
546
|
updateTreeData({ ...treeData });
|
|
547
|
+
QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
|
|
548
|
+
graphFetchState.queryBuilderState.applicationStore.telemetryService,
|
|
549
|
+
{
|
|
550
|
+
...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
|
|
551
|
+
change: {
|
|
552
|
+
action: 'remove',
|
|
553
|
+
nodeCount: treeData.nodes.size,
|
|
554
|
+
},
|
|
555
|
+
},
|
|
556
|
+
);
|
|
536
557
|
};
|
|
537
558
|
|
|
538
|
-
const toggleChecked = (): void =>
|
|
559
|
+
const toggleChecked = (): void => {
|
|
539
560
|
graphFetchState.setChecked(!graphFetchState.isChecked);
|
|
561
|
+
QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
|
|
562
|
+
graphFetchState.queryBuilderState.applicationStore.telemetryService,
|
|
563
|
+
{
|
|
564
|
+
...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
|
|
565
|
+
change: {
|
|
566
|
+
action: 'check-toggle',
|
|
567
|
+
nodeCount: treeData.nodes.size,
|
|
568
|
+
},
|
|
569
|
+
},
|
|
570
|
+
);
|
|
571
|
+
};
|
|
540
572
|
|
|
541
573
|
const openConfigModal = (): void => {
|
|
542
574
|
if (serializationState instanceof GraphFetchPureSerializationState) {
|
|
@@ -594,6 +626,18 @@ export const QueryBuilderGraphFetchTreeExplorer = observer(
|
|
|
594
626
|
);
|
|
595
627
|
break;
|
|
596
628
|
}
|
|
629
|
+
QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
|
|
630
|
+
graphFetchState.queryBuilderState.applicationStore
|
|
631
|
+
.telemetryService,
|
|
632
|
+
{
|
|
633
|
+
...graphFetchState.queryBuilderState.safeGetTelemetryContext(),
|
|
634
|
+
change: {
|
|
635
|
+
action: 'serialization-change',
|
|
636
|
+
nodeCount: treeData.nodes.size,
|
|
637
|
+
serializationType: implementationType,
|
|
638
|
+
},
|
|
639
|
+
},
|
|
640
|
+
);
|
|
597
641
|
},
|
|
598
642
|
),
|
|
599
643
|
},
|
|
@@ -769,6 +813,17 @@ const QueryBuilderGraphFetchTreePanel = observer(
|
|
|
769
813
|
refreshTreeData: true,
|
|
770
814
|
});
|
|
771
815
|
}
|
|
816
|
+
QueryBuilderTelemetryHelper.logEvent_GraphFetchChanged(
|
|
817
|
+
graphFetchTreeState.queryBuilderState.applicationStore
|
|
818
|
+
.telemetryService,
|
|
819
|
+
{
|
|
820
|
+
...graphFetchTreeState.queryBuilderState.safeGetTelemetryContext(),
|
|
821
|
+
change: {
|
|
822
|
+
action: 'add',
|
|
823
|
+
nodeCount: graphFetchTreeState.treeData?.nodes.size ?? 0,
|
|
824
|
+
},
|
|
825
|
+
},
|
|
826
|
+
);
|
|
772
827
|
},
|
|
773
828
|
[graphFetchTreeState, serializationState],
|
|
774
829
|
);
|