@platforma-sdk/model 1.53.15 → 1.54.8

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 (135) hide show
  1. package/dist/annotations/converter.cjs +8 -32
  2. package/dist/annotations/converter.cjs.map +1 -1
  3. package/dist/annotations/converter.d.ts.map +1 -1
  4. package/dist/annotations/converter.js +7 -31
  5. package/dist/annotations/converter.js.map +1 -1
  6. package/dist/block_model.cjs +1 -0
  7. package/dist/block_model.cjs.map +1 -1
  8. package/dist/block_model.d.ts.map +1 -1
  9. package/dist/block_model.js +1 -0
  10. package/dist/block_model.js.map +1 -1
  11. package/dist/builder.cjs +1 -0
  12. package/dist/builder.cjs.map +1 -1
  13. package/dist/builder.d.ts.map +1 -1
  14. package/dist/builder.js +1 -0
  15. package/dist/builder.js.map +1 -1
  16. package/dist/components/PlDataTable/index.d.ts +5 -0
  17. package/dist/components/PlDataTable/index.d.ts.map +1 -0
  18. package/dist/components/PlDataTable/labels.cjs +91 -0
  19. package/dist/components/PlDataTable/labels.cjs.map +1 -0
  20. package/dist/components/PlDataTable/labels.d.ts +7 -0
  21. package/dist/components/PlDataTable/labels.d.ts.map +1 -0
  22. package/dist/components/PlDataTable/labels.js +88 -0
  23. package/dist/components/PlDataTable/labels.js.map +1 -0
  24. package/dist/components/PlDataTable/state-migration.cjs +162 -0
  25. package/dist/components/PlDataTable/state-migration.cjs.map +1 -0
  26. package/dist/components/PlDataTable/state-migration.d.ts +94 -0
  27. package/dist/components/PlDataTable/state-migration.d.ts.map +1 -0
  28. package/dist/components/PlDataTable/state-migration.js +158 -0
  29. package/dist/components/PlDataTable/state-migration.js.map +1 -0
  30. package/dist/components/PlDataTable/table.cjs +187 -0
  31. package/dist/components/PlDataTable/table.cjs.map +1 -0
  32. package/dist/components/PlDataTable/table.d.ts +26 -0
  33. package/dist/components/PlDataTable/table.d.ts.map +1 -0
  34. package/dist/components/PlDataTable/table.js +183 -0
  35. package/dist/components/PlDataTable/table.js.map +1 -0
  36. package/dist/components/PlDataTable/v4.d.ts +157 -0
  37. package/dist/components/PlDataTable/v4.d.ts.map +1 -0
  38. package/dist/components/PlDataTable/v5.d.ts +114 -0
  39. package/dist/components/PlDataTable/v5.d.ts.map +1 -0
  40. package/dist/filters/converters/filterToQuery.cjs +244 -0
  41. package/dist/filters/converters/filterToQuery.cjs.map +1 -0
  42. package/dist/filters/converters/filterToQuery.d.ts +4 -0
  43. package/dist/filters/converters/filterToQuery.d.ts.map +1 -0
  44. package/dist/filters/converters/filterToQuery.js +242 -0
  45. package/dist/filters/converters/filterToQuery.js.map +1 -0
  46. package/dist/filters/{converter.cjs → converters/filterUiToExpressionImpl.cjs} +3 -2
  47. package/dist/filters/converters/filterUiToExpressionImpl.cjs.map +1 -0
  48. package/dist/filters/{converter.d.ts → converters/filterUiToExpressionImpl.d.ts} +2 -2
  49. package/dist/filters/converters/filterUiToExpressionImpl.d.ts.map +1 -0
  50. package/dist/filters/{converter.js → converters/filterUiToExpressionImpl.js} +3 -2
  51. package/dist/filters/converters/filterUiToExpressionImpl.js.map +1 -0
  52. package/dist/filters/converters/index.d.ts +3 -0
  53. package/dist/filters/converters/index.d.ts.map +1 -0
  54. package/dist/filters/distill.cjs +61 -0
  55. package/dist/filters/distill.cjs.map +1 -0
  56. package/dist/filters/distill.d.ts +7 -0
  57. package/dist/filters/distill.d.ts.map +1 -0
  58. package/dist/filters/distill.js +59 -0
  59. package/dist/filters/distill.js.map +1 -0
  60. package/dist/filters/index.d.ts +2 -1
  61. package/dist/filters/index.d.ts.map +1 -1
  62. package/dist/filters/types.d.ts +1 -117
  63. package/dist/filters/types.d.ts.map +1 -1
  64. package/dist/index.cjs +17 -15
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.js +5 -2
  67. package/dist/index.js.map +1 -1
  68. package/dist/package.json.cjs +1 -1
  69. package/dist/package.json.js +1 -1
  70. package/dist/pframe_utils/columns.cjs +2 -0
  71. package/dist/pframe_utils/columns.cjs.map +1 -1
  72. package/dist/pframe_utils/columns.js +2 -0
  73. package/dist/pframe_utils/columns.js.map +1 -1
  74. package/dist/pframe_utils/index.cjs +2 -0
  75. package/dist/pframe_utils/index.cjs.map +1 -1
  76. package/dist/pframe_utils/index.js +2 -0
  77. package/dist/pframe_utils/index.js.map +1 -1
  78. package/dist/pframe_utils/querySpec.d.ts +2 -0
  79. package/dist/pframe_utils/querySpec.d.ts.map +1 -0
  80. package/dist/render/api.cjs +7 -0
  81. package/dist/render/api.cjs.map +1 -1
  82. package/dist/render/api.d.ts +3 -2
  83. package/dist/render/api.d.ts.map +1 -1
  84. package/dist/render/api.js +8 -1
  85. package/dist/render/api.js.map +1 -1
  86. package/dist/render/future.d.ts +1 -1
  87. package/dist/render/index.d.ts +2 -1
  88. package/dist/render/index.d.ts.map +1 -1
  89. package/dist/render/internal.cjs.map +1 -1
  90. package/dist/render/internal.d.ts +4 -1
  91. package/dist/render/internal.d.ts.map +1 -1
  92. package/dist/render/internal.js.map +1 -1
  93. package/dist/render/util/column_collection.cjs.map +1 -1
  94. package/dist/render/util/column_collection.d.ts +1 -1
  95. package/dist/render/util/column_collection.d.ts.map +1 -1
  96. package/dist/render/util/column_collection.js.map +1 -1
  97. package/dist/render/util/pcolumn_data.cjs.map +1 -1
  98. package/dist/render/util/pcolumn_data.d.ts +1 -1
  99. package/dist/render/util/pcolumn_data.d.ts.map +1 -1
  100. package/dist/render/util/pcolumn_data.js.map +1 -1
  101. package/package.json +8 -6
  102. package/src/annotations/converter.ts +12 -40
  103. package/src/block_model.ts +1 -0
  104. package/src/builder.ts +1 -0
  105. package/src/components/PlDataTable/index.ts +24 -0
  106. package/src/components/PlDataTable/labels.ts +101 -0
  107. package/src/components/PlDataTable/state-migration.ts +285 -0
  108. package/src/components/PlDataTable/table.ts +278 -0
  109. package/src/components/PlDataTable/v4.ts +193 -0
  110. package/src/components/PlDataTable/v5.ts +140 -0
  111. package/src/filters/converters/filterToQuery.test.ts +417 -0
  112. package/src/filters/converters/filterToQuery.ts +258 -0
  113. package/src/filters/{converter.test.ts → converters/filterUiToExpressionImpl.test.ts} +2 -2
  114. package/src/filters/{converter.ts → converters/filterUiToExpressionImpl.ts} +3 -2
  115. package/src/filters/converters/index.ts +2 -0
  116. package/src/filters/distill.test.ts +191 -0
  117. package/src/filters/distill.ts +67 -0
  118. package/src/filters/index.ts +2 -1
  119. package/src/filters/types.ts +7 -48
  120. package/src/pframe_utils/querySpec.ts +1 -0
  121. package/src/render/api.ts +13 -6
  122. package/src/render/index.ts +2 -1
  123. package/src/render/internal.ts +11 -0
  124. package/src/render/util/column_collection.ts +1 -1
  125. package/src/render/util/pcolumn_data.ts +1 -1
  126. package/dist/components/PlDataTable.cjs +0 -307
  127. package/dist/components/PlDataTable.cjs.map +0 -1
  128. package/dist/components/PlDataTable.d.ts +0 -366
  129. package/dist/components/PlDataTable.d.ts.map +0 -1
  130. package/dist/components/PlDataTable.js +0 -297
  131. package/dist/components/PlDataTable.js.map +0 -1
  132. package/dist/filters/converter.cjs.map +0 -1
  133. package/dist/filters/converter.d.ts.map +0 -1
  134. package/dist/filters/converter.js.map +0 -1
  135. package/src/components/PlDataTable.ts +0 -794
@@ -0,0 +1,242 @@
1
+ import { assertNever } from '@milaboratories/pl-model-common';
2
+
3
+ /** Parses a CanonicalizedJson<PTableColumnId> string into a SpecQueryExpression reference. */
4
+ function resolveColumnRef(columnStr) {
5
+ const parsed = JSON.parse(columnStr);
6
+ if (parsed.type === "axis") {
7
+ return { type: "axisRef", value: parsed.id };
8
+ }
9
+ return { type: "columnRef", value: parsed.id };
10
+ }
11
+ /** Converts a FilterSpec tree into a SpecQueryExpression. */
12
+ function filterSpecToSpecQueryExpr(filter) {
13
+ switch (filter.type) {
14
+ case "and":
15
+ case "or": {
16
+ const inputs = filter.filters
17
+ .filter((f) => f.type !== undefined)
18
+ .map(filterSpecToSpecQueryExpr);
19
+ if (inputs.length === 0) {
20
+ throw new Error(`${filter.type.toUpperCase()} filter requires at least one operand`);
21
+ }
22
+ return { type: filter.type, input: inputs };
23
+ }
24
+ case "not":
25
+ return { type: "not", input: filterSpecToSpecQueryExpr(filter.filter) };
26
+ case "patternEquals":
27
+ return {
28
+ type: "stringEquals",
29
+ input: resolveColumnRef(filter.column),
30
+ value: filter.value,
31
+ caseInsensitive: false,
32
+ };
33
+ case "patternNotEquals":
34
+ return {
35
+ type: "not",
36
+ input: {
37
+ type: "stringEquals",
38
+ input: resolveColumnRef(filter.column),
39
+ value: filter.value,
40
+ caseInsensitive: false,
41
+ },
42
+ };
43
+ case "patternContainSubsequence":
44
+ return {
45
+ type: "stringContains",
46
+ input: resolveColumnRef(filter.column),
47
+ value: filter.value,
48
+ caseInsensitive: false,
49
+ };
50
+ case "patternNotContainSubsequence":
51
+ return {
52
+ type: "not",
53
+ input: {
54
+ type: "stringContains",
55
+ input: resolveColumnRef(filter.column),
56
+ value: filter.value,
57
+ caseInsensitive: false,
58
+ },
59
+ };
60
+ case "patternMatchesRegularExpression":
61
+ return {
62
+ type: "stringRegex",
63
+ input: resolveColumnRef(filter.column),
64
+ value: filter.value,
65
+ };
66
+ case "patternFuzzyContainSubsequence":
67
+ return {
68
+ type: "stringContainsFuzzy",
69
+ input: resolveColumnRef(filter.column),
70
+ value: filter.value,
71
+ maxEdits: filter.maxEdits ?? 1,
72
+ caseInsensitive: false,
73
+ substitutionsOnly: filter.substitutionsOnly ?? false,
74
+ wildcard: filter.wildcard ?? null,
75
+ };
76
+ case "equal":
77
+ return {
78
+ type: "numericComparison",
79
+ operand: "eq",
80
+ left: resolveColumnRef(filter.column),
81
+ right: { type: "constant", value: filter.x },
82
+ };
83
+ case "notEqual":
84
+ return {
85
+ type: "numericComparison",
86
+ operand: "ne",
87
+ left: resolveColumnRef(filter.column),
88
+ right: { type: "constant", value: filter.x },
89
+ };
90
+ case "lessThan":
91
+ return {
92
+ type: "numericComparison",
93
+ operand: "lt",
94
+ left: resolveColumnRef(filter.column),
95
+ right: { type: "constant", value: filter.x },
96
+ };
97
+ case "greaterThan":
98
+ return {
99
+ type: "numericComparison",
100
+ operand: "gt",
101
+ left: resolveColumnRef(filter.column),
102
+ right: { type: "constant", value: filter.x },
103
+ };
104
+ case "lessThanOrEqual":
105
+ return {
106
+ type: "numericComparison",
107
+ operand: "le",
108
+ left: resolveColumnRef(filter.column),
109
+ right: { type: "constant", value: filter.x },
110
+ };
111
+ case "greaterThanOrEqual":
112
+ return {
113
+ type: "numericComparison",
114
+ operand: "ge",
115
+ left: resolveColumnRef(filter.column),
116
+ right: { type: "constant", value: filter.x },
117
+ };
118
+ case "equalToColumn":
119
+ return {
120
+ type: "numericComparison",
121
+ operand: "eq",
122
+ left: resolveColumnRef(filter.column),
123
+ right: resolveColumnRef(filter.rhs),
124
+ };
125
+ case "lessThanColumn": {
126
+ const left = resolveColumnRef(filter.column);
127
+ const right = resolveColumnRef(filter.rhs);
128
+ if (filter.minDiff !== undefined && filter.minDiff !== 0) {
129
+ return {
130
+ type: "numericComparison",
131
+ operand: "lt",
132
+ left: {
133
+ type: "numericBinary",
134
+ operand: "add",
135
+ left,
136
+ right: { type: "constant", value: filter.minDiff },
137
+ },
138
+ right,
139
+ };
140
+ }
141
+ return { type: "numericComparison", operand: "lt", left, right };
142
+ }
143
+ case "greaterThanColumn": {
144
+ const left = resolveColumnRef(filter.column);
145
+ const right = resolveColumnRef(filter.rhs);
146
+ if (filter.minDiff !== undefined && filter.minDiff !== 0) {
147
+ return {
148
+ type: "numericComparison",
149
+ operand: "gt",
150
+ left: {
151
+ type: "numericBinary",
152
+ operand: "add",
153
+ left,
154
+ right: { type: "constant", value: filter.minDiff },
155
+ },
156
+ right,
157
+ };
158
+ }
159
+ return { type: "numericComparison", operand: "gt", left, right };
160
+ }
161
+ case "lessThanColumnOrEqual": {
162
+ const left = resolveColumnRef(filter.column);
163
+ const right = resolveColumnRef(filter.rhs);
164
+ if (filter.minDiff !== undefined && filter.minDiff !== 0) {
165
+ return {
166
+ type: "numericComparison",
167
+ operand: "le",
168
+ left: {
169
+ type: "numericBinary",
170
+ operand: "add",
171
+ left,
172
+ right: { type: "constant", value: filter.minDiff },
173
+ },
174
+ right,
175
+ };
176
+ }
177
+ return { type: "numericComparison", operand: "le", left, right };
178
+ }
179
+ case "greaterThanColumnOrEqual": {
180
+ const left = resolveColumnRef(filter.column);
181
+ const right = resolveColumnRef(filter.rhs);
182
+ if (filter.minDiff !== undefined && filter.minDiff !== 0) {
183
+ return {
184
+ type: "numericComparison",
185
+ operand: "ge",
186
+ left: {
187
+ type: "numericBinary",
188
+ operand: "add",
189
+ left,
190
+ right: { type: "constant", value: filter.minDiff },
191
+ },
192
+ right,
193
+ };
194
+ }
195
+ return { type: "numericComparison", operand: "ge", left, right };
196
+ }
197
+ case "inSet":
198
+ return {
199
+ type: "isIn",
200
+ input: resolveColumnRef(filter.column),
201
+ set: filter.value,
202
+ };
203
+ case "notInSet":
204
+ return {
205
+ type: "not",
206
+ input: {
207
+ type: "isIn",
208
+ input: resolveColumnRef(filter.column),
209
+ set: filter.value,
210
+ },
211
+ };
212
+ case "isNA":
213
+ return {
214
+ type: "isNull",
215
+ input: resolveColumnRef(filter.column),
216
+ };
217
+ case "isNotNA":
218
+ return {
219
+ type: "not",
220
+ input: {
221
+ type: "isNull",
222
+ input: resolveColumnRef(filter.column),
223
+ },
224
+ };
225
+ case "ifNa":
226
+ return {
227
+ type: "ifNull",
228
+ input: resolveColumnRef(filter.column),
229
+ replacement: { type: "constant", value: filter.replacement },
230
+ };
231
+ case "topN":
232
+ case "bottomN":
233
+ throw new Error(`Filter type "${filter.type}" is not supported in query expressions`);
234
+ case undefined:
235
+ throw new Error("Filter type is undefined");
236
+ default:
237
+ assertNever(filter);
238
+ }
239
+ }
240
+
241
+ export { filterSpecToSpecQueryExpr };
242
+ //# sourceMappingURL=filterToQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterToQuery.js","sources":["../../../src/filters/converters/filterToQuery.ts"],"sourcesContent":["import { assertNever } from \"@milaboratories/pl-model-common\";\nimport type {\n FilterSpec,\n FilterSpecLeaf,\n PTableColumnId,\n SingleAxisSelector,\n SpecQueryExpression,\n} from \"@milaboratories/pl-model-common\";\n\n/** Parses a CanonicalizedJson<PTableColumnId> string into a SpecQueryExpression reference. */\nfunction resolveColumnRef(columnStr: string): SpecQueryExpression {\n const parsed = JSON.parse(columnStr) as PTableColumnId;\n if (parsed.type === \"axis\") {\n return { type: \"axisRef\", value: parsed.id as SingleAxisSelector };\n }\n return { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr(\n filter: FilterSpec<FilterSpecLeaf<string>>,\n): SpecQueryExpression {\n switch (filter.type) {\n case \"and\":\n case \"or\": {\n const inputs = filter.filters\n .filter((f) => f.type !== undefined)\n .map(filterSpecToSpecQueryExpr);\n if (inputs.length === 0) {\n throw new Error(`${filter.type.toUpperCase()} filter requires at least one operand`);\n }\n return { type: filter.type, input: inputs };\n }\n case \"not\":\n return { type: \"not\", input: filterSpecToSpecQueryExpr(filter.filter) };\n\n case \"patternEquals\":\n return {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotEquals\":\n return {\n type: \"not\",\n input: {\n type: \"stringEquals\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternContainSubsequence\":\n return {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n };\n case \"patternNotContainSubsequence\":\n return {\n type: \"not\",\n input: {\n type: \"stringContains\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n caseInsensitive: false,\n },\n };\n case \"patternMatchesRegularExpression\":\n return {\n type: \"stringRegex\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n };\n case \"patternFuzzyContainSubsequence\":\n return {\n type: \"stringContainsFuzzy\",\n input: resolveColumnRef(filter.column),\n value: filter.value,\n maxEdits: filter.maxEdits ?? 1,\n caseInsensitive: false,\n substitutionsOnly: filter.substitutionsOnly ?? false,\n wildcard: filter.wildcard ?? null,\n };\n\n case \"equal\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"notEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ne\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThan\":\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThan\":\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"lessThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n case \"greaterThanOrEqual\":\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: resolveColumnRef(filter.column),\n right: { type: \"constant\", value: filter.x },\n };\n\n case \"equalToColumn\":\n return {\n type: \"numericComparison\",\n operand: \"eq\",\n left: resolveColumnRef(filter.column),\n right: resolveColumnRef(filter.rhs),\n };\n case \"lessThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"lt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"lt\", left, right };\n }\n case \"greaterThanColumn\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"gt\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"gt\", left, right };\n }\n case \"lessThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"le\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"le\", left, right };\n }\n case \"greaterThanColumnOrEqual\": {\n const left = resolveColumnRef(filter.column);\n const right = resolveColumnRef(filter.rhs);\n if (filter.minDiff !== undefined && filter.minDiff !== 0) {\n return {\n type: \"numericComparison\",\n operand: \"ge\",\n left: {\n type: \"numericBinary\",\n operand: \"add\",\n left,\n right: { type: \"constant\", value: filter.minDiff },\n },\n right,\n };\n }\n return { type: \"numericComparison\", operand: \"ge\", left, right };\n }\n\n case \"inSet\":\n return {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n };\n case \"notInSet\":\n return {\n type: \"not\",\n input: {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n },\n };\n\n case \"isNA\":\n return {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n };\n case \"isNotNA\":\n return {\n type: \"not\",\n input: {\n type: \"isNull\",\n input: resolveColumnRef(filter.column),\n },\n };\n\n case \"ifNa\":\n return {\n type: \"ifNull\",\n input: resolveColumnRef(filter.column),\n replacement: { type: \"constant\", value: filter.replacement },\n };\n\n case \"topN\":\n case \"bottomN\":\n throw new Error(`Filter type \"${filter.type}\" is not supported in query expressions`);\n\n case undefined:\n throw new Error(\"Filter type is undefined\");\n\n default:\n assertNever(filter);\n }\n}\n"],"names":[],"mappings":";;AASA;AACA,SAAS,gBAAgB,CAAC,SAAiB,EAAA;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAmB;AACtD,IAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;QAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,EAAwB,EAAE;IACpE;IACA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE;AAChD;AAEA;AACM,SAAU,yBAAyB,CACvC,MAA0C,EAAA;AAE1C,IAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,QAAA,KAAK,KAAK;QACV,KAAK,IAAI,EAAE;AACT,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC;iBACnB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS;iBAClC,GAAG,CAAC,yBAAyB,CAAC;AACjC,YAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,gBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,qCAAA,CAAuC,CAAC;YACtF;YACA,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QAC7C;AACA,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AAEzE,QAAA,KAAK,eAAe;YAClB,OAAO;AACL,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,gBAAA,eAAe,EAAE,KAAK;aACvB;AACH,QAAA,KAAK,kBAAkB;YACrB,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,KAAK,EAAE;AACL,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;oBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,oBAAA,eAAe,EAAE,KAAK;AACvB,iBAAA;aACF;AACH,QAAA,KAAK,2BAA2B;YAC9B,OAAO;AACL,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,gBAAA,eAAe,EAAE,KAAK;aACvB;AACH,QAAA,KAAK,8BAA8B;YACjC,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,KAAK,EAAE;AACL,oBAAA,IAAI,EAAE,gBAAgB;AACtB,oBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;oBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,oBAAA,eAAe,EAAE,KAAK;AACvB,iBAAA;aACF;AACH,QAAA,KAAK,iCAAiC;YACpC,OAAO;AACL,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB;AACH,QAAA,KAAK,gCAAgC;YACnC,OAAO;AACL,gBAAA,IAAI,EAAE,qBAAqB;AAC3B,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,gBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC;AAC9B,gBAAA,eAAe,EAAE,KAAK;AACtB,gBAAA,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,KAAK;AACpD,gBAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;aAClC;AAEH,QAAA,KAAK,OAAO;YACV,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AACH,QAAA,KAAK,UAAU;YACb,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AACH,QAAA,KAAK,UAAU;YACb,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AACH,QAAA,KAAK,aAAa;YAChB,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AACH,QAAA,KAAK,iBAAiB;YACpB,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AACH,QAAA,KAAK,oBAAoB;YACvB,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACrC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE;aAC7C;AAEH,QAAA,KAAK,eAAe;YAClB,OAAO;AACL,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AACrC,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;aACpC;QACH,KAAK,gBAAgB,EAAE;YACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1C,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE;gBACxD,OAAO;AACL,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,OAAO,EAAE,KAAK;wBACd,IAAI;wBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;AACnD,qBAAA;oBACD,KAAK;iBACN;YACH;AACA,YAAA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAClE;QACA,KAAK,mBAAmB,EAAE;YACxB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1C,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE;gBACxD,OAAO;AACL,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,OAAO,EAAE,KAAK;wBACd,IAAI;wBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;AACnD,qBAAA;oBACD,KAAK;iBACN;YACH;AACA,YAAA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAClE;QACA,KAAK,uBAAuB,EAAE;YAC5B,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1C,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE;gBACxD,OAAO;AACL,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,OAAO,EAAE,KAAK;wBACd,IAAI;wBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;AACnD,qBAAA;oBACD,KAAK;iBACN;YACH;AACA,YAAA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAClE;QACA,KAAK,0BAA0B,EAAE;YAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC1C,YAAA,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE;gBACxD,OAAO;AACL,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,IAAI,EAAE;AACJ,wBAAA,IAAI,EAAE,eAAe;AACrB,wBAAA,OAAO,EAAE,KAAK;wBACd,IAAI;wBACJ,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE;AACnD,qBAAA;oBACD,KAAK;iBACN;YACH;AACA,YAAA,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;QAClE;AAEA,QAAA,KAAK,OAAO;YACV,OAAO;AACL,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,GAAG,EAAE,MAAM,CAAC,KAAK;aAClB;AACH,QAAA,KAAK,UAAU;YACb,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,KAAK,EAAE;AACL,oBAAA,IAAI,EAAE,MAAM;AACZ,oBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;oBACtC,GAAG,EAAE,MAAM,CAAC,KAAK;AAClB,iBAAA;aACF;AAEH,QAAA,KAAK,MAAM;YACT,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;aACvC;AACH,QAAA,KAAK,SAAS;YACZ,OAAO;AACL,gBAAA,IAAI,EAAE,KAAK;AACX,gBAAA,KAAK,EAAE;AACL,oBAAA,IAAI,EAAE,QAAQ;AACd,oBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AACvC,iBAAA;aACF;AAEH,QAAA,KAAK,MAAM;YACT,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,WAAW,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE;aAC7D;AAEH,QAAA,KAAK,MAAM;AACX,QAAA,KAAK,SAAS;YACZ,MAAM,IAAI,KAAK,CAAC,CAAA,aAAA,EAAgB,MAAM,CAAC,IAAI,CAAA,uCAAA,CAAyC,CAAC;AAEvF,QAAA,KAAK,SAAS;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;AAE7C,QAAA;YACE,WAAW,CAAC,MAAM,CAAC;;AAEzB;;;;"}
@@ -97,7 +97,8 @@ function convertFilterUiToExpressionImpl(value) {
97
97
  if (value.type === "patternMatchesRegularExpression" ||
98
98
  value.type === "patternFuzzyContainSubsequence" ||
99
99
  value.type === "inSet" ||
100
- value.type === "notInSet") {
100
+ value.type === "notInSet" ||
101
+ value.type === "ifNa") {
101
102
  throw new Error("Not implemented filter type: " + value.type);
102
103
  }
103
104
  if (value.type === undefined) {
@@ -111,4 +112,4 @@ function convertFilterUiToExpressions(value) {
111
112
 
112
113
  exports.convertFilterUiToExpressionImpl = convertFilterUiToExpressionImpl;
113
114
  exports.convertFilterUiToExpressions = convertFilterUiToExpressions;
114
- //# sourceMappingURL=converter.cjs.map
115
+ //# sourceMappingURL=filterUiToExpressionImpl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterUiToExpressionImpl.cjs","sources":["../../../src/filters/converters/filterUiToExpressionImpl.ts"],"sourcesContent":["import { assertNever } from \"@milaboratories/pl-model-common\";\nimport {\n and,\n col,\n lit,\n or,\n rank,\n type Expression,\n type ExpressionImpl,\n} from \"@milaboratories/ptabler-expression-js\";\nimport type { FilterSpec } from \"../types\";\n\nexport function convertFilterUiToExpressionImpl(value: FilterSpec): ExpressionImpl {\n if (value.type === \"or\") {\n const expressions = value.filters\n .filter((f) => f.type !== undefined)\n .map(convertFilterUiToExpressionImpl);\n if (expressions.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return or(...expressions);\n }\n\n if (value.type === \"and\") {\n const expressions = value.filters\n .filter((f) => f.type !== undefined)\n .map(convertFilterUiToExpressionImpl);\n if (expressions.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return and(...expressions);\n }\n\n if (value.type === \"not\") {\n return convertFilterUiToExpressionImpl(value.filter).not();\n }\n\n if (value.type === \"isNA\") {\n return col(value.column).isNull();\n }\n\n if (value.type === \"isNotNA\") {\n return col(value.column).isNotNull();\n }\n\n if (value.type === \"patternEquals\") {\n return col(value.column).eq(lit(value.value));\n }\n\n if (value.type === \"patternNotEquals\") {\n return col(value.column).neq(lit(value.value));\n }\n\n if (value.type === \"patternContainSubsequence\") {\n return col(value.column).strContains(value.value, false, true);\n }\n\n if (value.type === \"patternNotContainSubsequence\") {\n return col(value.column).strContains(value.value, false, true).not();\n }\n\n if (value.type === \"equal\") {\n return col(value.column).eq(lit(value.x));\n }\n\n if (value.type === \"notEqual\") {\n return col(value.column).neq(lit(value.x));\n }\n\n if (value.type === \"lessThan\") {\n return col(value.column).lt(lit(value.x));\n }\n\n if (value.type === \"greaterThan\") {\n return col(value.column).gt(lit(value.x));\n }\n\n if (value.type === \"lessThanOrEqual\") {\n return col(value.column).le(lit(value.x));\n }\n\n if (value.type === \"greaterThanOrEqual\") {\n return col(value.column).ge(lit(value.x));\n }\n\n if (value.type === \"equalToColumn\") {\n return col(value.column).eq(col(value.rhs));\n }\n\n if (value.type === \"greaterThanColumn\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).gt(col(value.rhs));\n }\n return col(value.column).gt(col(value.rhs));\n }\n\n if (value.type === \"lessThanColumn\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).lt(col(value.rhs));\n }\n return col(value.column).lt(col(value.rhs));\n }\n\n if (value.type === \"greaterThanColumnOrEqual\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).ge(col(value.rhs));\n }\n return col(value.column).ge(col(value.rhs));\n }\n\n if (value.type === \"lessThanColumnOrEqual\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).le(col(value.rhs));\n }\n return col(value.column).le(col(value.rhs));\n }\n\n if (value.type === \"topN\") {\n return rank(col(value.column), true).over([]).le(lit(value.n));\n }\n\n if (value.type === \"bottomN\") {\n return rank(col(value.column), false).over([]).le(lit(value.n));\n }\n\n if (\n value.type === \"patternMatchesRegularExpression\" ||\n value.type === \"patternFuzzyContainSubsequence\" ||\n value.type === \"inSet\" ||\n value.type === \"notInSet\" ||\n value.type === \"ifNa\"\n ) {\n throw new Error(\"Not implemented filter type: \" + value.type);\n }\n\n if (value.type === undefined) {\n throw new Error(\"Filter type is undefined, this should not happen\");\n }\n\n assertNever(value);\n}\n\nexport function convertFilterUiToExpressions(value: FilterSpec): Expression {\n return convertFilterUiToExpressionImpl(value).toJSON();\n}\n"],"names":["or","and","col","lit","rank","assertNever"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type Expression, type ExpressionImpl } from "@milaboratories/ptabler-expression-js";
2
- import type { FilterSpec } from "../filters";
2
+ import type { FilterSpec } from "../types";
3
3
  export declare function convertFilterUiToExpressionImpl(value: FilterSpec): ExpressionImpl;
4
4
  export declare function convertFilterUiToExpressions(value: FilterSpec): Expression;
5
- //# sourceMappingURL=converter.d.ts.map
5
+ //# sourceMappingURL=filterUiToExpressionImpl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterUiToExpressionImpl.d.ts","sourceRoot":"","sources":["../../../src/filters/converters/filterUiToExpressionImpl.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,cAAc,EACpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAgIjF;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAE1E"}
@@ -95,7 +95,8 @@ function convertFilterUiToExpressionImpl(value) {
95
95
  if (value.type === "patternMatchesRegularExpression" ||
96
96
  value.type === "patternFuzzyContainSubsequence" ||
97
97
  value.type === "inSet" ||
98
- value.type === "notInSet") {
98
+ value.type === "notInSet" ||
99
+ value.type === "ifNa") {
99
100
  throw new Error("Not implemented filter type: " + value.type);
100
101
  }
101
102
  if (value.type === undefined) {
@@ -108,4 +109,4 @@ function convertFilterUiToExpressions(value) {
108
109
  }
109
110
 
110
111
  export { convertFilterUiToExpressionImpl, convertFilterUiToExpressions };
111
- //# sourceMappingURL=converter.js.map
112
+ //# sourceMappingURL=filterUiToExpressionImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterUiToExpressionImpl.js","sources":["../../../src/filters/converters/filterUiToExpressionImpl.ts"],"sourcesContent":["import { assertNever } from \"@milaboratories/pl-model-common\";\nimport {\n and,\n col,\n lit,\n or,\n rank,\n type Expression,\n type ExpressionImpl,\n} from \"@milaboratories/ptabler-expression-js\";\nimport type { FilterSpec } from \"../types\";\n\nexport function convertFilterUiToExpressionImpl(value: FilterSpec): ExpressionImpl {\n if (value.type === \"or\") {\n const expressions = value.filters\n .filter((f) => f.type !== undefined)\n .map(convertFilterUiToExpressionImpl);\n if (expressions.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return or(...expressions);\n }\n\n if (value.type === \"and\") {\n const expressions = value.filters\n .filter((f) => f.type !== undefined)\n .map(convertFilterUiToExpressionImpl);\n if (expressions.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return and(...expressions);\n }\n\n if (value.type === \"not\") {\n return convertFilterUiToExpressionImpl(value.filter).not();\n }\n\n if (value.type === \"isNA\") {\n return col(value.column).isNull();\n }\n\n if (value.type === \"isNotNA\") {\n return col(value.column).isNotNull();\n }\n\n if (value.type === \"patternEquals\") {\n return col(value.column).eq(lit(value.value));\n }\n\n if (value.type === \"patternNotEquals\") {\n return col(value.column).neq(lit(value.value));\n }\n\n if (value.type === \"patternContainSubsequence\") {\n return col(value.column).strContains(value.value, false, true);\n }\n\n if (value.type === \"patternNotContainSubsequence\") {\n return col(value.column).strContains(value.value, false, true).not();\n }\n\n if (value.type === \"equal\") {\n return col(value.column).eq(lit(value.x));\n }\n\n if (value.type === \"notEqual\") {\n return col(value.column).neq(lit(value.x));\n }\n\n if (value.type === \"lessThan\") {\n return col(value.column).lt(lit(value.x));\n }\n\n if (value.type === \"greaterThan\") {\n return col(value.column).gt(lit(value.x));\n }\n\n if (value.type === \"lessThanOrEqual\") {\n return col(value.column).le(lit(value.x));\n }\n\n if (value.type === \"greaterThanOrEqual\") {\n return col(value.column).ge(lit(value.x));\n }\n\n if (value.type === \"equalToColumn\") {\n return col(value.column).eq(col(value.rhs));\n }\n\n if (value.type === \"greaterThanColumn\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).gt(col(value.rhs));\n }\n return col(value.column).gt(col(value.rhs));\n }\n\n if (value.type === \"lessThanColumn\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).lt(col(value.rhs));\n }\n return col(value.column).lt(col(value.rhs));\n }\n\n if (value.type === \"greaterThanColumnOrEqual\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).ge(col(value.rhs));\n }\n return col(value.column).ge(col(value.rhs));\n }\n\n if (value.type === \"lessThanColumnOrEqual\") {\n if (value.minDiff !== undefined && value.minDiff !== 0) {\n return col(value.column).plus(lit(value.minDiff)).le(col(value.rhs));\n }\n return col(value.column).le(col(value.rhs));\n }\n\n if (value.type === \"topN\") {\n return rank(col(value.column), true).over([]).le(lit(value.n));\n }\n\n if (value.type === \"bottomN\") {\n return rank(col(value.column), false).over([]).le(lit(value.n));\n }\n\n if (\n value.type === \"patternMatchesRegularExpression\" ||\n value.type === \"patternFuzzyContainSubsequence\" ||\n value.type === \"inSet\" ||\n value.type === \"notInSet\" ||\n value.type === \"ifNa\"\n ) {\n throw new Error(\"Not implemented filter type: \" + value.type);\n }\n\n if (value.type === undefined) {\n throw new Error(\"Filter type is undefined, this should not happen\");\n }\n\n assertNever(value);\n}\n\nexport function convertFilterUiToExpressions(value: FilterSpec): Expression {\n return convertFilterUiToExpressionImpl(value).toJSON();\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./filterToQuery";
2
+ export * from "./filterUiToExpressionImpl";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/filters/converters/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ /** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */
4
+ const KNOWN_LEAF_KEYS_TUPLE = [
5
+ "n",
6
+ "x",
7
+ "rhs",
8
+ "type",
9
+ "value",
10
+ "column",
11
+ "minDiff",
12
+ "maxEdits",
13
+ "wildcard",
14
+ "replacement",
15
+ "substitutionsOnly",
16
+ ];
17
+ const KNOWN_LEAF_KEYS = new Set(KNOWN_LEAF_KEYS_TUPLE);
18
+ /** Returns true if the leaf is filled — type is defined and no required fields are undefined. */
19
+ function isFilledLeaf(node) {
20
+ if (node.type == null)
21
+ return false;
22
+ return !Object.values(node).some((v) => v === undefined);
23
+ }
24
+ function distillLeaf(node) {
25
+ const result = {};
26
+ for (const [key, value] of Object.entries(node)) {
27
+ if (KNOWN_LEAF_KEYS.has(key)) {
28
+ result[key] = value;
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ function distillNode(node) {
34
+ switch (node.type) {
35
+ case "and":
36
+ case "or": {
37
+ const filtered = node.filters.map(distillNode).filter((f) => f !== null);
38
+ return filtered.length === 0 ? null : { type: node.type, filters: filtered };
39
+ }
40
+ case "not": {
41
+ const inner = distillNode(node.filter);
42
+ return inner === null ? null : { type: "not", filter: inner };
43
+ }
44
+ default:
45
+ if (!isFilledLeaf(node))
46
+ return null;
47
+ return distillLeaf(node);
48
+ }
49
+ }
50
+ /**
51
+ * Strips non-FilterSpec metadata (whitelist approach) and removes
52
+ * unfilled leaves (type is undefined or any required field is undefined).
53
+ */
54
+ function distillFilterSpec(filter) {
55
+ if (filter == null)
56
+ return null;
57
+ return distillNode(filter);
58
+ }
59
+
60
+ exports.distillFilterSpec = distillFilterSpec;
61
+ //# sourceMappingURL=distill.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill.cjs","sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, UnionToTuples } from \"@milaboratories/helpers\";\nimport { type FilterSpec, type FilterSpecLeaf } from \"@milaboratories/pl-model-common\";\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Returns true if the leaf is filled — type is defined and no required fields are undefined. */\nfunction isFilledLeaf(node: Record<string, unknown>): boolean {\n if (node.type == null) return false;\n return !Object.values(node).some((v) => v === undefined);\n}\n\nfunction distillLeaf(node: Record<string, unknown>): FilterSpecLeaf<string> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<string>;\n}\n\nfunction distillNode<T extends FilterSpecLeaf<unknown>>(\n node: FilterSpec<T, unknown, unknown>,\n): FilterSpec<T> | null {\n switch (node.type) {\n case \"and\":\n case \"or\": {\n const filtered = node.filters.map(distillNode).filter((f): f is FilterSpec<T> => f !== null);\n return filtered.length === 0 ? null : { type: node.type, filters: filtered };\n }\n case \"not\": {\n const inner = distillNode(node.filter);\n return inner === null ? null : { type: \"not\", filter: inner };\n }\n default:\n if (!isFilledLeaf(node)) return null;\n return distillLeaf(node);\n }\n}\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<T extends FilterSpecLeaf<unknown>>(\n filter: null | undefined | FilterSpec<T, unknown, unknown>,\n): null | FilterSpec<T> {\n if (filter == null) return null;\n return distillNode(filter);\n}\n"],"names":[],"mappings":";;AAMA;AACA,MAAM,qBAAqB,GAAqC;IAC9D,GAAG;IACH,GAAG;IACH,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,mBAAmB;CACpB;AACD,MAAM,eAAe,GAA2B,IAAI,GAAG,CAAC,qBAAqB,CAAC;AAE9E;AACA,SAAS,YAAY,CAAC,IAA6B,EAAA;AACjD,IAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;AAAE,QAAA,OAAO,KAAK;AACnC,IAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AAC1D;AAEA,SAAS,WAAW,CAAC,IAA6B,EAAA;IAChD,MAAM,MAAM,GAA4B,EAAE;AAC1C,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC/C,QAAA,IAAI,eAAe,CAAC,GAAG,CAAC,GAAwB,CAAC,EAAE;AACjD,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;QACrB;IACF;AACA,IAAA,OAAO,MAAgC;AACzC;AAEA,SAAS,WAAW,CAClB,IAAqC,EAAA;AAErC,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;QACV,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,KAAK,IAAI,CAAC;YAC5F,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC9E;QACA,KAAK,KAAK,EAAE;YACV,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AACtC,YAAA,OAAO,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/D;AACA,QAAA;AACE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;AACpC,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;AAE9B;AAEA;;;AAGG;AACG,SAAU,iBAAiB,CAC/B,MAA0D,EAAA;IAE1D,IAAI,MAAM,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;AAC/B,IAAA,OAAO,WAAW,CAAC,MAAM,CAAC;AAC5B;;;;"}
@@ -0,0 +1,7 @@
1
+ import { type FilterSpec, type FilterSpecLeaf } from "@milaboratories/pl-model-common";
2
+ /**
3
+ * Strips non-FilterSpec metadata (whitelist approach) and removes
4
+ * unfilled leaves (type is undefined or any required field is undefined).
5
+ */
6
+ export declare function distillFilterSpec<T extends FilterSpecLeaf<unknown>>(filter: null | undefined | FilterSpec<T, unknown, unknown>): null | FilterSpec<T>;
7
+ //# sourceMappingURL=distill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../src/filters/distill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAwDvF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,CAAC,OAAO,CAAC,EACjE,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GACzD,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAGtB"}
@@ -0,0 +1,59 @@
1
+ /** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */
2
+ const KNOWN_LEAF_KEYS_TUPLE = [
3
+ "n",
4
+ "x",
5
+ "rhs",
6
+ "type",
7
+ "value",
8
+ "column",
9
+ "minDiff",
10
+ "maxEdits",
11
+ "wildcard",
12
+ "replacement",
13
+ "substitutionsOnly",
14
+ ];
15
+ const KNOWN_LEAF_KEYS = new Set(KNOWN_LEAF_KEYS_TUPLE);
16
+ /** Returns true if the leaf is filled — type is defined and no required fields are undefined. */
17
+ function isFilledLeaf(node) {
18
+ if (node.type == null)
19
+ return false;
20
+ return !Object.values(node).some((v) => v === undefined);
21
+ }
22
+ function distillLeaf(node) {
23
+ const result = {};
24
+ for (const [key, value] of Object.entries(node)) {
25
+ if (KNOWN_LEAF_KEYS.has(key)) {
26
+ result[key] = value;
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ function distillNode(node) {
32
+ switch (node.type) {
33
+ case "and":
34
+ case "or": {
35
+ const filtered = node.filters.map(distillNode).filter((f) => f !== null);
36
+ return filtered.length === 0 ? null : { type: node.type, filters: filtered };
37
+ }
38
+ case "not": {
39
+ const inner = distillNode(node.filter);
40
+ return inner === null ? null : { type: "not", filter: inner };
41
+ }
42
+ default:
43
+ if (!isFilledLeaf(node))
44
+ return null;
45
+ return distillLeaf(node);
46
+ }
47
+ }
48
+ /**
49
+ * Strips non-FilterSpec metadata (whitelist approach) and removes
50
+ * unfilled leaves (type is undefined or any required field is undefined).
51
+ */
52
+ function distillFilterSpec(filter) {
53
+ if (filter == null)
54
+ return null;
55
+ return distillNode(filter);
56
+ }
57
+
58
+ export { distillFilterSpec };
59
+ //# sourceMappingURL=distill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill.js","sources":["../../src/filters/distill.ts"],"sourcesContent":["import { DistributiveKeys, UnionToTuples } from \"@milaboratories/helpers\";\nimport { type FilterSpec, type FilterSpecLeaf } from \"@milaboratories/pl-model-common\";\n\n/** All possible field names that can appear in any FilterSpecLeaf variant. */\ntype FilterSpecLeafKey = DistributiveKeys<FilterSpecLeaf<string>>;\n\n/** Compile-time check: every key in the tuple is a valid leaf key (via satisfies). */\nconst KNOWN_LEAF_KEYS_TUPLE: UnionToTuples<FilterSpecLeafKey> = [\n \"n\",\n \"x\",\n \"rhs\",\n \"type\",\n \"value\",\n \"column\",\n \"minDiff\",\n \"maxEdits\",\n \"wildcard\",\n \"replacement\",\n \"substitutionsOnly\",\n];\nconst KNOWN_LEAF_KEYS: Set<FilterSpecLeafKey> = new Set(KNOWN_LEAF_KEYS_TUPLE);\n\n/** Returns true if the leaf is filled — type is defined and no required fields are undefined. */\nfunction isFilledLeaf(node: Record<string, unknown>): boolean {\n if (node.type == null) return false;\n return !Object.values(node).some((v) => v === undefined);\n}\n\nfunction distillLeaf(node: Record<string, unknown>): FilterSpecLeaf<string> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(node)) {\n if (KNOWN_LEAF_KEYS.has(key as FilterSpecLeafKey)) {\n result[key] = value;\n }\n }\n return result as FilterSpecLeaf<string>;\n}\n\nfunction distillNode<T extends FilterSpecLeaf<unknown>>(\n node: FilterSpec<T, unknown, unknown>,\n): FilterSpec<T> | null {\n switch (node.type) {\n case \"and\":\n case \"or\": {\n const filtered = node.filters.map(distillNode).filter((f): f is FilterSpec<T> => f !== null);\n return filtered.length === 0 ? null : { type: node.type, filters: filtered };\n }\n case \"not\": {\n const inner = distillNode(node.filter);\n return inner === null ? null : { type: \"not\", filter: inner };\n }\n default:\n if (!isFilledLeaf(node)) return null;\n return distillLeaf(node);\n }\n}\n\n/**\n * Strips non-FilterSpec metadata (whitelist approach) and removes\n * unfilled leaves (type is undefined or any required field is undefined).\n */\nexport function distillFilterSpec<T extends FilterSpecLeaf<unknown>>(\n filter: null | undefined | FilterSpec<T, unknown, unknown>,\n): null | FilterSpec<T> {\n if (filter == null) return null;\n return distillNode(filter);\n}\n"],"names":[],"mappings":"AAMA;AACA,MAAM,qBAAqB,GAAqC;IAC9D,GAAG;IACH,GAAG;IACH,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,aAAa;IACb,mBAAmB;CACpB;AACD,MAAM,eAAe,GAA2B,IAAI,GAAG,CAAC,qBAAqB,CAAC;AAE9E;AACA,SAAS,YAAY,CAAC,IAA6B,EAAA;AACjD,IAAA,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;AAAE,QAAA,OAAO,KAAK;AACnC,IAAA,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AAC1D;AAEA,SAAS,WAAW,CAAC,IAA6B,EAAA;IAChD,MAAM,MAAM,GAA4B,EAAE;AAC1C,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC/C,QAAA,IAAI,eAAe,CAAC,GAAG,CAAC,GAAwB,CAAC,EAAE;AACjD,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;QACrB;IACF;AACA,IAAA,OAAO,MAAgC;AACzC;AAEA,SAAS,WAAW,CAClB,IAAqC,EAAA;AAErC,IAAA,QAAQ,IAAI,CAAC,IAAI;AACf,QAAA,KAAK,KAAK;QACV,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAyB,CAAC,KAAK,IAAI,CAAC;YAC5F,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC9E;QACA,KAAK,KAAK,EAAE;YACV,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC;AACtC,YAAA,OAAO,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/D;AACA,QAAA;AACE,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;AACpC,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC;;AAE9B;AAEA;;;AAGG;AACG,SAAU,iBAAiB,CAC/B,MAA0D,EAAA;IAE1D,IAAI,MAAM,IAAI,IAAI;AAAE,QAAA,OAAO,IAAI;AAC/B,IAAA,OAAO,WAAW,CAAC,MAAM,CAAC;AAC5B;;;;"}
@@ -1,3 +1,4 @@
1
- export * from "./converter";
1
+ export * from "./converters";
2
+ export * from "./distill";
2
3
  export * from "./types";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}