@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.
Files changed (118) hide show
  1. package/lib/__lib__/QueryBuilderDocumentation.d.ts +2 -1
  2. package/lib/__lib__/QueryBuilderDocumentation.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderDocumentation.js +1 -0
  4. package/lib/__lib__/QueryBuilderDocumentation.js.map +1 -1
  5. package/lib/__lib__/QueryBuilderEvent.d.ts +45 -1
  6. package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
  7. package/lib/__lib__/QueryBuilderEvent.js +48 -0
  8. package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
  9. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts +162 -8
  10. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts.map +1 -1
  11. package/lib/__lib__/QueryBuilderTelemetryHelper.js +48 -0
  12. package/lib/__lib__/QueryBuilderTelemetryHelper.js.map +1 -1
  13. package/lib/components/QueryBuilder.d.ts.map +1 -1
  14. package/lib/components/QueryBuilder.js +9 -5
  15. package/lib/components/QueryBuilder.js.map +1 -1
  16. package/lib/components/QueryBuilderConstantExpressionPanel.d.ts.map +1 -1
  17. package/lib/components/QueryBuilderConstantExpressionPanel.js +18 -1
  18. package/lib/components/QueryBuilderConstantExpressionPanel.js.map +1 -1
  19. package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
  20. package/lib/components/QueryBuilderParametersPanel.js +18 -1
  21. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  22. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  23. package/lib/components/QueryBuilderSideBar.js +19 -0
  24. package/lib/components/QueryBuilderSideBar.js.map +1 -1
  25. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  26. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js +42 -1
  27. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.js.map +1 -1
  28. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  29. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +25 -5
  30. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
  31. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  32. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +55 -0
  33. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  34. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  35. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +95 -8
  36. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  37. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.d.ts.map +1 -1
  38. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js +37 -4
  39. package/lib/components/fetch-structure/QueryBuilderTDSWindowPanel.js.map +1 -1
  40. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  41. package/lib/components/filter/QueryBuilderFilterPanel.js +24 -5
  42. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  43. package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts +61 -0
  44. package/lib/components/result/QueryBuilderDataProductErrorPanel.d.ts.map +1 -0
  45. package/lib/components/result/QueryBuilderDataProductErrorPanel.js +176 -0
  46. package/lib/components/result/QueryBuilderDataProductErrorPanel.js.map +1 -0
  47. package/lib/components/result/QueryBuilderResultPanel.d.ts.map +1 -1
  48. package/lib/components/result/QueryBuilderResultPanel.js +24 -18
  49. package/lib/components/result/QueryBuilderResultPanel.js.map +1 -1
  50. package/lib/data-access-overview.css +1 -1
  51. package/lib/index.css +2 -2
  52. package/lib/index.css.map +1 -1
  53. package/lib/index.d.ts +1 -0
  54. package/lib/index.d.ts.map +1 -1
  55. package/lib/index.js +1 -0
  56. package/lib/index.js.map +1 -1
  57. package/lib/package.json +1 -1
  58. package/lib/stores/QueryBuilderResultState.d.ts +11 -1
  59. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  60. package/lib/stores/QueryBuilderResultState.js +79 -15
  61. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  62. package/lib/stores/QueryBuilderState.d.ts +131 -9
  63. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  64. package/lib/stores/QueryBuilderState.js +124 -21
  65. package/lib/stores/QueryBuilderState.js.map +1 -1
  66. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +13 -0
  67. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  68. package/lib/stores/QueryLoaderState.d.ts +33 -5
  69. package/lib/stores/QueryLoaderState.d.ts.map +1 -1
  70. package/lib/stores/QueryLoaderState.js +10 -1
  71. package/lib/stores/QueryLoaderState.js.map +1 -1
  72. package/lib/stores/data-access/DataProductAccessInfo.d.ts +37 -0
  73. package/lib/stores/data-access/DataProductAccessInfo.d.ts.map +1 -0
  74. package/lib/stores/data-access/DataProductAccessInfo.js +17 -0
  75. package/lib/stores/data-access/DataProductAccessInfo.js.map +1 -0
  76. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js +1 -1
  77. package/lib/stores/data-cube/QueryBuilderDataCubeEngine.js.map +1 -1
  78. package/lib/stores/explorer/QueryBuilderExplorerState.js +1 -1
  79. package/lib/stores/explorer/QueryBuilderExplorerState.js.map +1 -1
  80. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.d.ts.map +1 -1
  81. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js +34 -9
  82. package/lib/stores/milestoning/QueryBuilderMilestoningHelper.js.map +1 -1
  83. package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts +5 -0
  84. package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts.map +1 -1
  85. package/lib/stores/milestoning/QueryBuilderMilestoningState.js +13 -0
  86. package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
  87. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts +2 -0
  88. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts.map +1 -1
  89. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +50 -1
  90. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
  91. package/package.json +10 -10
  92. package/src/__lib__/QueryBuilderDocumentation.ts +1 -0
  93. package/src/__lib__/QueryBuilderEvent.ts +52 -0
  94. package/src/__lib__/QueryBuilderTelemetryHelper.ts +292 -8
  95. package/src/components/QueryBuilder.tsx +31 -23
  96. package/src/components/QueryBuilderConstantExpressionPanel.tsx +24 -2
  97. package/src/components/QueryBuilderParametersPanel.tsx +25 -2
  98. package/src/components/QueryBuilderSideBar.tsx +28 -0
  99. package/src/components/fetch-structure/QueryBuilderGraphFetchTreePanel.tsx +56 -1
  100. package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +31 -4
  101. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +74 -0
  102. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +123 -8
  103. package/src/components/fetch-structure/QueryBuilderTDSWindowPanel.tsx +49 -4
  104. package/src/components/filter/QueryBuilderFilterPanel.tsx +31 -4
  105. package/src/components/result/QueryBuilderDataProductErrorPanel.tsx +441 -0
  106. package/src/components/result/QueryBuilderResultPanel.tsx +49 -32
  107. package/src/index.ts +1 -0
  108. package/src/stores/QueryBuilderResultState.ts +107 -19
  109. package/src/stores/QueryBuilderState.ts +239 -29
  110. package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +20 -0
  111. package/src/stores/QueryLoaderState.ts +47 -6
  112. package/src/stores/data-access/DataProductAccessInfo.ts +37 -0
  113. package/src/stores/data-cube/QueryBuilderDataCubeEngine.ts +1 -1
  114. package/src/stores/explorer/QueryBuilderExplorerState.ts +1 -1
  115. package/src/stores/milestoning/QueryBuilderMilestoningHelper.ts +63 -8
  116. package/src/stores/milestoning/QueryBuilderMilestoningState.ts +20 -0
  117. package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +68 -0
  118. 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 { QueryableClassMappingRuntimeInfo } from '../stores/QueryBuilderState.js';
26
+ import type {
27
+ QueryBuilderQueryInfo,
28
+ QueryBuilderTelemetryContext,
29
+ } from '../stores/QueryBuilderState.js';
25
30
 
26
- type QueryExecution_TelemetryData = GraphManagerOperationReport & {
27
- dependenciesCount: number;
28
- state?: QueryableClassMappingRuntimeInfo | undefined;
29
- };
30
- type QueryMappingModelCoverageAnalysis_TelemetryData =
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
- state?: QueryableClassMappingRuntimeInfo | undefined;
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: { errorMessage: string } & Record<string, unknown>,
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
- <MenuContentItem
782
- onClick={openCheckEntitlmentsEditor}
783
- disabled={
784
- (queryBuilderState.isQuerySupported &&
785
- queryBuilderState.fetchStructureState
786
- .implementation instanceof QueryBuilderTDSState &&
787
- queryBuilderState.fetchStructureState.implementation
788
- .projectionColumns.length === 0) ||
789
- !queryBuilderState.canBuildQuery
790
- }
791
- title={
792
- !queryBuilderState.canBuildQuery
793
- ? 'Please fix query errors to check entitlements'
794
- : ''
795
- }
796
- >
797
- <MenuContentItemIcon>
798
- <DataAccessIcon />
799
- </MenuContentItemIcon>
800
- <MenuContentItemLabel>
801
- Check Entitlements
802
- </MenuContentItemLabel>
803
- </MenuContentItem>
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
  );