@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.
@@ -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: "not",
249
- input: {
250
- type: "isIn",
251
- input: resolveColumnRef(filter.column),
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: "ifNull",
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: "not",
248
- input: {
249
- type: "isIn",
250
- input: resolveColumnRef(filter.column),
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: "ifNull",
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
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.75.10";
2
+ var version = "1.76.4";
3
3
  //#endregion
4
4
  Object.defineProperty(exports, "version", {
5
5
  enumerable: true,
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.75.10";
2
+ var version = "1.76.4";
3
3
  //#endregion
4
4
  export { version };
5
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.75.10",
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-middle-layer": "1.19.3",
36
- "@milaboratories/pl-model-common": "1.41.2",
37
- "@milaboratories/ptabler-expression-js": "1.2.24"
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.15",
47
- "@milaboratories/ts-configs": "1.2.3",
48
- "@milaboratories/pf-driver": "1.4.10"
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: "not",
326
- input: {
327
- type: "isIn",
328
- input: { type: "columnRef", value: "col1" },
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: "not",
228
- input: {
229
- type: "isIn",
230
- input: resolveColumnRef(filter.column),
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: "ifNull",
250
+ type: "fillNull",
252
251
  input: resolveColumnRef(filter.column),
253
252
  replacement: { type: "constant", value: filter.replacement },
254
253
  };