@finos/legend-query-builder 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. package/lib/components/QueryBuilder.d.ts +1 -0
  2. package/lib/components/QueryBuilder.d.ts.map +1 -1
  3. package/lib/components/QueryBuilder.js +24 -20
  4. package/lib/components/QueryBuilder.js.map +1 -1
  5. package/lib/components/QueryBuilderDiffPanel.d.ts +1 -0
  6. package/lib/components/QueryBuilderDiffPanel.d.ts.map +1 -1
  7. package/lib/components/QueryBuilderParametersPanel.d.ts +1 -0
  8. package/lib/components/QueryBuilderParametersPanel.d.ts.map +1 -1
  9. package/lib/components/QueryBuilderParametersPanel.js +4 -8
  10. package/lib/components/QueryBuilderParametersPanel.js.map +1 -1
  11. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts +1 -0
  12. package/lib/components/QueryBuilderPropertyExpressionEditor.d.ts.map +1 -1
  13. package/lib/components/QueryBuilderPropertyExpressionEditor.js +2 -2
  14. package/lib/components/QueryBuilderPropertyExpressionEditor.js.map +1 -1
  15. package/lib/components/QueryBuilderResultPanel.d.ts +1 -0
  16. package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
  17. package/lib/components/QueryBuilderResultPanel.js +4 -2
  18. package/lib/components/QueryBuilderResultPanel.js.map +1 -1
  19. package/lib/components/QueryBuilderSideBar.d.ts +1 -0
  20. package/lib/components/QueryBuilderSideBar.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderTextEditor.d.ts +1 -0
  22. package/lib/components/QueryBuilderTextEditor.d.ts.map +1 -1
  23. package/lib/components/QueryBuilderTextEditor.js +4 -4
  24. package/lib/components/QueryBuilderTextEditor.js.map +1 -1
  25. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts +1 -0
  26. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  27. package/lib/components/explorer/QueryBuilderExplorerPanel.d.ts.map +1 -1
  28. package/lib/components/explorer/QueryBuilderExplorerPanel.js +3 -3
  29. package/lib/components/explorer/QueryBuilderExplorerPanel.js.map +1 -1
  30. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts +1 -0
  31. package/lib/components/explorer/QueryBuilderFunctionsExplorerPanel.d.ts.map +1 -1
  32. package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts +1 -0
  33. package/lib/components/explorer/QueryBuilderMilestoningEditor.d.ts.map +1 -1
  34. package/lib/components/explorer/QueryBuilderMilestoningEditor.js +6 -6
  35. package/lib/components/explorer/QueryBuilderMilestoningEditor.js.map +1 -1
  36. package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts +1 -0
  37. package/lib/components/explorer/QueryBuilderPropertySearchPanel.d.ts.map +1 -1
  38. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts +1 -0
  39. package/lib/components/fetch-structure/QueryBuilderFetchStructurePanel.d.ts.map +1 -1
  40. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts +1 -0
  41. package/lib/components/fetch-structure/QueryBuilderGraphFetchTreePanel.d.ts.map +1 -1
  42. package/lib/components/fetch-structure/QueryBuilderOlapGroupByPanel.d.ts +1 -0
  43. package/lib/components/fetch-structure/QueryBuilderOlapGroupByPanel.d.ts.map +1 -1
  44. package/lib/components/fetch-structure/QueryBuilderOlapGroupByPanel.js +6 -6
  45. package/lib/components/fetch-structure/QueryBuilderOlapGroupByPanel.js.map +1 -1
  46. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts +1 -0
  47. package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
  48. package/lib/components/fetch-structure/QueryBuilderPostTDSPanel.d.ts +1 -0
  49. package/lib/components/fetch-structure/QueryBuilderPostTDSPanel.d.ts.map +1 -1
  50. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts +1 -0
  51. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.d.ts.map +1 -1
  52. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js +3 -3
  53. package/lib/components/fetch-structure/QueryBuilderResultModifierPanel.js.map +1 -1
  54. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts +1 -0
  55. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  56. package/lib/components/filter/QueryBuilderFilterPanel.d.ts +1 -0
  57. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  58. package/lib/components/shared/LambdaEditor.d.ts +1 -0
  59. package/lib/components/shared/LambdaEditor.d.ts.map +1 -1
  60. package/lib/components/shared/LambdaEditor.js +3 -3
  61. package/lib/components/shared/LambdaEditor.js.map +1 -1
  62. package/lib/components/shared/LambdaParameterValuesEditor.d.ts +1 -0
  63. package/lib/components/shared/LambdaParameterValuesEditor.d.ts.map +1 -1
  64. package/lib/components/shared/LambdaParameterValuesEditor.js +3 -3
  65. package/lib/components/shared/LambdaParameterValuesEditor.js.map +1 -1
  66. package/lib/components/watermark/QueryBuilderWatermark.d.ts +23 -0
  67. package/lib/components/watermark/QueryBuilderWatermark.d.ts.map +1 -0
  68. package/lib/components/watermark/QueryBuilderWatermark.js +67 -0
  69. package/lib/components/watermark/QueryBuilderWatermark.js.map +1 -0
  70. package/lib/graphManager/QueryBuilderHashUtils.d.ts +1 -0
  71. package/lib/graphManager/QueryBuilderHashUtils.d.ts.map +1 -1
  72. package/lib/graphManager/QueryBuilderHashUtils.js +2 -0
  73. package/lib/graphManager/QueryBuilderHashUtils.js.map +1 -1
  74. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts +1 -0
  75. package/lib/graphManager/QueryBuilderSupportedFunctions.d.ts.map +1 -1
  76. package/lib/graphManager/QueryBuilderSupportedFunctions.js +2 -0
  77. package/lib/graphManager/QueryBuilderSupportedFunctions.js.map +1 -1
  78. package/lib/graphManager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.d.ts.map +1 -1
  79. package/lib/graphManager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js +4 -1
  80. package/lib/graphManager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.js.map +1 -1
  81. package/lib/graphManager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts +1 -0
  82. package/lib/graphManager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.d.ts.map +1 -1
  83. package/lib/graphManager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js +29 -2
  84. package/lib/graphManager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.js.map +1 -1
  85. package/lib/index.css +2 -2
  86. package/lib/index.css.map +1 -1
  87. package/lib/package.json +2 -2
  88. package/lib/stores/QueryBuilderState.d.ts +4 -0
  89. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  90. package/lib/stores/QueryBuilderState.js +12 -0
  91. package/lib/stores/QueryBuilderState.js.map +1 -1
  92. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  93. package/lib/stores/QueryBuilderStateBuilder.js +12 -1
  94. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  95. package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
  96. package/lib/stores/QueryBuilderValueSpecificationBuilder.js +7 -1
  97. package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
  98. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.d.ts.map +1 -1
  99. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js +2 -1
  100. package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.js.map +1 -1
  101. package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts +31 -0
  102. package/lib/stores/watermark/QueryBuilderWatermarkState.d.ts.map +1 -0
  103. package/lib/stores/watermark/QueryBuilderWatermarkState.js +69 -0
  104. package/lib/stores/watermark/QueryBuilderWatermarkState.js.map +1 -0
  105. package/lib/stores/watermark/QueryBuilderWatermarkStateBuilder.d.ts +19 -0
  106. package/lib/stores/watermark/QueryBuilderWatermarkStateBuilder.d.ts.map +1 -0
  107. package/lib/stores/watermark/QueryBuilderWatermarkStateBuilder.js +30 -0
  108. package/lib/stores/watermark/QueryBuilderWatermarkStateBuilder.js.map +1 -0
  109. package/lib/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.d.ts +19 -0
  110. package/lib/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.d.ts.map +1 -0
  111. package/lib/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.js +30 -0
  112. package/lib/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.js.map +1 -0
  113. package/package.json +7 -7
  114. package/src/components/QueryBuilder.tsx +141 -109
  115. package/src/components/QueryBuilderParametersPanel.tsx +27 -35
  116. package/src/components/QueryBuilderPropertyExpressionEditor.tsx +16 -11
  117. package/src/components/QueryBuilderResultPanel.tsx +18 -0
  118. package/src/components/QueryBuilderTextEditor.tsx +22 -17
  119. package/src/components/explorer/QueryBuilderExplorerPanel.tsx +16 -11
  120. package/src/components/explorer/QueryBuilderMilestoningEditor.tsx +27 -18
  121. package/src/components/fetch-structure/QueryBuilderOlapGroupByPanel.tsx +22 -18
  122. package/src/components/fetch-structure/QueryBuilderResultModifierPanel.tsx +11 -9
  123. package/src/components/shared/LambdaEditor.tsx +20 -17
  124. package/src/components/shared/LambdaParameterValuesEditor.tsx +17 -10
  125. package/src/components/watermark/QueryBuilderWatermark.tsx +185 -0
  126. package/src/graphManager/QueryBuilderHashUtils.ts +3 -0
  127. package/src/graphManager/QueryBuilderSupportedFunctions.ts +2 -0
  128. package/src/graphManager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts +14 -0
  129. package/src/graphManager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts +76 -0
  130. package/src/stores/QueryBuilderState.ts +14 -0
  131. package/src/stores/QueryBuilderStateBuilder.ts +17 -1
  132. package/src/stores/QueryBuilderValueSpecificationBuilder.ts +11 -1
  133. package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionStateBuilder.ts +2 -1
  134. package/src/stores/watermark/QueryBuilderWatermarkState.ts +114 -0
  135. package/src/stores/watermark/QueryBuilderWatermarkStateBuilder.ts +50 -0
  136. package/src/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.ts +46 -0
  137. package/tsconfig.json +4 -0
@@ -19,6 +19,7 @@ import {
19
19
  assertTrue,
20
20
  assertType,
21
21
  filterByType,
22
+ guaranteeNonNullable,
22
23
  guaranteeType,
23
24
  returnUndefOnError,
24
25
  } from '@finos/legend-shared';
@@ -49,6 +50,7 @@ import {
49
50
  TYPICAL_MULTIPLICITY_TYPE,
50
51
  VariableExpression,
51
52
  CORE_PURE_PATH,
53
+ PRIMITIVE_TYPE,
52
54
  } from '@finos/legend-graph';
53
55
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../QueryBuilderSupportedFunctions.js';
54
56
 
@@ -325,6 +327,7 @@ export const V1_buildFilterFunctionExpression = (
325
327
  ),
326
328
  ),
327
329
  ];
330
+
328
331
  const expression = V1_buildBaseSimpleFunctionExpression(
329
332
  processedParams,
330
333
  functionName,
@@ -570,6 +573,79 @@ export const V1_buildGroupByFunctionExpression = (
570
573
  return [expression, processedParams];
571
574
  };
572
575
 
576
+ export const V1_buildWatermarkFunctionExpression = (
577
+ functionName: string,
578
+ parameters: V1_ValueSpecification[],
579
+ openVariables: string[],
580
+ compileContext: V1_GraphBuilderContext,
581
+ processingContext: V1_ProcessingContext,
582
+ ): [SimpleFunctionExpression, ValueSpecification[]] | undefined => {
583
+ assertTrue(
584
+ parameters.length === 2,
585
+ `Can't build forWatermark() expression: forWatermark() expects 1 argument`,
586
+ );
587
+ const precedingExpression = (
588
+ parameters[0] as V1_ValueSpecification
589
+ ).accept_ValueSpecificationVisitor(
590
+ new V1_ValueSpecificationBuilder(
591
+ compileContext,
592
+ processingContext,
593
+ openVariables,
594
+ ),
595
+ );
596
+ assertNonNullable(
597
+ precedingExpression.genericType,
598
+ `Can't build forWatermark() expression: preceding expression return type is missing`,
599
+ );
600
+
601
+ const lambda = parameters[1];
602
+ if (lambda instanceof V1_Lambda) {
603
+ lambda.parameters.forEach((variable): void => {
604
+ if (variable.name && !variable.class) {
605
+ const variableExpression = new VariableExpression(
606
+ variable.name,
607
+ precedingExpression.multiplicity,
608
+ );
609
+ variableExpression.genericType = precedingExpression.genericType;
610
+ processingContext.addInferredVariables(
611
+ variable.name,
612
+ variableExpression,
613
+ );
614
+ }
615
+ });
616
+ }
617
+
618
+ const processedParams = [
619
+ precedingExpression,
620
+ (parameters[1] as V1_ValueSpecification).accept_ValueSpecificationVisitor(
621
+ new V1_ValueSpecificationBuilder(
622
+ compileContext,
623
+ processingContext,
624
+ openVariables,
625
+ ),
626
+ ),
627
+ ];
628
+
629
+ const watermarkValueParam = guaranteeNonNullable(processedParams[1]);
630
+ const watermarkValueParamType =
631
+ watermarkValueParam.genericType?.value.rawType;
632
+ assertTrue(
633
+ compileContext.graph.getPrimitiveType(PRIMITIVE_TYPE.STRING) ===
634
+ watermarkValueParamType,
635
+ "Can't build forWatermark() expression: watermark parameter is expected to be of type string.",
636
+ );
637
+
638
+ const expression = V1_buildBaseSimpleFunctionExpression(
639
+ processedParams,
640
+ functionName,
641
+ compileContext,
642
+ );
643
+
644
+ expression.genericType = precedingExpression.genericType;
645
+ expression.multiplicity = precedingExpression.multiplicity;
646
+ return [expression, processedParams];
647
+ };
648
+
573
649
  export const V1_buildOlapGroupByFunctionExpression = (
574
650
  functionName: string,
575
651
  parameters: V1_ValueSpecification[],
@@ -75,6 +75,7 @@ import { QueryBuilderChangeDetectionState } from './QueryBuilderChangeDetectionS
75
75
  import { QueryBuilderMilestoningState } from './QueryBuilderMilestoningState.js';
76
76
  import { QUERY_BUILDER_HASH_STRUCTURE } from '../graphManager/QueryBuilderHashUtils.js';
77
77
  import { QUERY_BUILDER_COMMAND_KEY } from './QueryBuilderCommand.js';
78
+ import { QueryBuilderWatermarkState } from './watermark/QueryBuilderWatermarkState.js';
78
79
 
79
80
  export abstract class QueryBuilderState implements CommandRegistrar {
80
81
  applicationStore: GenericLegendApplicationStore;
@@ -87,6 +88,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
87
88
  milestoningState: QueryBuilderMilestoningState;
88
89
  fetchStructureState: QueryBuilderFetchStructureState;
89
90
  filterState: QueryBuilderFilterState;
91
+ watermarkState: QueryBuilderWatermarkState;
90
92
  filterOperators: QueryBuilderFilterOperator[] =
91
93
  getQueryBuilderCoreFilterOperators();
92
94
  resultState: QueryBuilderResultState;
@@ -97,6 +99,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
97
99
  queryCompileState = ActionState.create();
98
100
  showFunctionsExplorerPanel = false;
99
101
  showParametersPanel = false;
102
+ isEditingWatermark = false;
100
103
 
101
104
  class?: Class | undefined;
102
105
  mapping?: Mapping | undefined;
@@ -116,11 +119,13 @@ export abstract class QueryBuilderState implements CommandRegistrar {
116
119
  functionsExplorerState: observable,
117
120
  fetchStructureState: observable,
118
121
  filterState: observable,
122
+ watermarkState: observable,
119
123
  resultState: observable,
120
124
  textEditorState: observable,
121
125
  unsupportedQueryState: observable,
122
126
  showFunctionsExplorerPanel: observable,
123
127
  showParametersPanel: observable,
128
+ isEditingWatermark: observable,
124
129
  changeDetectionState: observable,
125
130
  class: observable,
126
131
  mapping: observable,
@@ -132,6 +137,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
132
137
 
133
138
  setShowFunctionsExplorerPanel: action,
134
139
  setShowParametersPanel: action,
140
+ setIsEditingWatermark: action,
135
141
  setClass: action,
136
142
  setMapping: action,
137
143
  setRuntimeValue: action,
@@ -156,6 +162,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
156
162
  this.functionsExplorerState = new QueryFunctionsExplorerState(this);
157
163
  this.fetchStructureState = new QueryBuilderFetchStructureState(this);
158
164
  this.filterState = new QueryBuilderFilterState(this, this.filterOperators);
165
+ this.watermarkState = new QueryBuilderWatermarkState(this);
159
166
  this.resultState = new QueryBuilderResultState(this);
160
167
  this.textEditorState = new QueryBuilderTextEditorState(this);
161
168
  this.unsupportedQueryState = new QueryBuilderUnsupportedQueryState(this);
@@ -201,6 +208,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
201
208
  this.showParametersPanel = val;
202
209
  }
203
210
 
211
+ setIsEditingWatermark(val: boolean): void {
212
+ this.isEditingWatermark = val;
213
+ }
214
+
204
215
  setClass(val: Class | undefined): void {
205
216
  this.class = val;
206
217
  }
@@ -249,6 +260,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
249
260
  this.parametersState = new QueryBuilderParametersState(this);
250
261
  this.functionsExplorerState = new QueryFunctionsExplorerState(this);
251
262
  this.filterState = new QueryBuilderFilterState(this, this.filterOperators);
263
+ this.watermarkState = new QueryBuilderWatermarkState(this);
264
+
252
265
  const currentFetchStructureImplementationType =
253
266
  this.fetchStructureState.implementation.type;
254
267
  this.fetchStructureState = new QueryBuilderFetchStructureState(this);
@@ -482,6 +495,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
482
495
  this.milestoningState,
483
496
  this.parametersState,
484
497
  this.filterState,
498
+ this.watermarkState,
485
499
  this.fetchStructureState.implementation,
486
500
  ]);
487
501
  }
@@ -71,6 +71,7 @@ import {
71
71
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../graphManager/QueryBuilderSupportedFunctions.js';
72
72
  import { LambdaParameterState } from './shared/LambdaParameterState.js';
73
73
  import { processTDSOlapGroupByExpression } from './fetch-structure/tds/olapGroupBy/QueryBuilderOlapGroupByStateBuilder.js';
74
+ import { processWatermarkExpression } from './watermark/QueryBuilderWatermarkStateBuilder.js';
74
75
 
75
76
  const processGetAllExpression = (
76
77
  expression: SimpleFunctionExpression,
@@ -410,11 +411,26 @@ export class QueryBuilderValueSpecificationProcessor
410
411
  this.queryBuilderState,
411
412
  );
412
413
  return;
414
+ } else if (
415
+ matchFunctionName(precedingExpression.functionName, [
416
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.WATERMARK,
417
+ ])
418
+ ) {
419
+ processFilterExpression(valueSpecification, this.queryBuilderState);
420
+ return;
413
421
  } else {
414
422
  throw new UnsupportedOperationError(
415
- `Can't process filter() expression: only support filter() immediately following getAll() or project()/groupBy()/olapGroupBy()`,
423
+ `Can't process filter() expression: only support filter() immediately following getAll() or project()/forWatermark()/groupBy()/olapGroupBy()`,
416
424
  );
417
425
  }
426
+ } else if (
427
+ matchFunctionName(
428
+ functionName,
429
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.WATERMARK,
430
+ )
431
+ ) {
432
+ processWatermarkExpression(valueSpecification, this.queryBuilderState);
433
+ return;
418
434
  } else if (
419
435
  matchFunctionName(
420
436
  functionName,
@@ -37,6 +37,7 @@ import type { LambdaFunctionBuilderOption } from './QueryBuilderValueSpecificati
37
37
  import type { QueryBuilderFetchStructureState } from './fetch-structure/QueryBuilderFetchStructureState.js';
38
38
  import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../graphManager/QueryBuilderSupportedFunctions.js';
39
39
  import { buildParametersLetLambdaFunc } from './shared/LambdaParameterState.js';
40
+ import { buildWatermarkExpression } from './watermark/QueryBuilderWatermarkValueSpecificationBuilder.js';
40
41
 
41
42
  const buildGetAllFunction = (
42
43
  _class: Class,
@@ -136,10 +137,19 @@ export const buildLambdaFunction = (
136
137
  }
137
138
  lambdaFunction.expressionSequence[0] = getAllFunction;
138
139
 
140
+ // build watermark
141
+ const watermarkFunction = buildWatermarkExpression(
142
+ queryBuilderState.watermarkState,
143
+ getAllFunction,
144
+ );
145
+ if (watermarkFunction) {
146
+ lambdaFunction.expressionSequence[0] = watermarkFunction;
147
+ }
148
+
139
149
  // build filter
140
150
  const filterFunction = buildFilterExpression(
141
151
  queryBuilderState.filterState,
142
- getAllFunction,
152
+ watermarkFunction ?? getAllFunction,
143
153
  );
144
154
  if (filterFunction) {
145
155
  lambdaFunction.expressionSequence[0] = filterFunction;
@@ -81,8 +81,9 @@ export const processTDSProjectExpression = (
81
81
  matchFunctionName(precedingExpression.functionName, [
82
82
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.GET_ALL,
83
83
  QUERY_BUILDER_SUPPORTED_FUNCTIONS.FILTER,
84
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.WATERMARK,
84
85
  ]),
85
- `Can't process project() expression: only support project() immediately following either getAll() or filter()`,
86
+ `Can't process project() expression: only support project() immediately following either getAll(), filter(), or forWatermark()`,
86
87
  );
87
88
  QueryBuilderValueSpecificationProcessor.process(
88
89
  precedingExpression,
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ type ValueSpecification,
19
+ observe_ValueSpecification,
20
+ GenericTypeExplicitReference,
21
+ GenericType,
22
+ PRIMITIVE_TYPE,
23
+ PrimitiveInstanceValue,
24
+ TYPICAL_MULTIPLICITY_TYPE,
25
+ multiplicityComparator,
26
+ type VariableExpression,
27
+ } from '@finos/legend-graph';
28
+ import { type Hashable, hashArray } from '@finos/legend-shared';
29
+ import { makeObservable, observable, action, computed } from 'mobx';
30
+ import { QUERY_BUILDER_HASH_STRUCTURE } from '../../graphManager/QueryBuilderHashUtils.js';
31
+ import type { QueryBuilderState } from '../QueryBuilderState.js';
32
+
33
+ export class QueryBuilderWatermarkState implements Hashable {
34
+ readonly queryBuilderState: QueryBuilderState;
35
+ value?: ValueSpecification | undefined;
36
+ isEditingWatermark = false;
37
+
38
+ constructor(queryBuilderState: QueryBuilderState) {
39
+ makeObservable(this, {
40
+ value: observable,
41
+ isEditingWatermark: observable,
42
+ setValue: action,
43
+ resetValue: action,
44
+ enableWatermark: action,
45
+ setIsEditingWatermark: action,
46
+ hashCode: computed,
47
+ });
48
+
49
+ this.queryBuilderState = queryBuilderState;
50
+ }
51
+
52
+ isParamaterCompatibleWithWaterMark = (
53
+ parameter: VariableExpression,
54
+ ): boolean => {
55
+ const isString =
56
+ this.queryBuilderState.graphManagerState.graph.getPrimitiveType(
57
+ PRIMITIVE_TYPE.STRING,
58
+ ) === parameter.genericType?.value.rawType;
59
+
60
+ const isMultiplictyOne = multiplicityComparator(
61
+ parameter.multiplicity,
62
+ this.queryBuilderState.graphManagerState.graph.getTypicalMultiplicity(
63
+ TYPICAL_MULTIPLICITY_TYPE.ONE,
64
+ ),
65
+ );
66
+ return isString && isMultiplictyOne;
67
+ };
68
+
69
+ resetValue(): void {
70
+ const watermarkConstant = new PrimitiveInstanceValue(
71
+ GenericTypeExplicitReference.create(
72
+ new GenericType(
73
+ this.queryBuilderState.graphManagerState.graph.getPrimitiveType(
74
+ PRIMITIVE_TYPE.STRING,
75
+ ),
76
+ ),
77
+ ),
78
+ this.queryBuilderState.graphManagerState.graph.getTypicalMultiplicity(
79
+ TYPICAL_MULTIPLICITY_TYPE.ONE,
80
+ ),
81
+ );
82
+
83
+ watermarkConstant.values = ['watermarkValue'];
84
+ this.setValue(watermarkConstant);
85
+ }
86
+
87
+ setIsEditingWatermark(val: boolean): void {
88
+ this.isEditingWatermark = val;
89
+ }
90
+
91
+ enableWatermark(): void {
92
+ if (this.value) {
93
+ this.setValue(undefined);
94
+ } else {
95
+ this.resetValue();
96
+ }
97
+ }
98
+
99
+ setValue(val: ValueSpecification | undefined): void {
100
+ this.value = val
101
+ ? observe_ValueSpecification(
102
+ val,
103
+ this.queryBuilderState.observableContext,
104
+ )
105
+ : undefined;
106
+ }
107
+
108
+ get hashCode(): string {
109
+ return hashArray([
110
+ QUERY_BUILDER_HASH_STRUCTURE.WATERMARK_STATE,
111
+ this.value ?? '',
112
+ ]);
113
+ }
114
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ SimpleFunctionExpression,
19
+ matchFunctionName,
20
+ } from '@finos/legend-graph';
21
+ import { assertTrue, guaranteeType } from '@finos/legend-shared';
22
+ import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../graphManager/QueryBuilderSupportedFunctions.js';
23
+ import type { QueryBuilderState } from '../QueryBuilderState.js';
24
+ import { QueryBuilderValueSpecificationProcessor } from '../QueryBuilderStateBuilder.js';
25
+
26
+ export const processWatermarkExpression = (
27
+ expression: SimpleFunctionExpression,
28
+ queryBuilderState: QueryBuilderState,
29
+ ): void => {
30
+ // check preceding expression
31
+ const precedingExpression = guaranteeType(
32
+ expression.parametersValues[0],
33
+ SimpleFunctionExpression,
34
+ `Can't process forWatermark() expression: only support forWatermark() immediately following an expression`,
35
+ );
36
+ assertTrue(
37
+ matchFunctionName(precedingExpression.functionName, [
38
+ QUERY_BUILDER_SUPPORTED_FUNCTIONS.GET_ALL,
39
+ ]),
40
+ `Can't process forWatermark() expression: only support forWatermark() immediately following getAll()`,
41
+ );
42
+
43
+ QueryBuilderValueSpecificationProcessor.process(
44
+ precedingExpression,
45
+ queryBuilderState,
46
+ );
47
+
48
+ const watermarkValue = expression.parametersValues[1];
49
+ queryBuilderState.watermarkState.setValue(watermarkValue);
50
+ };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import {
18
+ SimpleFunctionExpression,
19
+ extractElementNameFromPath,
20
+ type VariableExpression,
21
+ } from '@finos/legend-graph';
22
+ import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../graphManager/QueryBuilderSupportedFunctions.js';
23
+ import type { QueryBuilderWatermarkState } from './QueryBuilderWatermarkState.js';
24
+
25
+ export const buildWatermarkExpression = (
26
+ watermarkState: QueryBuilderWatermarkState,
27
+ getAllFunc: SimpleFunctionExpression,
28
+ ): SimpleFunctionExpression | undefined => {
29
+ if (!watermarkState.value) {
30
+ return undefined;
31
+ }
32
+
33
+ // main filter expression
34
+ const watermarkExpression = new SimpleFunctionExpression(
35
+ extractElementNameFromPath(QUERY_BUILDER_SUPPORTED_FUNCTIONS.WATERMARK),
36
+ (watermarkState.value as VariableExpression).multiplicity,
37
+ );
38
+
39
+ // param [0]
40
+ watermarkExpression.parametersValues.push(getAllFunc);
41
+
42
+ // param [1]
43
+ watermarkExpression.parametersValues.push(watermarkState.value);
44
+
45
+ return watermarkExpression;
46
+ };
package/tsconfig.json CHANGED
@@ -150,6 +150,9 @@
150
150
  "./src/stores/shared/LambdaParameterState.ts",
151
151
  "./src/stores/shared/ValueSpecificationEditorHelper.ts",
152
152
  "./src/stores/shared/ValueSpecificationModifierHelper.ts",
153
+ "./src/stores/watermark/QueryBuilderWatermarkState.ts",
154
+ "./src/stores/watermark/QueryBuilderWatermarkStateBuilder.ts",
155
+ "./src/stores/watermark/QueryBuilderWatermarkValueSpecificationBuilder.ts",
153
156
  "./src/stores/workflows/ClassQueryBuilderState.ts",
154
157
  "./src/stores/workflows/MappingQueryBuilderState.ts",
155
158
  "./src/stores/workflows/ServiceQueryBuilderState.ts",
@@ -184,6 +187,7 @@
184
187
  "./src/components/shared/LambdaParameterValuesEditor.tsx",
185
188
  "./src/components/shared/QueryBuilderPanelIssueCountBadge.tsx",
186
189
  "./src/components/shared/QueryBuilderPropertyInfoTooltip.tsx",
190
+ "./src/components/watermark/QueryBuilderWatermark.tsx",
187
191
  "./src/components/workflows/ClassQueryBuilder.tsx",
188
192
  "./src/components/workflows/MappingQueryBuilder.tsx",
189
193
  "./src/components/workflows/ServiceQueryBuilder.tsx"