@finos/legend-query-builder 4.9.4 → 4.10.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/__lib__/QueryBuilderTesting.d.ts +3 -1
- package/lib/__lib__/QueryBuilderTesting.d.ts.map +1 -1
- package/lib/__lib__/QueryBuilderTesting.js +4 -1
- package/lib/__lib__/QueryBuilderTesting.js.map +1 -1
- package/lib/components/QueryBuilderResultPanel.d.ts.map +1 -1
- package/lib/components/QueryBuilderResultPanel.js +36 -33
- package/lib/components/QueryBuilderResultPanel.js.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts +1 -0
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.d.ts.map +1 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js +13 -1
- package/lib/components/__test-utils__/QueryBuilderComponentTestUtils.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts +2 -2
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js +42 -24
- package/lib/components/fetch-structure/QueryBuilderPostFilterPanel.js.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +1 -1
- package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
- package/lib/index.css +16 -0
- package/lib/package.json +1 -1
- package/lib/stores/QueryBuilderConstantsState.d.ts +5 -1
- package/lib/stores/QueryBuilderConstantsState.d.ts.map +1 -1
- package/lib/stores/QueryBuilderConstantsState.js +14 -1
- package/lib/stores/QueryBuilderConstantsState.js.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.d.ts +2 -0
- package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
- package/lib/stores/QueryBuilderStateHashUtils.js +2 -0
- package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js +3 -23
- package/lib/stores/QueryBuilderValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.js +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts +31 -5
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js +125 -30
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js +21 -8
- package/lib/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts +3 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js +20 -17
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js +4 -6
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js +4 -6
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.d.ts +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js +10 -10
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js +10 -10
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.js +5 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.d.ts +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.js +32 -27
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js +10 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js +10 -10
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.js +5 -5
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.js.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js +4 -6
- package/lib/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.js.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.d.ts.map +1 -1
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js +17 -3
- package/lib/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.js.map +1 -1
- package/package.json +4 -4
- package/src/__lib__/QueryBuilderTesting.ts +4 -1
- package/src/components/QueryBuilderResultPanel.tsx +64 -59
- package/src/components/__test-utils__/QueryBuilderComponentTestUtils.tsx +25 -1
- package/src/components/fetch-structure/QueryBuilderPostFilterPanel.tsx +102 -49
- package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +6 -2
- package/src/stores/QueryBuilderConstantsState.ts +30 -0
- package/src/stores/QueryBuilderStateHashUtils.ts +2 -0
- package/src/stores/QueryBuilderValueSpecificationBuilder.ts +4 -50
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterOperator.ts +1 -1
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterState.ts +180 -34
- package/src/stores/fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.ts +38 -9
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.ts +36 -20
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Contain.ts +5 -6
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_EndWith.ts +6 -6
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.ts +12 -13
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThan.ts +10 -9
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_GreaterThanEqual.ts +5 -4
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_In.ts +48 -43
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_IsEmpty.ts +12 -4
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThan.ts +10 -9
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_LessThanEqual.ts +5 -4
- package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_StartWith.ts +6 -6
- package/src/stores/fetch-structure/tds/projection/QueryBuilderProjectionColumnState.ts +26 -4
@@ -21,10 +21,12 @@ import {
|
|
21
21
|
type ValueSpecification,
|
22
22
|
type ExecutionResult,
|
23
23
|
type VariableExpression,
|
24
|
+
type SimpleFunctionExpression,
|
24
25
|
Enumeration,
|
25
26
|
PRIMITIVE_TYPE,
|
26
27
|
observe_ValueSpecification,
|
27
28
|
PrimitiveType,
|
29
|
+
CollectionInstanceValue,
|
28
30
|
} from '@finos/legend-graph';
|
29
31
|
import {
|
30
32
|
type GeneratorFn,
|
@@ -70,7 +72,12 @@ import { QUERY_BUILDER_GROUP_OPERATION } from '../../../QueryBuilderGroupOperati
|
|
70
72
|
import type { QueryBuilderTDSState } from '../QueryBuilderTDSState.js';
|
71
73
|
import { QUERY_BUILDER_STATE_HASH_STRUCTURE } from '../../../QueryBuilderStateHashUtils.js';
|
72
74
|
import type { QueryBuilderTDSColumnState } from '../QueryBuilderTDSColumnState.js';
|
73
|
-
import {
|
75
|
+
import {
|
76
|
+
getCollectionValueSpecificationType,
|
77
|
+
getNonCollectionValueSpecificationType,
|
78
|
+
isValueExpressionReferencedInValue,
|
79
|
+
} from '../../../QueryBuilderValueSpecificationHelper.js';
|
80
|
+
import { buildtdsPropertyExpressionFromColState } from './operators/QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
|
74
81
|
|
75
82
|
export enum QUERY_BUILDER_POST_FILTER_DND_TYPE {
|
76
83
|
GROUP_CONDITION = 'GROUP_CONDITION',
|
@@ -207,8 +214,8 @@ export class QueryBuilderPostFilterTreeGroupNodeData
|
|
207
214
|
super(parentId);
|
208
215
|
makeObservable(this, {
|
209
216
|
groupOperation: observable,
|
210
|
-
childrenIds: observable,
|
211
217
|
setGroupOperation: action,
|
218
|
+
childrenIds: observable,
|
212
219
|
addChildNode: action,
|
213
220
|
removeChildNode: action,
|
214
221
|
dragPreviewLabel: computed,
|
@@ -307,10 +314,130 @@ export class QueryBuilderPostFilterTreeBlankConditionNodeData
|
|
307
314
|
}
|
308
315
|
}
|
309
316
|
|
317
|
+
export abstract class PostFilterConditionValueState implements Hashable {
|
318
|
+
conditionState: PostFilterConditionState;
|
319
|
+
|
320
|
+
constructor(conditionState: PostFilterConditionState) {
|
321
|
+
this.conditionState = conditionState;
|
322
|
+
}
|
323
|
+
|
324
|
+
get type(): Type | undefined {
|
325
|
+
return undefined;
|
326
|
+
}
|
327
|
+
|
328
|
+
get isCollection(): boolean {
|
329
|
+
return false;
|
330
|
+
}
|
331
|
+
|
332
|
+
get hashCode(): string {
|
333
|
+
return hashArray([
|
334
|
+
QUERY_BUILDER_STATE_HASH_STRUCTURE.POST_FILTER_CONDITION_RIGHT_VALUE,
|
335
|
+
]);
|
336
|
+
}
|
337
|
+
|
338
|
+
abstract appendConditionValue(expressionVal: SimpleFunctionExpression): void;
|
339
|
+
}
|
340
|
+
|
341
|
+
export class PostFilterValueSpecConditionValueState extends PostFilterConditionValueState {
|
342
|
+
value?: ValueSpecification | undefined;
|
343
|
+
|
344
|
+
constructor(
|
345
|
+
conditionState: PostFilterConditionState,
|
346
|
+
value?: ValueSpecification | undefined,
|
347
|
+
) {
|
348
|
+
super(conditionState);
|
349
|
+
makeObservable(this, {
|
350
|
+
value: observable,
|
351
|
+
setValue: action,
|
352
|
+
});
|
353
|
+
this.value = this.setValue(value);
|
354
|
+
}
|
355
|
+
|
356
|
+
override get type(): Type | undefined {
|
357
|
+
if (this.value instanceof CollectionInstanceValue) {
|
358
|
+
return getCollectionValueSpecificationType(
|
359
|
+
this.conditionState.postFilterState.tdsState.queryBuilderState
|
360
|
+
.graphManagerState.graph,
|
361
|
+
this.value.values,
|
362
|
+
);
|
363
|
+
}
|
364
|
+
return this.value
|
365
|
+
? getNonCollectionValueSpecificationType(this.value)
|
366
|
+
: undefined;
|
367
|
+
}
|
368
|
+
|
369
|
+
setValue(
|
370
|
+
val: ValueSpecification | undefined,
|
371
|
+
): ValueSpecification | undefined {
|
372
|
+
this.value = val
|
373
|
+
? observe_ValueSpecification(
|
374
|
+
val,
|
375
|
+
this.conditionState.postFilterState.tdsState.queryBuilderState
|
376
|
+
.observerContext,
|
377
|
+
)
|
378
|
+
: undefined;
|
379
|
+
return this.value;
|
380
|
+
}
|
381
|
+
override appendConditionValue(expressionVal: SimpleFunctionExpression): void {
|
382
|
+
if (this.value) {
|
383
|
+
expressionVal.parametersValues.push(this.value);
|
384
|
+
}
|
385
|
+
}
|
386
|
+
|
387
|
+
override get isCollection(): boolean {
|
388
|
+
return this.value instanceof CollectionInstanceValue;
|
389
|
+
}
|
390
|
+
|
391
|
+
override get hashCode(): string {
|
392
|
+
return hashArray([
|
393
|
+
QUERY_BUILDER_STATE_HASH_STRUCTURE.POST_FILTER_CONDITION_RIGHT_VALUE_SPEC,
|
394
|
+
this.value,
|
395
|
+
]);
|
396
|
+
}
|
397
|
+
}
|
398
|
+
|
399
|
+
export class PostFilterTDSColumnValueConditionValueState extends PostFilterConditionValueState {
|
400
|
+
tdsColumn: QueryBuilderTDSColumnState;
|
401
|
+
|
402
|
+
constructor(
|
403
|
+
conditionState: PostFilterConditionState,
|
404
|
+
tdsColumn: QueryBuilderTDSColumnState,
|
405
|
+
) {
|
406
|
+
super(conditionState);
|
407
|
+
makeObservable(this, {
|
408
|
+
tdsColumn: observable,
|
409
|
+
changeCol: action,
|
410
|
+
});
|
411
|
+
this.tdsColumn = tdsColumn;
|
412
|
+
}
|
413
|
+
|
414
|
+
override get type(): Type | undefined {
|
415
|
+
return this.tdsColumn.getColumnType();
|
416
|
+
}
|
417
|
+
|
418
|
+
override get isCollection(): boolean {
|
419
|
+
return false;
|
420
|
+
}
|
421
|
+
override appendConditionValue(expressionVal: SimpleFunctionExpression): void {
|
422
|
+
const tdsPropertyExpression = buildtdsPropertyExpressionFromColState(
|
423
|
+
this.conditionState,
|
424
|
+
this.tdsColumn,
|
425
|
+
this.conditionState.postFilterState.tdsState.queryBuilderState
|
426
|
+
.graphManagerState.graph,
|
427
|
+
undefined,
|
428
|
+
);
|
429
|
+
expressionVal.parametersValues.push(tdsPropertyExpression);
|
430
|
+
}
|
431
|
+
|
432
|
+
changeCol(col: QueryBuilderTDSColumnState): void {
|
433
|
+
this.tdsColumn = col;
|
434
|
+
}
|
435
|
+
}
|
436
|
+
|
310
437
|
export class PostFilterConditionState implements Hashable {
|
311
438
|
readonly postFilterState: QueryBuilderPostFilterState;
|
312
|
-
|
313
|
-
|
439
|
+
leftConditionValue: QueryBuilderTDSColumnState;
|
440
|
+
rightConditionValue: PostFilterConditionValueState;
|
314
441
|
operator: QueryBuilderPostFilterOperator;
|
315
442
|
typeaheadSearchResults: string[] | undefined;
|
316
443
|
typeaheadSearchState = ActionState.create();
|
@@ -318,18 +445,18 @@ export class PostFilterConditionState implements Hashable {
|
|
318
445
|
constructor(
|
319
446
|
postFilterState: QueryBuilderPostFilterState,
|
320
447
|
colState: QueryBuilderTDSColumnState,
|
321
|
-
value: ValueSpecification | undefined,
|
322
448
|
operator: QueryBuilderPostFilterOperator | undefined,
|
323
449
|
) {
|
324
450
|
makeObservable(this, {
|
325
451
|
postFilterState: observable,
|
326
|
-
|
452
|
+
rightConditionValue: observable,
|
327
453
|
operator: observable,
|
328
|
-
|
454
|
+
leftConditionValue: observable,
|
329
455
|
typeaheadSearchResults: observable,
|
330
456
|
changeOperator: action,
|
331
457
|
setColumnState: action,
|
332
|
-
|
458
|
+
setRightConditionVal: action,
|
459
|
+
buildFromValueSpec: action,
|
333
460
|
setOperator: action,
|
334
461
|
changeColumn: flow,
|
335
462
|
handleTypeaheadSearch: flow,
|
@@ -338,21 +465,24 @@ export class PostFilterConditionState implements Hashable {
|
|
338
465
|
});
|
339
466
|
|
340
467
|
this.postFilterState = postFilterState;
|
341
|
-
this.
|
342
|
-
this.
|
468
|
+
this.leftConditionValue = colState;
|
469
|
+
this.rightConditionValue = new PostFilterValueSpecConditionValueState(
|
470
|
+
this,
|
471
|
+
undefined,
|
472
|
+
);
|
343
473
|
if (operator) {
|
344
474
|
this.operator = operator;
|
345
475
|
} else {
|
346
476
|
assertTrue(
|
347
477
|
this.operators.length !== 0,
|
348
|
-
`Can't find an operator for column '${this.
|
478
|
+
`Can't find an operator for column '${this.leftConditionValue.columnName}`,
|
349
479
|
);
|
350
480
|
this.operator = guaranteeNonNullable(this.operators[0]);
|
351
481
|
}
|
352
482
|
}
|
353
483
|
|
354
484
|
get columnName(): string {
|
355
|
-
return this.
|
485
|
+
return this.leftConditionValue.columnName;
|
356
486
|
}
|
357
487
|
|
358
488
|
get operators(): QueryBuilderPostFilterOperator[] {
|
@@ -361,23 +491,43 @@ export class PostFilterConditionState implements Hashable {
|
|
361
491
|
);
|
362
492
|
}
|
363
493
|
|
494
|
+
setRightConditionVal(val: PostFilterConditionValueState): void {
|
495
|
+
this.rightConditionValue = val;
|
496
|
+
}
|
497
|
+
|
498
|
+
buildFromValueSpec(val: ValueSpecification | undefined): void {
|
499
|
+
if (
|
500
|
+
this.rightConditionValue instanceof PostFilterValueSpecConditionValueState
|
501
|
+
) {
|
502
|
+
this.rightConditionValue.setValue(val);
|
503
|
+
return;
|
504
|
+
} else {
|
505
|
+
this.setRightConditionVal(
|
506
|
+
new PostFilterValueSpecConditionValueState(this, val),
|
507
|
+
);
|
508
|
+
}
|
509
|
+
}
|
364
510
|
*handleTypeaheadSearch(): GeneratorFn<void> {
|
365
511
|
try {
|
366
512
|
this.typeaheadSearchState.inProgress();
|
367
513
|
this.typeaheadSearchResults = undefined;
|
368
514
|
const _columnState =
|
369
|
-
this.
|
370
|
-
this.
|
371
|
-
? this.
|
515
|
+
this.leftConditionValue instanceof QueryBuilderProjectionColumnState ||
|
516
|
+
this.leftConditionValue instanceof QueryBuilderAggregateColumnState
|
517
|
+
? this.leftConditionValue
|
372
518
|
: undefined;
|
373
519
|
const columnState = guaranteeNonNullable(_columnState);
|
374
|
-
|
520
|
+
const rightConditionValue = guaranteeType(
|
521
|
+
this.rightConditionValue,
|
522
|
+
PostFilterValueSpecConditionValueState,
|
523
|
+
);
|
524
|
+
if (performTypeahead(rightConditionValue.value)) {
|
375
525
|
const result =
|
376
526
|
(yield this.postFilterState.tdsState.queryBuilderState.graphManagerState.graphManager.runQuery(
|
377
527
|
buildProjectionColumnTypeaheadQuery(
|
378
528
|
this.postFilterState.tdsState.queryBuilderState,
|
379
529
|
columnState,
|
380
|
-
|
530
|
+
rightConditionValue.value,
|
381
531
|
),
|
382
532
|
guaranteeNonNullable(
|
383
533
|
this.postFilterState.tdsState.queryBuilderState
|
@@ -404,23 +554,15 @@ export class PostFilterConditionState implements Hashable {
|
|
404
554
|
changeOperator(val: QueryBuilderPostFilterOperator): void {
|
405
555
|
this.setOperator(val);
|
406
556
|
if (!this.operator.isCompatibleWithConditionValue(this)) {
|
407
|
-
this.
|
557
|
+
this.buildFromValueSpec(
|
558
|
+
this.operator.getDefaultFilterConditionValue(this),
|
559
|
+
);
|
408
560
|
}
|
409
561
|
}
|
410
|
-
|
411
|
-
setValue(val: ValueSpecification | undefined): void {
|
412
|
-
this.value = val
|
413
|
-
? observe_ValueSpecification(
|
414
|
-
val,
|
415
|
-
this.postFilterState.tdsState.queryBuilderState.observerContext,
|
416
|
-
)
|
417
|
-
: undefined;
|
418
|
-
}
|
419
|
-
|
420
562
|
setColumnState(
|
421
563
|
val: QueryBuilderProjectionColumnState | QueryBuilderAggregateColumnState,
|
422
564
|
): void {
|
423
|
-
this.
|
565
|
+
this.leftConditionValue = val;
|
424
566
|
}
|
425
567
|
|
426
568
|
setOperator(val: QueryBuilderPostFilterOperator): void {
|
@@ -450,7 +592,9 @@ export class PostFilterConditionState implements Hashable {
|
|
450
592
|
|
451
593
|
// value
|
452
594
|
if (!this.operator.isCompatibleWithConditionValue(this)) {
|
453
|
-
this.
|
595
|
+
this.buildFromValueSpec(
|
596
|
+
this.operator.getDefaultFilterConditionValue(this),
|
597
|
+
);
|
454
598
|
}
|
455
599
|
} catch (error) {
|
456
600
|
assertErrorThrown(error);
|
@@ -463,8 +607,8 @@ export class PostFilterConditionState implements Hashable {
|
|
463
607
|
get hashCode(): string {
|
464
608
|
return hashArray([
|
465
609
|
QUERY_BUILDER_STATE_HASH_STRUCTURE.POST_FILTER_CONDITION_STATE,
|
466
|
-
this.
|
467
|
-
this.
|
610
|
+
this.leftConditionValue,
|
611
|
+
this.rightConditionValue,
|
468
612
|
this.operator,
|
469
613
|
]);
|
470
614
|
}
|
@@ -555,7 +699,7 @@ export class QueryBuilderPostFilterState
|
|
555
699
|
return uniq(
|
556
700
|
Array.from(this.nodes.values())
|
557
701
|
.filter(filterByType(QueryBuilderPostFilterTreeConditionNodeData))
|
558
|
-
.map((n) => n.condition.
|
702
|
+
.map((n) => n.condition.leftConditionValue),
|
559
703
|
);
|
560
704
|
}
|
561
705
|
|
@@ -883,7 +1027,9 @@ export class QueryBuilderPostFilterState
|
|
883
1027
|
return Boolean(
|
884
1028
|
Array.from(this.nodes.values())
|
885
1029
|
.filter(filterByType(QueryBuilderPostFilterTreeConditionNodeData))
|
886
|
-
.map((node) => node.condition.
|
1030
|
+
.map((node) => node.condition.rightConditionValue)
|
1031
|
+
.filter(filterByType(PostFilterValueSpecConditionValueState))
|
1032
|
+
.map((condition) => condition.value)
|
887
1033
|
.filter(isNonNullable)
|
888
1034
|
.find((value) => isValueExpressionReferencedInValue(variable, value)),
|
889
1035
|
);
|
@@ -23,6 +23,7 @@ import {
|
|
23
23
|
VariableExpression,
|
24
24
|
FunctionExpression,
|
25
25
|
type SimpleFunctionExpression,
|
26
|
+
type ValueSpecification,
|
26
27
|
} from '@finos/legend-graph';
|
27
28
|
import {
|
28
29
|
assertTrue,
|
@@ -30,6 +31,7 @@ import {
|
|
30
31
|
guaranteeIsString,
|
31
32
|
guaranteeNonNullable,
|
32
33
|
guaranteeType,
|
34
|
+
returnUndefOnError,
|
33
35
|
UnsupportedOperationError,
|
34
36
|
} from '@finos/legend-shared';
|
35
37
|
import { QueryBuilderDerivationProjectionColumnState } from '../projection/QueryBuilderProjectionColumnState.js';
|
@@ -44,6 +46,8 @@ import {
|
|
44
46
|
QueryBuilderPostFilterTreeGroupNodeData,
|
45
47
|
TDS_COLUMN_GETTER,
|
46
48
|
getTypeFromDerivedProperty,
|
49
|
+
PostFilterValueSpecConditionValueState,
|
50
|
+
PostFilterTDSColumnValueConditionValueState,
|
47
51
|
} from './QueryBuilderPostFilterState.js';
|
48
52
|
import { QUERY_BUILDER_SUPPORTED_FUNCTIONS } from '../../../../graph/QueryBuilderMetaModelConst.js';
|
49
53
|
import type { QueryBuilderState } from '../../../QueryBuilderState.js';
|
@@ -102,6 +106,36 @@ const findProjectionColumnState = (
|
|
102
106
|
return columnState;
|
103
107
|
};
|
104
108
|
|
109
|
+
const buildPostFilterConditionValueState = (
|
110
|
+
rightVal: ValueSpecification | undefined,
|
111
|
+
conditionState: PostFilterConditionState,
|
112
|
+
): void => {
|
113
|
+
if (rightVal instanceof AbstractPropertyExpression) {
|
114
|
+
const rightCol = returnUndefOnError(() =>
|
115
|
+
findProjectionColumnState(rightVal, conditionState.postFilterState),
|
116
|
+
);
|
117
|
+
if (rightCol) {
|
118
|
+
conditionState.setRightConditionVal(
|
119
|
+
new PostFilterTDSColumnValueConditionValueState(
|
120
|
+
conditionState,
|
121
|
+
rightCol,
|
122
|
+
),
|
123
|
+
);
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
const val = rightVal
|
128
|
+
? simplifyValueExpression(
|
129
|
+
rightVal,
|
130
|
+
conditionState.postFilterState.tdsState.queryBuilderState
|
131
|
+
.observerContext,
|
132
|
+
)
|
133
|
+
: undefined;
|
134
|
+
conditionState.setRightConditionVal(
|
135
|
+
new PostFilterValueSpecConditionValueState(conditionState, val),
|
136
|
+
);
|
137
|
+
};
|
138
|
+
|
105
139
|
export const buildPostFilterConditionState = (
|
106
140
|
postFilterState: QueryBuilderPostFilterState,
|
107
141
|
expression: FunctionExpression,
|
@@ -119,7 +153,6 @@ export const buildPostFilterConditionState = (
|
|
119
153
|
postConditionState = new PostFilterConditionState(
|
120
154
|
postFilterState,
|
121
155
|
columnState,
|
122
|
-
undefined,
|
123
156
|
operator,
|
124
157
|
);
|
125
158
|
return postConditionState;
|
@@ -150,21 +183,17 @@ export const buildPostFilterConditionState = (
|
|
150
183
|
);
|
151
184
|
|
152
185
|
// get operation value specification
|
153
|
-
const
|
186
|
+
const rightSide = expression.parametersValues[1];
|
154
187
|
|
155
188
|
// create state
|
156
189
|
postConditionState = new PostFilterConditionState(
|
157
190
|
postFilterState,
|
158
191
|
columnState,
|
159
|
-
value
|
160
|
-
? simplifyValueExpression(
|
161
|
-
value,
|
162
|
-
postFilterState.tdsState.queryBuilderState.observerContext,
|
163
|
-
)
|
164
|
-
: undefined,
|
165
192
|
operator,
|
166
193
|
);
|
167
194
|
|
195
|
+
buildPostFilterConditionValueState(rightSide, postConditionState);
|
196
|
+
|
168
197
|
//post checks
|
169
198
|
assertTrue(
|
170
199
|
operator.isCompatibleWithPostFilterColumn(postConditionState),
|
@@ -174,7 +203,7 @@ export const buildPostFilterConditionState = (
|
|
174
203
|
);
|
175
204
|
assertTrue(
|
176
205
|
operator.isCompatibleWithConditionValue(postConditionState),
|
177
|
-
`Operator '${operator.getLabel()}' not compatible with value specification ${
|
206
|
+
`Operator '${operator.getLabel()}' not compatible with value specification ${rightSide?.toString()}`,
|
178
207
|
);
|
179
208
|
}
|
180
209
|
return postConditionState;
|
@@ -27,6 +27,7 @@ import {
|
|
27
27
|
PropertyExplicitReference,
|
28
28
|
Multiplicity,
|
29
29
|
PrimitiveType,
|
30
|
+
type PureModel,
|
30
31
|
} from '@finos/legend-graph';
|
31
32
|
import { guaranteeNonNullable } from '@finos/legend-shared';
|
32
33
|
import type { QueryBuilderPostFilterOperator } from '../QueryBuilderPostFilterOperator.js';
|
@@ -36,27 +37,19 @@ import {
|
|
36
37
|
getTDSColumnDerivedProperyFromType,
|
37
38
|
} from '../QueryBuilderPostFilterState.js';
|
38
39
|
import { QUERY_BUILDER_PURE_PATH } from '../../../../../graph/QueryBuilderMetaModelConst.js';
|
40
|
+
import type { QueryBuilderTDSColumnState } from '../../QueryBuilderTDSColumnState.js';
|
39
41
|
|
40
|
-
export const
|
42
|
+
export const buildtdsPropertyExpressionFromColState = (
|
41
43
|
filterConditionState: PostFilterConditionState,
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
* name. If not provided, we will fall back to use the TDS column getter function expression.
|
47
|
-
* This is the case because with TDS, we are provided some filter-like operators, e.g. IS_NULL, IS_NOT_NULL, etc.
|
48
|
-
*/
|
49
|
-
operatorFunctionFullPath: string | undefined,
|
50
|
-
): FunctionExpression => {
|
51
|
-
// primitives
|
52
|
-
const graph =
|
53
|
-
filterConditionState.postFilterState.tdsState.queryBuilderState
|
54
|
-
.graphManagerState.graph;
|
55
|
-
// property expression
|
56
|
-
const colState = filterConditionState.columnState;
|
44
|
+
colState: QueryBuilderTDSColumnState,
|
45
|
+
graph: PureModel,
|
46
|
+
operator: QueryBuilderPostFilterOperator | undefined,
|
47
|
+
): AbstractPropertyExpression => {
|
57
48
|
const tdsPropertyExpression = new AbstractPropertyExpression('');
|
58
49
|
let tdsDerivedPropertyName: TDS_COLUMN_GETTER;
|
59
|
-
const correspondingTDSDerivedProperty = operator
|
50
|
+
const correspondingTDSDerivedProperty = operator
|
51
|
+
? operator.getTDSColumnGetter()
|
52
|
+
: undefined;
|
60
53
|
if (correspondingTDSDerivedProperty) {
|
61
54
|
tdsDerivedPropertyName = correspondingTDSDerivedProperty;
|
62
55
|
} else {
|
@@ -79,15 +72,38 @@ export const buildPostFilterConditionExpression = (
|
|
79
72
|
);
|
80
73
|
colInstanceValue.values = [colState.columnName];
|
81
74
|
tdsPropertyExpression.parametersValues = [variableName, colInstanceValue];
|
75
|
+
return tdsPropertyExpression;
|
76
|
+
};
|
77
|
+
|
78
|
+
export const buildPostFilterConditionExpression = (
|
79
|
+
filterConditionState: PostFilterConditionState,
|
80
|
+
operator: QueryBuilderPostFilterOperator,
|
81
|
+
/**
|
82
|
+
* If provided, this will be used to construct the simple
|
83
|
+
* function expression for the function with the specified
|
84
|
+
* name. If not provided, we will fall back to use the TDS column getter function expression.
|
85
|
+
* This is the case because with TDS, we are provided some filter-like operators, e.g. IS_NULL, IS_NOT_NULL, etc.
|
86
|
+
*/
|
87
|
+
operatorFunctionFullPath: string | undefined,
|
88
|
+
): FunctionExpression => {
|
89
|
+
// primitives
|
90
|
+
const graph =
|
91
|
+
filterConditionState.postFilterState.tdsState.queryBuilderState
|
92
|
+
.graphManagerState.graph;
|
93
|
+
// property expression
|
94
|
+
const tdsPropertyExpression = buildtdsPropertyExpressionFromColState(
|
95
|
+
filterConditionState,
|
96
|
+
filterConditionState.leftConditionValue,
|
97
|
+
graph,
|
98
|
+
operator,
|
99
|
+
);
|
82
100
|
|
83
101
|
if (operatorFunctionFullPath) {
|
84
102
|
const expression = new SimpleFunctionExpression(
|
85
103
|
extractElementNameFromPath(operatorFunctionFullPath),
|
86
104
|
);
|
87
105
|
expression.parametersValues.push(tdsPropertyExpression);
|
88
|
-
|
89
|
-
expression.parametersValues.push(filterConditionState.value);
|
90
|
-
}
|
106
|
+
filterConditionState.rightConditionValue.appendConditionValue(expression);
|
91
107
|
return expression;
|
92
108
|
} else {
|
93
109
|
return tdsPropertyExpression;
|
@@ -37,7 +37,6 @@ import type {
|
|
37
37
|
import {
|
38
38
|
buildNotExpression,
|
39
39
|
generateDefaultValueForPrimitiveType,
|
40
|
-
getNonCollectionValueSpecificationType,
|
41
40
|
unwrapNotExpression,
|
42
41
|
} from '../../../../QueryBuilderValueSpecificationHelper.js';
|
43
42
|
import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
|
@@ -60,17 +59,17 @@ export class QueryBuilderPostFilterOperator_Contain
|
|
60
59
|
isCompatibleWithConditionValue(
|
61
60
|
postFilterConditionState: PostFilterConditionState,
|
62
61
|
): boolean {
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
return (
|
63
|
+
!postFilterConditionState.rightConditionValue.isCollection &&
|
64
|
+
PrimitiveType.STRING === postFilterConditionState.rightConditionValue.type
|
65
|
+
);
|
67
66
|
}
|
68
67
|
|
69
68
|
getDefaultFilterConditionValue(
|
70
69
|
postFilterConditionState: PostFilterConditionState,
|
71
70
|
): ValueSpecification {
|
72
71
|
const propertyType = guaranteeNonNullable(
|
73
|
-
postFilterConditionState.
|
72
|
+
postFilterConditionState.leftConditionValue.getColumnType(),
|
74
73
|
);
|
75
74
|
switch (propertyType.path) {
|
76
75
|
case PRIMITIVE_TYPE.STRING: {
|
@@ -35,7 +35,6 @@ import type {
|
|
35
35
|
import {
|
36
36
|
buildNotExpression,
|
37
37
|
generateDefaultValueForPrimitiveType,
|
38
|
-
getNonCollectionValueSpecificationType,
|
39
38
|
unwrapNotExpression,
|
40
39
|
} from '../../../../QueryBuilderValueSpecificationHelper.js';
|
41
40
|
import { buildPostFilterConditionExpression } from './QueryBuilderPostFilterOperatorValueSpecificationBuilder.js';
|
@@ -58,16 +57,17 @@ export class QueryBuilderPostFilterOperator_EndWith
|
|
58
57
|
isCompatibleWithConditionValue(
|
59
58
|
postFilterConditionState: PostFilterConditionState,
|
60
59
|
): boolean {
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
return (
|
61
|
+
!postFilterConditionState.rightConditionValue.isCollection &&
|
62
|
+
PrimitiveType.STRING === postFilterConditionState.rightConditionValue.type
|
63
|
+
);
|
65
64
|
}
|
66
65
|
|
67
66
|
getDefaultFilterConditionValue(
|
68
67
|
postFilterConditionState: PostFilterConditionState,
|
69
68
|
): ValueSpecification {
|
70
|
-
const propertyType =
|
69
|
+
const propertyType =
|
70
|
+
postFilterConditionState.leftConditionValue.getColumnType();
|
71
71
|
switch (propertyType?.path) {
|
72
72
|
case PRIMITIVE_TYPE.STRING: {
|
73
73
|
return buildPrimitiveInstanceValue(
|
package/src/stores/fetch-structure/tds/post-filter/operators/QueryBuilderPostFilterOperator_Equal.ts
CHANGED
@@ -27,6 +27,7 @@ import {
|
|
27
27
|
GenericType,
|
28
28
|
GenericTypeExplicitReference,
|
29
29
|
PRIMITIVE_TYPE,
|
30
|
+
PrimitiveType,
|
30
31
|
} from '@finos/legend-graph';
|
31
32
|
import {
|
32
33
|
guaranteeNonNullable,
|
@@ -36,14 +37,13 @@ import {
|
|
36
37
|
} from '@finos/legend-shared';
|
37
38
|
import { QueryBuilderPostFilterOperator } from '../QueryBuilderPostFilterOperator.js';
|
38
39
|
import { buildPostFilterConditionState } from '../QueryBuilderPostFilterStateBuilder.js';
|
39
|
-
import
|
40
|
-
PostFilterConditionState,
|
41
|
-
QueryBuilderPostFilterState,
|
40
|
+
import {
|
41
|
+
type PostFilterConditionState,
|
42
|
+
type QueryBuilderPostFilterState,
|
42
43
|
} from '../QueryBuilderPostFilterState.js';
|
43
44
|
import {
|
44
45
|
buildNotExpression,
|
45
46
|
generateDefaultValueForPrimitiveType,
|
46
|
-
getNonCollectionValueSpecificationType,
|
47
47
|
isTypeCompatibleForAssignment,
|
48
48
|
unwrapNotExpression,
|
49
49
|
} from '../../../../QueryBuilderValueSpecificationHelper.js';
|
@@ -84,12 +84,11 @@ export class QueryBuilderPostFilterOperator_Equal
|
|
84
84
|
isCompatibleWithConditionValue(
|
85
85
|
postFilterConditionState: PostFilterConditionState,
|
86
86
|
): boolean {
|
87
|
-
|
88
|
-
if (valueSpecification) {
|
87
|
+
if (!postFilterConditionState.rightConditionValue.isCollection) {
|
89
88
|
return isTypeCompatibleForAssignment(
|
90
|
-
|
89
|
+
postFilterConditionState.rightConditionValue.type,
|
91
90
|
guaranteeNonNullable(
|
92
|
-
postFilterConditionState.
|
91
|
+
postFilterConditionState.leftConditionValue.getColumnType(),
|
93
92
|
),
|
94
93
|
);
|
95
94
|
}
|
@@ -100,7 +99,7 @@ export class QueryBuilderPostFilterOperator_Equal
|
|
100
99
|
postFilterConditionState: PostFilterConditionState,
|
101
100
|
): ValueSpecification {
|
102
101
|
const propertyType = guaranteeNonNullable(
|
103
|
-
postFilterConditionState.
|
102
|
+
postFilterConditionState.leftConditionValue.getColumnType(),
|
104
103
|
);
|
105
104
|
switch (propertyType.path) {
|
106
105
|
case PRIMITIVE_TYPE.STRING:
|
@@ -170,10 +169,10 @@ export class QueryBuilderPostFilterOperator_Equal
|
|
170
169
|
return buildPostFilterConditionExpression(
|
171
170
|
postFilterConditionState,
|
172
171
|
this,
|
173
|
-
postFilterConditionState.
|
174
|
-
|
175
|
-
postFilterConditionState.
|
176
|
-
|
172
|
+
postFilterConditionState.leftConditionValue.getColumnType() ===
|
173
|
+
PrimitiveType.DATETIME &&
|
174
|
+
postFilterConditionState.rightConditionValue.type !==
|
175
|
+
PrimitiveType.DATETIME
|
177
176
|
? QUERY_BUILDER_SUPPORTED_FUNCTIONS.IS_ON_DAY
|
178
177
|
: QUERY_BUILDER_SUPPORTED_FUNCTIONS.EQUAL,
|
179
178
|
);
|