@platforma-sdk/model 1.75.10 → 1.76.4
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.
- package/dist/filters/converters/filterToQuery.cjs +7 -8
- package/dist/filters/converters/filterToQuery.cjs.map +1 -1
- package/dist/filters/converters/filterToQuery.js +7 -8
- package/dist/filters/converters/filterToQuery.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/package.json +8 -8
- package/src/filters/converters/filterToQuery.test.ts +5 -6
- package/src/filters/converters/filterToQuery.ts +6 -7
|
@@ -242,15 +242,14 @@ function leafToSpecQueryExpr(filter) {
|
|
|
242
242
|
case "inSet": return {
|
|
243
243
|
type: "isIn",
|
|
244
244
|
input: resolveColumnRef(filter.column),
|
|
245
|
-
set: filter.value
|
|
245
|
+
set: filter.value,
|
|
246
|
+
negate: false
|
|
246
247
|
};
|
|
247
248
|
case "notInSet": return {
|
|
248
|
-
type: "
|
|
249
|
-
input:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
set: filter.value
|
|
253
|
-
}
|
|
249
|
+
type: "isIn",
|
|
250
|
+
input: resolveColumnRef(filter.column),
|
|
251
|
+
set: filter.value,
|
|
252
|
+
negate: true
|
|
254
253
|
};
|
|
255
254
|
case "isNA": return {
|
|
256
255
|
type: "isNull",
|
|
@@ -264,7 +263,7 @@ function leafToSpecQueryExpr(filter) {
|
|
|
264
263
|
}
|
|
265
264
|
};
|
|
266
265
|
case "ifNa": return {
|
|
267
|
-
type: "
|
|
266
|
+
type: "fillNull",
|
|
268
267
|
input: resolveColumnRef(filter.column),
|
|
269
268
|
replacement: {
|
|
270
269
|
type: "constant",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterToQuery.cjs","names":["traverseFilterSpec"],"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\";\nimport { traverseFilterSpec } from \"../traverse\";\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 return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filterToQuery.cjs","names":["traverseFilterSpec"],"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\";\nimport { traverseFilterSpec } from \"../traverse\";\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 return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\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 negate: false,\n };\n case \"notInSet\":\n return {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n negate: true,\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: \"fillNull\",\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"],"mappings":"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"}
|
|
@@ -241,15 +241,14 @@ function leafToSpecQueryExpr(filter) {
|
|
|
241
241
|
case "inSet": return {
|
|
242
242
|
type: "isIn",
|
|
243
243
|
input: resolveColumnRef(filter.column),
|
|
244
|
-
set: filter.value
|
|
244
|
+
set: filter.value,
|
|
245
|
+
negate: false
|
|
245
246
|
};
|
|
246
247
|
case "notInSet": return {
|
|
247
|
-
type: "
|
|
248
|
-
input:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
set: filter.value
|
|
252
|
-
}
|
|
248
|
+
type: "isIn",
|
|
249
|
+
input: resolveColumnRef(filter.column),
|
|
250
|
+
set: filter.value,
|
|
251
|
+
negate: true
|
|
253
252
|
};
|
|
254
253
|
case "isNA": return {
|
|
255
254
|
type: "isNull",
|
|
@@ -263,7 +262,7 @@ function leafToSpecQueryExpr(filter) {
|
|
|
263
262
|
}
|
|
264
263
|
};
|
|
265
264
|
case "ifNa": return {
|
|
266
|
-
type: "
|
|
265
|
+
type: "fillNull",
|
|
267
266
|
input: resolveColumnRef(filter.column),
|
|
268
267
|
replacement: {
|
|
269
268
|
type: "constant",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterToQuery.js","names":[],"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\";\nimport { traverseFilterSpec } from \"../traverse\";\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 return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filterToQuery.js","names":[],"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\";\nimport { traverseFilterSpec } from \"../traverse\";\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 return parsed.type === \"axis\"\n ? { type: \"axisRef\", value: parsed.id as SingleAxisSelector }\n : { type: \"columnRef\", value: parsed.id };\n}\n\n/** Converts a FilterSpec tree into a SpecQueryExpression. */\nexport function filterSpecToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: FilterSpec<Leaf>,\n): SpecQueryExpression {\n return traverseFilterSpec(filter, {\n leaf: leafToSpecQueryExpr,\n and: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"AND filter requires at least one operand\");\n }\n return { type: \"and\", input: inputs };\n },\n or: (inputs) => {\n if (inputs.length === 0) {\n throw new Error(\"OR filter requires at least one operand\");\n }\n return { type: \"or\", input: inputs };\n },\n not: (input) => ({ type: \"not\", input }),\n });\n}\n\nfunction leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(\n filter: Leaf,\n): SpecQueryExpression {\n switch (filter.type) {\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 negate: false,\n };\n case \"notInSet\":\n return {\n type: \"isIn\",\n input: resolveColumnRef(filter.column),\n set: filter.value,\n negate: true,\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: \"fillNull\",\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"],"mappings":"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"}
|
package/dist/package.cjs
CHANGED
package/dist/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/model",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.76.4",
|
|
4
4
|
"description": "Platforma.bio SDK / Block Model",
|
|
5
5
|
"files": [
|
|
6
6
|
"./dist/**/*",
|
|
@@ -32,20 +32,20 @@
|
|
|
32
32
|
"zod": "~3.25.76",
|
|
33
33
|
"@milaboratories/helpers": "1.14.2",
|
|
34
34
|
"@milaboratories/pl-error-like": "1.12.10",
|
|
35
|
-
"@milaboratories/pl-model-
|
|
36
|
-
"@milaboratories/pl-model-
|
|
37
|
-
"@milaboratories/ptabler-expression-js": "1.2.
|
|
35
|
+
"@milaboratories/pl-model-common": "1.42.0",
|
|
36
|
+
"@milaboratories/pl-model-middle-layer": "1.19.4",
|
|
37
|
+
"@milaboratories/ptabler-expression-js": "1.2.25"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@vitest/coverage-istanbul": "^4.1.3",
|
|
41
41
|
"fast-json-patch": "^3.1.1",
|
|
42
42
|
"typescript": "~5.9.3",
|
|
43
43
|
"vitest": "^4.1.3",
|
|
44
|
-
"@milaboratories/ts-builder": "1.4.0",
|
|
45
44
|
"@milaboratories/build-configs": "2.0.0",
|
|
46
|
-
"@milaboratories/pf-spec-driver": "1.3.
|
|
47
|
-
"@milaboratories/ts-
|
|
48
|
-
"@milaboratories/pf-driver": "1.4.
|
|
45
|
+
"@milaboratories/pf-spec-driver": "1.3.16",
|
|
46
|
+
"@milaboratories/ts-builder": "1.4.0",
|
|
47
|
+
"@milaboratories/pf-driver": "1.4.11",
|
|
48
|
+
"@milaboratories/ts-configs": "1.2.3"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "ts-builder build --target node",
|
|
@@ -312,6 +312,7 @@ describe("filterSpecToSpecQueryExpr", () => {
|
|
|
312
312
|
type: "isIn",
|
|
313
313
|
input: { type: "columnRef", value: "col1" },
|
|
314
314
|
set: ["a", "b", "c"],
|
|
315
|
+
negate: false,
|
|
315
316
|
});
|
|
316
317
|
});
|
|
317
318
|
|
|
@@ -322,12 +323,10 @@ describe("filterSpecToSpecQueryExpr", () => {
|
|
|
322
323
|
value: ["x"],
|
|
323
324
|
};
|
|
324
325
|
expect(filterSpecToSpecQueryExpr(filter)).toEqual({
|
|
325
|
-
type: "
|
|
326
|
-
input: {
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
set: ["x"],
|
|
330
|
-
},
|
|
326
|
+
type: "isIn",
|
|
327
|
+
input: { type: "columnRef", value: "col1" },
|
|
328
|
+
set: ["x"],
|
|
329
|
+
negate: true,
|
|
331
330
|
});
|
|
332
331
|
});
|
|
333
332
|
|
|
@@ -221,15 +221,14 @@ function leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(
|
|
|
221
221
|
type: "isIn",
|
|
222
222
|
input: resolveColumnRef(filter.column),
|
|
223
223
|
set: filter.value,
|
|
224
|
+
negate: false,
|
|
224
225
|
};
|
|
225
226
|
case "notInSet":
|
|
226
227
|
return {
|
|
227
|
-
type: "
|
|
228
|
-
input:
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
set: filter.value,
|
|
232
|
-
},
|
|
228
|
+
type: "isIn",
|
|
229
|
+
input: resolveColumnRef(filter.column),
|
|
230
|
+
set: filter.value,
|
|
231
|
+
negate: true,
|
|
233
232
|
};
|
|
234
233
|
|
|
235
234
|
case "isNA":
|
|
@@ -248,7 +247,7 @@ function leafToSpecQueryExpr<Leaf extends FilterSpecLeaf<string>>(
|
|
|
248
247
|
|
|
249
248
|
case "ifNa":
|
|
250
249
|
return {
|
|
251
|
-
type: "
|
|
250
|
+
type: "fillNull",
|
|
252
251
|
input: resolveColumnRef(filter.column),
|
|
253
252
|
replacement: { type: "constant", value: filter.replacement },
|
|
254
253
|
};
|