@finos/legend-query-builder 4.18.2 → 4.18.3

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 (109) hide show
  1. package/lib/components/QueryBuilder.d.ts.map +1 -1
  2. package/lib/components/QueryBuilder.js +0 -1
  3. package/lib/components/QueryBuilder.js.map +1 -1
  4. package/lib/components/fetch-structure/QueryBuilderTDSPanel.d.ts.map +1 -1
  5. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js +5 -3
  6. package/lib/components/fetch-structure/QueryBuilderTDSPanel.js.map +1 -1
  7. package/lib/components/filter/QueryBuilderFilterPanel.d.ts.map +1 -1
  8. package/lib/components/filter/QueryBuilderFilterPanel.js +74 -36
  9. package/lib/components/filter/QueryBuilderFilterPanel.js.map +1 -1
  10. package/lib/components/result/tds/QueryBuilderTDSResultShared.d.ts.map +1 -1
  11. package/lib/components/result/tds/QueryBuilderTDSResultShared.js +5 -3
  12. package/lib/components/result/tds/QueryBuilderTDSResultShared.js.map +1 -1
  13. package/lib/data-access-overview.css +1 -1
  14. package/lib/index.css +0 -16
  15. package/lib/index.d.ts +1 -1
  16. package/lib/index.d.ts.map +1 -1
  17. package/lib/index.js +1 -1
  18. package/lib/index.js.map +1 -1
  19. package/lib/package.json +1 -1
  20. package/lib/stores/QueryBuilderStateBuilder.d.ts +1 -1
  21. package/lib/stores/QueryBuilderStateBuilder.d.ts.map +1 -1
  22. package/lib/stores/QueryBuilderStateBuilder.js +10 -2
  23. package/lib/stores/QueryBuilderStateBuilder.js.map +1 -1
  24. package/lib/stores/QueryBuilderStateHashUtils.d.ts +2 -0
  25. package/lib/stores/QueryBuilderStateHashUtils.d.ts.map +1 -1
  26. package/lib/stores/QueryBuilderStateHashUtils.js +2 -0
  27. package/lib/stores/QueryBuilderStateHashUtils.js.map +1 -1
  28. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.d.ts +98 -0
  29. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.d.ts.map +1 -1
  30. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.js +156 -0
  31. package/lib/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.js.map +1 -1
  32. package/lib/stores/filter/QueryBuilderFilterState.d.ts +50 -4
  33. package/lib/stores/filter/QueryBuilderFilterState.d.ts.map +1 -1
  34. package/lib/stores/filter/QueryBuilderFilterState.js +112 -11
  35. package/lib/stores/filter/QueryBuilderFilterState.js.map +1 -1
  36. package/lib/stores/filter/QueryBuilderFilterStateBuilder.d.ts.map +1 -1
  37. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js +17 -3
  38. package/lib/stores/filter/QueryBuilderFilterStateBuilder.js.map +1 -1
  39. package/lib/stores/filter/operators/QueryBuilderFilterOperatorValueSpecificationBuilder.d.ts +6 -0
  40. package/lib/stores/filter/operators/QueryBuilderFilterOperatorValueSpecificationBuilder.d.ts.map +1 -1
  41. package/lib/stores/filter/operators/QueryBuilderFilterOperatorValueSpecificationBuilder.js +35 -9
  42. package/lib/stores/filter/operators/QueryBuilderFilterOperatorValueSpecificationBuilder.js.map +1 -1
  43. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.d.ts.map +1 -1
  44. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js +2 -4
  45. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Contain.js.map +1 -1
  46. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.d.ts.map +1 -1
  47. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js +2 -4
  48. package/lib/stores/filter/operators/QueryBuilderFilterOperator_EndWith.js.map +1 -1
  49. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.d.ts.map +1 -1
  50. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js +7 -11
  51. package/lib/stores/filter/operators/QueryBuilderFilterOperator_Equal.js.map +1 -1
  52. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.d.ts.map +1 -1
  53. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js +7 -11
  54. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.js.map +1 -1
  55. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.d.ts.map +1 -1
  56. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js +7 -11
  57. package/lib/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.js.map +1 -1
  58. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.d.ts.map +1 -1
  59. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js +3 -6
  60. package/lib/stores/filter/operators/QueryBuilderFilterOperator_In.js.map +1 -1
  61. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts +1 -1
  62. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.d.ts.map +1 -1
  63. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js +5 -3
  64. package/lib/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.js.map +1 -1
  65. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.d.ts.map +1 -1
  66. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js +7 -11
  67. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThan.js.map +1 -1
  68. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.d.ts.map +1 -1
  69. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js +7 -11
  70. package/lib/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.js.map +1 -1
  71. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.d.ts.map +1 -1
  72. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js +2 -4
  73. package/lib/stores/filter/operators/QueryBuilderFilterOperator_StartWith.js.map +1 -1
  74. package/lib/stores/milestoning/QueryBuilderMilestoningState.d.ts.map +1 -1
  75. package/lib/stores/milestoning/QueryBuilderMilestoningState.js +9 -6
  76. package/lib/stores/milestoning/QueryBuilderMilestoningState.js.map +1 -1
  77. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts +1 -2
  78. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.d.ts.map +1 -1
  79. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js +1 -3
  80. package/lib/stores/workflows/accessor/AccessorQueryBuilderState.js.map +1 -1
  81. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts +2 -1
  82. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.d.ts.map +1 -1
  83. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js +36 -6
  84. package/lib/stores/workflows/dataProduct/DataProductQueryBuilderState.js.map +1 -1
  85. package/package.json +5 -5
  86. package/src/components/QueryBuilder.tsx +0 -1
  87. package/src/components/fetch-structure/QueryBuilderTDSPanel.tsx +7 -2
  88. package/src/components/filter/QueryBuilderFilterPanel.tsx +138 -69
  89. package/src/components/result/tds/QueryBuilderTDSResultShared.tsx +4 -1
  90. package/src/index.ts +1 -1
  91. package/src/stores/QueryBuilderStateBuilder.ts +15 -2
  92. package/src/stores/QueryBuilderStateHashUtils.ts +2 -0
  93. package/src/stores/__test-utils__/TEST_DATA__QueryBuilder_Accessors.ts +157 -0
  94. package/src/stores/filter/QueryBuilderFilterState.ts +175 -14
  95. package/src/stores/filter/QueryBuilderFilterStateBuilder.ts +24 -3
  96. package/src/stores/filter/operators/QueryBuilderFilterOperatorValueSpecificationBuilder.ts +55 -24
  97. package/src/stores/filter/operators/QueryBuilderFilterOperator_Contain.ts +2 -5
  98. package/src/stores/filter/operators/QueryBuilderFilterOperator_EndWith.ts +2 -5
  99. package/src/stores/filter/operators/QueryBuilderFilterOperator_Equal.ts +7 -13
  100. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThan.ts +7 -13
  101. package/src/stores/filter/operators/QueryBuilderFilterOperator_GreaterThanEqual.ts +7 -13
  102. package/src/stores/filter/operators/QueryBuilderFilterOperator_In.ts +3 -9
  103. package/src/stores/filter/operators/QueryBuilderFilterOperator_IsEmpty.ts +9 -6
  104. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThan.ts +7 -13
  105. package/src/stores/filter/operators/QueryBuilderFilterOperator_LessThanEqual.ts +7 -13
  106. package/src/stores/filter/operators/QueryBuilderFilterOperator_StartWith.ts +2 -5
  107. package/src/stores/milestoning/QueryBuilderMilestoningState.ts +13 -7
  108. package/src/stores/workflows/accessor/AccessorQueryBuilderState.ts +1 -3
  109. package/src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts +84 -19
@@ -69,10 +69,13 @@ import {
69
69
  isCollectionProperty,
70
70
  type QueryBuilderFilterValueDropTarget,
71
71
  isExistsNodeChild,
72
+ FilterPropertyExpressionSourceState,
73
+ FilterRelationColumnSourceState,
72
74
  } from '../../stores/filter/QueryBuilderFilterState.js';
73
75
  import { useDrag, useDragLayer, useDrop } from 'react-dnd';
74
76
  import {
75
77
  type QueryBuilderExplorerTreeDragSource,
78
+ type QueryBuilderExplorerTreeRelationColumnDragSource,
76
79
  buildPropertyExpressionFromExplorerTreeNodeData,
77
80
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE,
78
81
  } from '../../stores/explorer/QueryBuilderExplorerState.js';
@@ -146,11 +149,13 @@ export const CAN_DROP_MAIN_GROUP_DND_TYPES_FETCH_SUPPORTED = [
146
149
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
147
150
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
148
151
  QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
152
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
149
153
  ];
150
154
 
151
155
  export const CAN_DROP_MAIN_GROUP_DND_TYPES = [
152
156
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
153
157
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
158
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
154
159
  ];
155
160
 
156
161
  export const CAN_DROP_FILTER_NODE_DND_TYPES_FETCH_SUPPORTED = [
@@ -158,12 +163,14 @@ export const CAN_DROP_FILTER_NODE_DND_TYPES_FETCH_SUPPORTED = [
158
163
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
159
164
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
160
165
  QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE,
166
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
161
167
  ];
162
168
 
163
169
  export const CAN_DROP_FILTER_NODE_DND_TYPES = [
164
170
  QUERY_BUILDER_FILTER_DND_TYPE.CONDITION,
165
171
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.ENUM_PROPERTY,
166
172
  QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.PRIMITIVE_PROPERTY,
173
+ QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN,
167
174
  ];
168
175
 
169
176
  export const CAN_DROP_FILTER_VALUE_DND_TYPES = [
@@ -810,9 +817,7 @@ const canDropTypeOntoNodeValue = (
810
817
  condition: FilterConditionState,
811
818
  ): boolean => {
812
819
  const conditionOperator = condition.operator;
813
- const conditionValueType =
814
- condition.propertyExpressionState.propertyExpression.func.value.genericType
815
- .value.rawType;
820
+ const conditionValueType = condition.leftConditionType;
816
821
  return (
817
822
  !(conditionOperator instanceof QueryBuilderFilterOperator_In) &&
818
823
  !(conditionOperator instanceof QueryBuilderFilterOperator_NotIn) &&
@@ -922,9 +927,7 @@ const QueryBuilderFilterConditionEditor = observer(
922
927
  return;
923
928
  }
924
929
  } else {
925
- const conditionValueType =
926
- node.condition.propertyExpressionState.propertyExpression.func.value
927
- .genericType.value.rawType;
930
+ const conditionValueType = node.condition.leftConditionType;
928
931
  applicationStore.notificationService.notifyWarning(
929
932
  `Incompatible parameter type ${itemType?.name}. ${itemType?.name} is not compatible with type ${conditionValueType.name}.`,
930
933
  );
@@ -1041,9 +1044,7 @@ const QueryBuilderFilterConditionEditor = observer(
1041
1044
  graph={graph}
1042
1045
  observerContext={queryBuilderState.observerContext}
1043
1046
  typeCheckOption={{
1044
- expectedType:
1045
- node.condition.propertyExpressionState.propertyExpression
1046
- .func.value.genericType.value.rawType,
1047
+ expectedType: node.condition.leftConditionType,
1047
1048
  }}
1048
1049
  resetValue={resetNode}
1049
1050
  selectorSearchConfig={selectorConfig}
@@ -1097,9 +1098,18 @@ const QueryBuilderFilterConditionEditor = observer(
1097
1098
  >
1098
1099
  <div className="query-builder-filter-tree__condition-node">
1099
1100
  <div className="query-builder-filter-tree__condition-node__property">
1100
- <QueryBuilderPropertyExpressionBadge
1101
- propertyExpressionState={node.condition.propertyExpressionState}
1102
- />
1101
+ {node.condition.sourceState instanceof
1102
+ FilterPropertyExpressionSourceState ? (
1103
+ <QueryBuilderPropertyExpressionBadge
1104
+ propertyExpressionState={
1105
+ node.condition.sourceState.propertyExpressionState
1106
+ }
1107
+ />
1108
+ ) : (
1109
+ <div className="query-builder-filter-tree__condition-node__property__label">
1110
+ {node.condition.sourceState.label}
1111
+ </div>
1112
+ )}
1103
1113
  </div>
1104
1114
  <ControlledDropdownMenu
1105
1115
  className="query-builder-filter-tree__condition-node__operator"
@@ -1260,36 +1270,50 @@ const QueryBuilderFilterTreeNodeContainer = observer(
1260
1270
  } else {
1261
1271
  let filterConditionState: FilterConditionState;
1262
1272
  try {
1263
- let propertyExpression;
1264
- if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
1265
- if (
1266
- (item as QueryBuilderProjectionColumnDragSource)
1267
- .columnState instanceof
1268
- QueryBuilderSimpleProjectionColumnState
1269
- ) {
1270
- propertyExpression = cloneAbstractPropertyExpression(
1271
- (
1272
- (item as QueryBuilderProjectionColumnDragSource)
1273
- .columnState as QueryBuilderSimpleProjectionColumnState
1274
- ).propertyExpressionState.propertyExpression,
1275
- queryBuilderState.observerContext,
1276
- );
1273
+ if (type === QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN) {
1274
+ const columnNode = (
1275
+ item as QueryBuilderExplorerTreeRelationColumnDragSource
1276
+ ).node;
1277
+ const sourceState = new FilterRelationColumnSourceState(
1278
+ columnNode.column.name,
1279
+ columnNode.type,
1280
+ );
1281
+ filterConditionState = new FilterConditionState(
1282
+ filterState,
1283
+ sourceState,
1284
+ );
1285
+ } else {
1286
+ let propertyExpression;
1287
+ if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
1288
+ if (
1289
+ (item as QueryBuilderProjectionColumnDragSource)
1290
+ .columnState instanceof
1291
+ QueryBuilderSimpleProjectionColumnState
1292
+ ) {
1293
+ propertyExpression = cloneAbstractPropertyExpression(
1294
+ (
1295
+ (item as QueryBuilderProjectionColumnDragSource)
1296
+ .columnState as QueryBuilderSimpleProjectionColumnState
1297
+ ).propertyExpressionState.propertyExpression,
1298
+ queryBuilderState.observerContext,
1299
+ );
1300
+ } else {
1301
+ throw new UnsupportedOperationError(
1302
+ `Dragging and Dropping derivation projection column is not supported.`,
1303
+ );
1304
+ }
1277
1305
  } else {
1278
- throw new UnsupportedOperationError(
1279
- `Dragging and Dropping derivation projection column is not supported.`,
1280
- );
1306
+ propertyExpression =
1307
+ buildPropertyExpressionFromExplorerTreeNodeData(
1308
+ (item as QueryBuilderExplorerTreeDragSource).node,
1309
+ filterState.queryBuilderState.explorerState,
1310
+ );
1281
1311
  }
1282
- } else {
1283
- propertyExpression =
1284
- buildPropertyExpressionFromExplorerTreeNodeData(
1285
- (item as QueryBuilderExplorerTreeDragSource).node,
1286
- filterState.queryBuilderState.explorerState,
1287
- );
1312
+ filterConditionState = new FilterConditionState(
1313
+ filterState,
1314
+ propertyExpression,
1315
+ );
1288
1316
  }
1289
- filterConditionState = new FilterConditionState(
1290
- filterState,
1291
- propertyExpression,
1292
- );
1293
1317
  } catch (error) {
1294
1318
  assertErrorThrown(error);
1295
1319
  applicationStore.notificationService.notifyWarning(error.message);
@@ -1300,11 +1324,34 @@ const QueryBuilderFilterTreeNodeContainer = observer(
1300
1324
  node instanceof QueryBuilderFilterTreeConditionNodeData ||
1301
1325
  node instanceof QueryBuilderFilterTreeBlankConditionNodeData
1302
1326
  ) {
1303
- buildFilterTree(
1304
- filterConditionState.propertyExpressionState.propertyExpression,
1305
- filterState,
1306
- node,
1307
- );
1327
+ if (
1328
+ filterConditionState.sourceState instanceof
1329
+ FilterRelationColumnSourceState
1330
+ ) {
1331
+ // Relation columns don't support exists handling, just add directly
1332
+ const treeNode = new QueryBuilderFilterTreeConditionNodeData(
1333
+ undefined,
1334
+ filterConditionState,
1335
+ );
1336
+ treeNode.setIsNewlyAdded(true);
1337
+ if (
1338
+ node instanceof QueryBuilderFilterTreeBlankConditionNodeData
1339
+ ) {
1340
+ filterState.replaceBlankNodeWithNode(treeNode, node);
1341
+ } else if (
1342
+ node instanceof QueryBuilderFilterTreeConditionNodeData
1343
+ ) {
1344
+ filterState.newGroupWithConditionFromNode(treeNode, node);
1345
+ } else {
1346
+ filterState.addNodeFromNode(treeNode, node);
1347
+ }
1348
+ } else {
1349
+ buildFilterTree(
1350
+ filterConditionState.propertyExpressionState.propertyExpression,
1351
+ filterState,
1352
+ node,
1353
+ );
1354
+ }
1308
1355
  }
1309
1356
  }
1310
1357
  },
@@ -1652,34 +1699,56 @@ export const QueryBuilderFilterPanel = observer(
1652
1699
  const handleDrop = useCallback(
1653
1700
  (item: QueryBuilderFilterNodeDropTarget, type: string): void => {
1654
1701
  try {
1655
- let propertyExpression;
1656
- if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
1657
- if (
1658
- (item as QueryBuilderProjectionColumnDragSource)
1659
- .columnState instanceof QueryBuilderSimpleProjectionColumnState
1660
- ) {
1661
- propertyExpression = cloneAbstractPropertyExpression(
1662
- (
1663
- (item as QueryBuilderProjectionColumnDragSource)
1664
- .columnState as QueryBuilderSimpleProjectionColumnState
1665
- ).propertyExpressionState.propertyExpression,
1666
- queryBuilderState.observerContext,
1667
- );
1702
+ if (type === QUERY_BUILDER_EXPLORER_TREE_DND_TYPE.RELATION_COLUMN) {
1703
+ const columnNode = (
1704
+ item as QueryBuilderExplorerTreeRelationColumnDragSource
1705
+ ).node;
1706
+ const sourceState = new FilterRelationColumnSourceState(
1707
+ columnNode.column.name,
1708
+ columnNode.type,
1709
+ );
1710
+ const filterConditionState = new FilterConditionState(
1711
+ filterState,
1712
+ sourceState,
1713
+ );
1714
+ const treeNode = new QueryBuilderFilterTreeConditionNodeData(
1715
+ undefined,
1716
+ filterConditionState,
1717
+ );
1718
+ treeNode.setIsNewlyAdded(true);
1719
+ filterState.setSelectedNode(undefined);
1720
+ filterState.addNodeFromNode(treeNode, undefined);
1721
+ } else {
1722
+ let propertyExpression;
1723
+ if (type === QUERY_BUILDER_PROJECTION_COLUMN_DND_TYPE) {
1724
+ if (
1725
+ (item as QueryBuilderProjectionColumnDragSource)
1726
+ .columnState instanceof
1727
+ QueryBuilderSimpleProjectionColumnState
1728
+ ) {
1729
+ propertyExpression = cloneAbstractPropertyExpression(
1730
+ (
1731
+ (item as QueryBuilderProjectionColumnDragSource)
1732
+ .columnState as QueryBuilderSimpleProjectionColumnState
1733
+ ).propertyExpressionState.propertyExpression,
1734
+ queryBuilderState.observerContext,
1735
+ );
1736
+ } else {
1737
+ throw new UnsupportedOperationError(
1738
+ `Dragging and Dropping derivation projection column is not supported.`,
1739
+ );
1740
+ }
1668
1741
  } else {
1669
- throw new UnsupportedOperationError(
1670
- `Dragging and Dropping derivation projection column is not supported.`,
1671
- );
1742
+ propertyExpression =
1743
+ buildPropertyExpressionFromExplorerTreeNodeData(
1744
+ (item as QueryBuilderExplorerTreeDragSource).node,
1745
+ filterState.queryBuilderState.explorerState,
1746
+ );
1672
1747
  }
1673
- } else {
1674
- propertyExpression =
1675
- buildPropertyExpressionFromExplorerTreeNodeData(
1676
- (item as QueryBuilderExplorerTreeDragSource).node,
1677
- filterState.queryBuilderState.explorerState,
1678
- );
1748
+ // NOTE: unfocus the current node when DnD a new node to the tree
1749
+ filterState.setSelectedNode(undefined);
1750
+ buildFilterTree(propertyExpression, filterState);
1679
1751
  }
1680
- // NOTE: unfocus the current node when DnD a new node to the tree
1681
- filterState.setSelectedNode(undefined);
1682
- buildFilterTree(propertyExpression, filterState);
1683
1752
  } catch (error) {
1684
1753
  assertErrorThrown(error);
1685
1754
  applicationStore.notificationService.notifyWarning(error.message);
@@ -88,6 +88,7 @@ import {
88
88
  FilterValueSpecConditionValueState,
89
89
  isCollectionProperty,
90
90
  QueryBuilderFilterTreeConditionNodeData,
91
+ FilterPropertyExpressionSourceState,
91
92
  } from '../../../stores/filter/QueryBuilderFilterState.js';
92
93
  import { QueryBuilderAggregateColumnState } from '../../../stores/fetch-structure/tds/aggregation/QueryBuilderAggregationState.js';
93
94
  import type { QueryBuilderFilterOperator } from '../../../stores/filter/QueryBuilderFilterOperator.js';
@@ -188,7 +189,9 @@ const getExistingFilterNode = (
188
189
  .filter(filterByType(QueryBuilderFilterTreeConditionNodeData))
189
190
  .filter(
190
191
  (node) =>
191
- node.condition.propertyExpressionState.path ===
192
+ node.condition.sourceState instanceof
193
+ FilterPropertyExpressionSourceState &&
194
+ node.condition.sourceState.propertyExpressionState.path ===
192
195
  propertyExpressionState?.path &&
193
196
  operators
194
197
  .map((op) => op.getLabel())
package/src/index.ts CHANGED
@@ -67,7 +67,7 @@ export {
67
67
  type ModelAccessPointGroupOption,
68
68
  buildModelAccessPointGroupOption,
69
69
  type ExecutionIdOption,
70
- buildDataProductAccessor,
70
+ resolveDataProductAccessor,
71
71
  NativeModelDataProductExecutionState,
72
72
  ModelAccessPointDataProductExecutionState,
73
73
  LakehouseDataProductExecutionState,
@@ -55,7 +55,7 @@ import {
55
55
  PackageableElementExplicitReference,
56
56
  MILESTONING_STEREOTYPE,
57
57
  type ColSpecInstanceValue,
58
- type AccessorInstanceValue,
58
+ AccessorInstanceValue,
59
59
  RelationColumn,
60
60
  } from '@finos/legend-graph';
61
61
  import { processTDSPostFilterExpression } from './fetch-structure/tds/post-filter/QueryBuilderPostFilterStateBuilder.js';
@@ -606,8 +606,21 @@ export class QueryBuilderValueSpecificationProcessor
606
606
  );
607
607
 
608
608
  // check preceding expression
609
+ // For accessor queries, the preceding expression is an AccessorInstanceValue (table reference),
610
+ // not a SimpleFunctionExpression
611
+ const precedingValueSpec = valueSpecification.parametersValues[0];
612
+ if (precedingValueSpec instanceof AccessorInstanceValue) {
613
+ QueryBuilderValueSpecificationProcessor.process(
614
+ precedingValueSpec,
615
+ this.parentLambda,
616
+ this.queryBuilderState,
617
+ );
618
+ processFilterExpression(valueSpecification, this.queryBuilderState);
619
+ return;
620
+ }
621
+
609
622
  const precedingExpression = guaranteeType(
610
- valueSpecification.parametersValues[0],
623
+ precedingValueSpec,
611
624
  SimpleFunctionExpression,
612
625
  `Can't process filter() expression: only support filter() immediately following an expression`,
613
626
  );
@@ -94,6 +94,8 @@ export enum QUERY_BUILDER_STATE_HASH_STRUCTURE {
94
94
  FILTER_TREE_CONDIITION_NODE_DATA = 'FILTER_TREE_CONDITION_NODE_DATA',
95
95
  FILTER_TREE_BLANK_CONDITION_NODE_DATA = 'FILTER_TREE_BLANK_CONDITION_NODE_DATA',
96
96
  FILTER_CONDITION_STATE = 'FILTER_CONDITION_STATE',
97
+ FILTER_CONDITION_SOURCE_PROPERTY_EXPRESSION = 'FILTER_CONDITION_SOURCE_PROPERTY_EXPRESSION',
98
+ FILTER_CONDITION_SOURCE_RELATION_COLUMN = 'FILTER_CONDITION_SOURCE_RELATION_COLUMN',
97
99
  FILTER_CONDITION_RIGHT_VALUE = 'FILTER_CONDITION_RIGHT_VALUE',
98
100
  FILTER_CONDITION_RIGHT_VALUE_SPEC = 'FILTER_CONDITION_RIGHT_VALUE_SPEC',
99
101
  FILTER_OPERATOR_CONTAIN = 'FILTER_OPERATOR_CONTAIN',
@@ -14,6 +14,163 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ export const TEST_DATA__QueryBuilder_Accessors_SimpleProjection_WithFilter = {
18
+ _type: 'lambda',
19
+ body: [
20
+ {
21
+ _type: 'func',
22
+ function: 'from',
23
+ parameters: [
24
+ {
25
+ _type: 'func',
26
+ function: 'project',
27
+ parameters: [
28
+ {
29
+ _type: 'func',
30
+ function: 'filter',
31
+ parameters: [
32
+ {
33
+ _type: 'classInstance',
34
+ multiplicity: {
35
+ lowerBound: 1,
36
+ upperBound: 1,
37
+ },
38
+ type: '>',
39
+ value: {
40
+ path: ['database::TestDatabase', 'default', 'TEST0'],
41
+ },
42
+ },
43
+ {
44
+ _type: 'lambda',
45
+ body: [
46
+ {
47
+ _type: 'func',
48
+ function: 'and',
49
+ parameters: [
50
+ {
51
+ _type: 'func',
52
+ function: 'equal',
53
+ parameters: [
54
+ {
55
+ _type: 'property',
56
+ parameters: [
57
+ {
58
+ _type: 'var',
59
+ name: 'x',
60
+ },
61
+ ],
62
+ property: 'FIRSTNAME',
63
+ },
64
+ {
65
+ _type: 'string',
66
+ value: 'John',
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ _type: 'func',
72
+ function: 'equal',
73
+ parameters: [
74
+ {
75
+ _type: 'property',
76
+ parameters: [
77
+ {
78
+ _type: 'var',
79
+ name: 'x',
80
+ },
81
+ ],
82
+ property: 'LASTNAME',
83
+ },
84
+ {
85
+ _type: 'string',
86
+ value: 'Doe',
87
+ },
88
+ ],
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ parameters: [
94
+ {
95
+ _type: 'var',
96
+ name: 'x',
97
+ },
98
+ ],
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ _type: 'classInstance',
104
+ multiplicity: {
105
+ lowerBound: 1,
106
+ upperBound: 1,
107
+ },
108
+ type: 'colSpecArray',
109
+ value: {
110
+ colSpecs: [
111
+ {
112
+ function1: {
113
+ _type: 'lambda',
114
+ body: [
115
+ {
116
+ _type: 'property',
117
+ parameters: [
118
+ {
119
+ _type: 'var',
120
+ name: 'x',
121
+ },
122
+ ],
123
+ property: 'FIRSTNAME',
124
+ },
125
+ ],
126
+ parameters: [
127
+ {
128
+ _type: 'var',
129
+ name: 'x',
130
+ },
131
+ ],
132
+ },
133
+ name: 'Firstname',
134
+ },
135
+ {
136
+ function1: {
137
+ _type: 'lambda',
138
+ body: [
139
+ {
140
+ _type: 'property',
141
+ parameters: [
142
+ {
143
+ _type: 'var',
144
+ name: 'x',
145
+ },
146
+ ],
147
+ property: 'LASTNAME',
148
+ },
149
+ ],
150
+ parameters: [
151
+ {
152
+ _type: 'var',
153
+ name: 'x',
154
+ },
155
+ ],
156
+ },
157
+ name: 'Lastname',
158
+ },
159
+ ],
160
+ },
161
+ },
162
+ ],
163
+ },
164
+ {
165
+ _type: 'packageableElementPtr',
166
+ fullPath: 'runtime::TestRuntime',
167
+ },
168
+ ],
169
+ },
170
+ ],
171
+ parameters: [],
172
+ };
173
+
17
174
  export const TEST_DATA__QueryBuilder_Accessors_SimpleProjection_WithPostFilter =
18
175
  {
19
176
  _type: 'lambda',