@milaboratories/pl-model-common 1.29.0 → 1.31.0
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/bmodel/block_config.d.ts +1 -0
- package/dist/bmodel/code.d.ts +1 -0
- package/dist/driver_kit.d.ts +1 -1
- package/dist/drivers/index.d.ts +7 -7
- package/dist/drivers/index.js +2 -2
- package/dist/drivers/pframe/data_types.cjs +0 -15
- package/dist/drivers/pframe/data_types.cjs.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts +14 -60
- package/dist/drivers/pframe/data_types.js +1 -13
- package/dist/drivers/pframe/data_types.js.map +1 -1
- package/dist/drivers/pframe/driver.cjs.map +1 -1
- package/dist/drivers/pframe/driver.d.ts +13 -5
- package/dist/drivers/pframe/driver.js.map +1 -1
- package/dist/drivers/pframe/index.d.ts +6 -6
- package/dist/drivers/pframe/index.js +2 -2
- package/dist/drivers/pframe/pframe.d.ts +2 -2
- package/dist/drivers/pframe/query/query_common.d.ts +2 -2
- package/dist/drivers/pframe/query/query_data.d.ts +1 -1
- package/dist/drivers/pframe/query/query_spec.d.ts +2 -2
- package/dist/drivers/pframe/spec/ids.d.ts +2 -2
- package/dist/drivers/pframe/spec/index.d.ts +1 -1
- package/dist/drivers/pframe/spec/index.js +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +14 -1
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +7 -1
- package/dist/drivers/pframe/spec/spec.js +14 -2
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/spec_driver.d.ts +36 -6
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +5 -6
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +2 -2
- package/dist/errors.cjs +48 -0
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +25 -1
- package/dist/errors.js +37 -1
- package/dist/errors.js.map +1 -1
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +4 -1
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/flags/flag_utils.d.ts +1 -1
- package/dist/flags/index.d.ts +3 -0
- package/dist/index.cjs +38 -3
- package/dist/index.d.ts +31 -22
- package/dist/index.js +12 -4
- package/dist/pool/query.d.ts +1 -1
- package/dist/pool_entry.cjs +30 -0
- package/dist/pool_entry.cjs.map +1 -0
- package/dist/pool_entry.d.ts +30 -0
- package/dist/pool_entry.js +29 -0
- package/dist/pool_entry.js.map +1 -0
- package/dist/services/index.cjs +6 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.js +6 -0
- package/dist/services/service_capabilities.cjs +51 -0
- package/dist/services/service_capabilities.cjs.map +1 -0
- package/dist/services/service_capabilities.d.ts +33 -0
- package/dist/services/service_capabilities.js +46 -0
- package/dist/services/service_capabilities.js.map +1 -0
- package/dist/services/service_declarations.cjs +17 -0
- package/dist/services/service_declarations.cjs.map +1 -0
- package/dist/services/service_declarations.d.ts +16 -0
- package/dist/services/service_declarations.js +17 -0
- package/dist/services/service_declarations.js.map +1 -0
- package/dist/services/service_injector_factory.cjs +19 -0
- package/dist/services/service_injector_factory.cjs.map +1 -0
- package/dist/services/service_injector_factory.d.ts +8 -0
- package/dist/services/service_injector_factory.js +18 -0
- package/dist/services/service_injector_factory.js.map +1 -0
- package/dist/services/service_injectors.cjs +48 -0
- package/dist/services/service_injectors.cjs.map +1 -0
- package/dist/services/service_injectors.d.ts +23 -0
- package/dist/services/service_injectors.js +46 -0
- package/dist/services/service_injectors.js.map +1 -0
- package/dist/services/service_registry.cjs +52 -0
- package/dist/services/service_registry.cjs.map +1 -0
- package/dist/services/service_registry.d.ts +25 -0
- package/dist/services/service_registry.js +51 -0
- package/dist/services/service_registry.js.map +1 -0
- package/dist/services/service_types.cjs +30 -0
- package/dist/services/service_types.cjs.map +1 -0
- package/dist/services/service_types.d.ts +45 -0
- package/dist/services/service_types.js +28 -0
- package/dist/services/service_types.js.map +1 -0
- package/package.json +4 -4
- package/src/drivers/pframe/data_types.ts +18 -140
- package/src/drivers/pframe/driver.ts +11 -1
- package/src/drivers/pframe/spec/spec.ts +16 -2
- package/src/drivers/pframe/spec_driver.ts +37 -5
- package/src/drivers/pframe/table_calculate.ts +3 -4
- package/src/errors.ts +53 -0
- package/src/flags/block_flags.ts +5 -2
- package/src/index.ts +2 -0
- package/src/pool_entry.ts +42 -0
- package/src/services/index.ts +5 -0
- package/src/services/service_capabilities.test.ts +119 -0
- package/src/services/service_capabilities.ts +64 -0
- package/src/services/service_declarations.ts +25 -0
- package/src/services/service_injector_factory.ts +27 -0
- package/src/services/service_injectors.ts +79 -0
- package/src/services/service_registry.test.ts +69 -0
- package/src/services/service_registry.ts +94 -0
- package/src/services/service_types.ts +114 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table_calculate.cjs","names":["canonicalizeJson","getAxisId","mapSpecQueryColumns"],"sources":["../../../src/drivers/pframe/table_calculate.ts"],"sourcesContent":["import type { PTableColumnId, PTableColumnSpec } from \"./table_common\";\nimport type { PTableVector } from \"./data_types\";\nimport type { PObjectId } from \"../../pool\";\nimport { assertNever } from \"../../util\";\nimport { getAxisId, type PColumn } from \"./spec/spec\";\nimport type { PColumnValues } from \"./data_info\";\nimport type { SpecQuery } from \"./query/query_spec\";\nimport { canonicalizeJson } from \"../../json\";\nimport { mapSpecQueryColumns } from \"./query\";\n\n/** Defines a terminal column node in the join request tree */\nexport interface ColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"column\";\n\n /** Local column */\n readonly column: Col;\n}\n\n/**\n * Axis filter slicing target axis from column axes.\n * If the axis has parents or is a parent, slicing cannot be applied (an error will be thrown).\n * */\nexport interface ConstantAxisFilter {\n /** Filter type discriminator */\n readonly type: \"constant\";\n\n /** Index of axis to slice (zero-based) */\n readonly axisIndex: number;\n\n /** Equality filter reference value, see {@link SingleValueEqualPredicate} */\n readonly constant: string | number;\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface SlicedColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"slicedColumn\";\n\n /** Local column */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Non-empty list of axis filters */\n readonly axisFilters: ConstantAxisFilter[];\n}\n\nexport interface ArtificialColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"artificialColumn\";\n\n /** Column definition */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Indices of axes to pick from the column (zero-based) */\n readonly axesIndices: number[];\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface InlineColumnJoinEntry {\n /** Node type discriminator */\n readonly type: \"inlineColumn\";\n\n /** Column definition */\n readonly column: PColumn<PColumnValues>;\n}\n\n/**\n * Defines a join request tree node that will output only records present in\n * all child nodes ({@link entries}).\n * */\nexport interface InnerJoin<Col> {\n /** Node type discriminator */\n readonly type: \"inner\";\n\n /** Child nodes to be inner joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present at\n * least in one of the child nodes ({@link entries}), values for those PColumns\n * that lacks corresponding combinations of axis values will be marked as absent,\n * see {@link PTableVector.absent}.\n * */\nexport interface FullJoin<Col> {\n /** Node type discriminator */\n readonly type: \"full\";\n\n /** Child nodes to be fully outer joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present in\n * {@link primary} child node, and records from the {@link secondary} nodes will\n * be added to the output only if present, values for those PColumns from the\n * {@link secondary} list, that lacks corresponding combinations of axis values\n * will be marked as absent, see {@link PTableVector.absent}.\n *\n * This node can be thought as a chain of SQL LEFT JOIN operations starting from\n * the {@link primary} node and adding {@link secondary} nodes one by one.\n * */\nexport interface OuterJoin<Col> {\n /** Node type discriminator */\n readonly type: \"outer\";\n\n /** Primes the join operation. Left part of LEFT JOIN. */\n readonly primary: JoinEntry<Col>;\n\n /** Driven nodes, giving their values only if primary node have corresponding\n * nodes. Right parts of LEFT JOIN chain. */\n readonly secondary: JoinEntry<Col>[];\n}\n\n/**\n * Base type of all join request tree nodes. Join request tree allows to combine\n * information from multiple PColumns into a PTable. Correlation between records\n * is performed by looking for records with the same values in common axis between\n * the PColumns. Common axis are those axis which have equal {@link AxisId} derived\n * from the columns axes spec.\n * */\nexport type JoinEntry<Col> =\n | ColumnJoinEntry<Col>\n | SlicedColumnJoinEntry<Col>\n | ArtificialColumnJoinEntry<Col>\n | InlineColumnJoinEntry\n | InnerJoin<Col>\n | FullJoin<Col>\n | OuterJoin<Col>;\n\n/** Container representing whole data stored in specific PTable column. */\nexport interface FullPTableColumnData {\n /** Unified spec */\n readonly spec: PTableColumnSpec;\n\n /** Data */\n readonly data: PTableVector;\n}\n\nexport interface SingleValueIsNAPredicate {\n /** Comparison operator */\n readonly operator: \"IsNA\";\n}\n\nexport interface SingleValueEqualPredicate {\n /** Comparison operator */\n readonly operator: \"Equal\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueInSetPredicate {\n /** Comparison operator */\n readonly operator: \"InSet\";\n\n /** Reference values, NA values will not match */\n readonly references: (string | number)[];\n}\n\nexport interface SingleValueIEqualPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"IEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string;\n}\n\nexport interface SingleValueLessPredicate {\n /** Comparison operator */\n readonly operator: \"Less\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueLessOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"LessOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterPredicate {\n /** Comparison operator */\n readonly operator: \"Greater\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"GreaterOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueStringContainsPredicate {\n /** Comparison operator */\n readonly operator: \"StringContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueStringIContainsPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueMatchesPredicate {\n /** Comparison operator */\n readonly operator: \"Matches\";\n\n /** Regular expression, NA values are skipped */\n readonly regex: string;\n}\n\nexport interface SingleValueStringContainsFuzzyPredicate {\n /** Comparison operator */\n readonly operator: \"StringContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueStringIContainsFuzzyPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueNotPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Not\";\n\n /** Operand to negate */\n readonly operand: SingleValuePredicateV2;\n}\n\nexport interface SingleValueAndPredicateV2 {\n /** Comparison operator */\n readonly operator: \"And\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\nexport interface SingleValueOrPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Or\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\n/** Filtering predicate for a single axis or column value */\nexport type SingleValuePredicateV2 =\n | SingleValueIsNAPredicate\n | SingleValueEqualPredicate\n | SingleValueInSetPredicate\n | SingleValueLessPredicate\n | SingleValueLessOrEqualPredicate\n | SingleValueGreaterPredicate\n | SingleValueGreaterOrEqualPredicate\n | SingleValueStringContainsPredicate\n | SingleValueMatchesPredicate\n | SingleValueStringContainsFuzzyPredicate\n | SingleValueNotPredicateV2\n | SingleValueAndPredicateV2\n | SingleValueOrPredicateV2\n | SingleValueIEqualPredicate\n | SingleValueStringIContainsPredicate\n | SingleValueStringIContainsFuzzyPredicate;\n\n/**\n * Filter PTable records based on specific axis or column value. If this is an\n * axis value filter and the axis is part of a partitioning key in some of the\n * source PColumns, the filter will be pushed down to those columns, so only\n * specific partitions will be retrieved from the remote storage.\n * */\nexport interface PTableRecordSingleValueFilterV2 {\n /** Filter type discriminator */\n readonly type: \"bySingleColumnV2\";\n\n /** Target axis selector to examine values from */\n readonly column: PTableColumnId;\n\n /** Value predicate */\n readonly predicate: SingleValuePredicateV2;\n}\n\n/** Generic PTable records filter */\nexport type PTableRecordFilter = PTableRecordSingleValueFilterV2;\n\n/** Sorting parameters for a PTable. */\nexport type PTableSorting = {\n /** Unified column identifier */\n readonly column: PTableColumnId;\n\n /** Sorting order */\n readonly ascending: boolean;\n\n /** Sorting in respect to NA and absent values */\n readonly naAndAbsentAreLeastValues: boolean;\n};\n\n/** Information required to instantiate a PTable. */\nexport interface PTableDef<Col> {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Partition filters */\n readonly partitionFilters: PTableRecordFilter[];\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n}\n\n/** Information required to instantiate a PTable (V2, query-based). */\nexport interface PTableDefV2<Col> {\n /** Pre-built query spec describing joins, filters and sorting */\n readonly query: SpecQuery<Col>;\n}\n\n/** Request to create and retrieve entirety of data of PTable. */\nexport type CalculateTableDataRequest<Col> = {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n};\n\n/** Response for {@link CalculateTableDataRequest} */\nexport type CalculateTableDataResponse = FullPTableColumnData[];\n\nexport function mapPTableDef<C1, C2>(def: PTableDef<C1>, cb: (c: C1) => C2): PTableDef<C2> {\n return { ...def, src: mapJoinEntry(def.src, cb) };\n}\n\nexport function sortPTableDef(def: PTableDef<PObjectId>): PTableDef<PObjectId> {\n function sortFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n return filters.toSorted((lhs, rhs) => {\n if (lhs.column.type === \"axis\" && rhs.column.type === \"axis\") {\n const lhsId = canonicalizeJson(getAxisId(lhs.column.id));\n const rhsId = canonicalizeJson(getAxisId(rhs.column.id));\n return lhsId < rhsId ? -1 : 1;\n } else if (lhs.column.type === \"column\" && rhs.column.type === \"column\") {\n return lhs.column.id < rhs.column.id ? -1 : 1;\n } else {\n return lhs.column.type === \"axis\" ? -1 : 1;\n }\n });\n }\n return {\n src: sortJoinEntry(def.src),\n partitionFilters: sortFilters(def.partitionFilters),\n filters: sortFilters(def.filters),\n sorting: def.sorting,\n };\n}\n\nexport function mapPTableDefV2<C1, C2>(def: PTableDefV2<C1>, cb: (c: C1) => C2): PTableDefV2<C2> {\n return { query: mapSpecQueryColumns(def.query, cb) };\n}\n\nexport function mapJoinEntry<C1, C2>(entry: JoinEntry<C1>, cb: (c: C1) => C2): JoinEntry<C2> {\n switch (entry.type) {\n case \"column\":\n return {\n type: \"column\",\n column: cb(entry.column),\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return entry;\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => mapJoinEntry(col, cb)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: mapJoinEntry(entry.primary, cb),\n secondary: entry.secondary.map((col) => mapJoinEntry(col, cb)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction cmpJoinEntries(lhs: JoinEntry<PObjectId>, rhs: JoinEntry<PObjectId>): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n const type = lhs.type;\n switch (type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column ? -1 : 1;\n case \"slicedColumn\":\n case \"artificialColumn\":\n return lhs.newId < (rhs as typeof lhs).newId ? -1 : 1;\n case \"inlineColumn\": {\n return lhs.column.id < (rhs as typeof lhs).column.id ? -1 : 1;\n }\n case \"inner\":\n case \"full\": {\n const rhsInner = rhs as typeof lhs;\n if (lhs.entries.length !== rhsInner.entries.length) {\n return lhs.entries.length - rhsInner.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpJoinEntries(lhs.entries[i], rhsInner.entries[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n case \"outer\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpJoinEntries(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) {\n return cmp;\n }\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpJoinEntries(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n default:\n assertNever(type);\n }\n}\n\nexport function sortJoinEntry(entry: JoinEntry<PObjectId>): JoinEntry<PObjectId> {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return entry;\n case \"artificialColumn\": {\n const sortedAxesIndices = entry.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...entry,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"inner\":\n case \"full\": {\n const sortedEntries = entry.entries.map(sortJoinEntry);\n sortedEntries.sort(cmpJoinEntries);\n return {\n ...entry,\n entries: sortedEntries,\n };\n }\n case \"outer\": {\n const sortedSecondary = entry.secondary.map(sortJoinEntry);\n sortedSecondary.sort(cmpJoinEntries);\n return {\n ...entry,\n primary: sortJoinEntry(entry.primary),\n secondary: sortedSecondary,\n };\n }\n default:\n assertNever(entry);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table_calculate.cjs","names":["canonicalizeJson","getAxisId","mapSpecQueryColumns"],"sources":["../../../src/drivers/pframe/table_calculate.ts"],"sourcesContent":["import type { PTableColumnId, PTableColumnSpec } from \"./table_common\";\nimport type { PTableVector } from \"./data_types\";\nimport type { PObjectId } from \"../../pool\";\nimport { assertNever } from \"../../util\";\nimport { getAxisId, type PColumn } from \"./spec/spec\";\nimport type { PColumnValues } from \"./data_info\";\nimport type { SpecQuery } from \"./query/query_spec\";\nimport { canonicalizeJson } from \"../../json\";\nimport { mapSpecQueryColumns } from \"./query\";\n\n/** Defines a terminal column node in the join request tree */\nexport interface ColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"column\";\n\n /** Local column */\n readonly column: Col;\n}\n\n/**\n * Axis filter slicing target axis from column axes.\n * If the axis has parents or is a parent, slicing cannot be applied (an error will be thrown).\n * */\nexport interface ConstantAxisFilter {\n /** Filter type discriminator */\n readonly type: \"constant\";\n\n /** Index of axis to slice (zero-based) */\n readonly axisIndex: number;\n\n /** Equality filter reference value, see {@link SingleValueEqualPredicate} */\n readonly constant: string | number;\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface SlicedColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"slicedColumn\";\n\n /** Local column */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Non-empty list of axis filters */\n readonly axisFilters: ConstantAxisFilter[];\n}\n\nexport interface ArtificialColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"artificialColumn\";\n\n /** Column definition */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Indices of axes to pick from the column (zero-based) */\n readonly axesIndices: number[];\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface InlineColumnJoinEntry {\n /** Node type discriminator */\n readonly type: \"inlineColumn\";\n\n /** Column definition */\n readonly column: PColumn<PColumnValues>;\n}\n\n/**\n * Defines a join request tree node that will output only records present in\n * all child nodes ({@link entries}).\n * */\nexport interface InnerJoin<Col> {\n /** Node type discriminator */\n readonly type: \"inner\";\n\n /** Child nodes to be inner joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present at\n * least in one of the child nodes ({@link entries}), values for those PColumns\n * that lack corresponding combinations of axis values will be null.\n * */\nexport interface FullJoin<Col> {\n /** Node type discriminator */\n readonly type: \"full\";\n\n /** Child nodes to be fully outer joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present in\n * {@link primary} child node, and records from the {@link secondary} nodes will\n * be added to the output only if present, values for those PColumns from the\n * {@link secondary} list, that lack corresponding combinations of axis values\n * will be null.\n *\n * This node can be thought as a chain of SQL LEFT JOIN operations starting from\n * the {@link primary} node and adding {@link secondary} nodes one by one.\n * */\nexport interface OuterJoin<Col> {\n /** Node type discriminator */\n readonly type: \"outer\";\n\n /** Primes the join operation. Left part of LEFT JOIN. */\n readonly primary: JoinEntry<Col>;\n\n /** Driven nodes, giving their values only if primary node have corresponding\n * nodes. Right parts of LEFT JOIN chain. */\n readonly secondary: JoinEntry<Col>[];\n}\n\n/**\n * Base type of all join request tree nodes. Join request tree allows to combine\n * information from multiple PColumns into a PTable. Correlation between records\n * is performed by looking for records with the same values in common axis between\n * the PColumns. Common axis are those axis which have equal {@link AxisId} derived\n * from the columns axes spec.\n * */\nexport type JoinEntry<Col> =\n | ColumnJoinEntry<Col>\n | SlicedColumnJoinEntry<Col>\n | ArtificialColumnJoinEntry<Col>\n | InlineColumnJoinEntry\n | InnerJoin<Col>\n | FullJoin<Col>\n | OuterJoin<Col>;\n\n/** Container representing whole data stored in specific PTable column. */\nexport interface FullPTableColumnData {\n /** Unified spec */\n readonly spec: PTableColumnSpec;\n\n /** Data */\n readonly data: PTableVector;\n}\n\nexport interface SingleValueIsNAPredicate {\n /** Comparison operator */\n readonly operator: \"IsNA\";\n}\n\nexport interface SingleValueEqualPredicate {\n /** Comparison operator */\n readonly operator: \"Equal\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueInSetPredicate {\n /** Comparison operator */\n readonly operator: \"InSet\";\n\n /** Reference values, NA values will not match */\n readonly references: (string | number)[];\n}\n\nexport interface SingleValueIEqualPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"IEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string;\n}\n\nexport interface SingleValueLessPredicate {\n /** Comparison operator */\n readonly operator: \"Less\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueLessOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"LessOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterPredicate {\n /** Comparison operator */\n readonly operator: \"Greater\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"GreaterOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueStringContainsPredicate {\n /** Comparison operator */\n readonly operator: \"StringContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueStringIContainsPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueMatchesPredicate {\n /** Comparison operator */\n readonly operator: \"Matches\";\n\n /** Regular expression, NA values are skipped */\n readonly regex: string;\n}\n\nexport interface SingleValueStringContainsFuzzyPredicate {\n /** Comparison operator */\n readonly operator: \"StringContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueStringIContainsFuzzyPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueNotPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Not\";\n\n /** Operand to negate */\n readonly operand: SingleValuePredicateV2;\n}\n\nexport interface SingleValueAndPredicateV2 {\n /** Comparison operator */\n readonly operator: \"And\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\nexport interface SingleValueOrPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Or\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\n/** Filtering predicate for a single axis or column value */\nexport type SingleValuePredicateV2 =\n | SingleValueIsNAPredicate\n | SingleValueEqualPredicate\n | SingleValueInSetPredicate\n | SingleValueLessPredicate\n | SingleValueLessOrEqualPredicate\n | SingleValueGreaterPredicate\n | SingleValueGreaterOrEqualPredicate\n | SingleValueStringContainsPredicate\n | SingleValueMatchesPredicate\n | SingleValueStringContainsFuzzyPredicate\n | SingleValueNotPredicateV2\n | SingleValueAndPredicateV2\n | SingleValueOrPredicateV2\n | SingleValueIEqualPredicate\n | SingleValueStringIContainsPredicate\n | SingleValueStringIContainsFuzzyPredicate;\n\n/**\n * Filter PTable records based on specific axis or column value. If this is an\n * axis value filter and the axis is part of a partitioning key in some of the\n * source PColumns, the filter will be pushed down to those columns, so only\n * specific partitions will be retrieved from the remote storage.\n * */\nexport interface PTableRecordSingleValueFilterV2 {\n /** Filter type discriminator */\n readonly type: \"bySingleColumnV2\";\n\n /** Target axis selector to examine values from */\n readonly column: PTableColumnId;\n\n /** Value predicate */\n readonly predicate: SingleValuePredicateV2;\n}\n\n/** Generic PTable records filter */\nexport type PTableRecordFilter = PTableRecordSingleValueFilterV2;\n\n/** Sorting parameters for a PTable. */\nexport type PTableSorting = {\n /** Unified column identifier */\n readonly column: PTableColumnId;\n\n /** Sorting order */\n readonly ascending: boolean;\n\n /** Sorting in respect to NA and absent values */\n readonly naAndAbsentAreLeastValues: boolean;\n};\n\n/** Information required to instantiate a PTable. */\nexport interface PTableDef<Col> {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Partition filters */\n readonly partitionFilters: PTableRecordFilter[];\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n}\n\n/** Information required to instantiate a PTable (V2, query-based). */\nexport interface PTableDefV2<Col> {\n /** Pre-built query spec describing joins, filters and sorting */\n readonly query: SpecQuery<Col>;\n}\n\n/** Request to create and retrieve entirety of data of PTable. */\nexport type CalculateTableDataRequest<Col> = {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n};\n\n/** Response for {@link CalculateTableDataRequest} */\nexport type CalculateTableDataResponse = FullPTableColumnData[];\n\nexport function mapPTableDef<C1, C2>(def: PTableDef<C1>, cb: (c: C1) => C2): PTableDef<C2> {\n return { ...def, src: mapJoinEntry(def.src, cb) };\n}\n\nexport function sortPTableDef(def: PTableDef<PObjectId>): PTableDef<PObjectId> {\n function sortFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n return filters.toSorted((lhs, rhs) => {\n if (lhs.column.type === \"axis\" && rhs.column.type === \"axis\") {\n const lhsId = canonicalizeJson(getAxisId(lhs.column.id));\n const rhsId = canonicalizeJson(getAxisId(rhs.column.id));\n return lhsId < rhsId ? -1 : 1;\n } else if (lhs.column.type === \"column\" && rhs.column.type === \"column\") {\n return lhs.column.id < rhs.column.id ? -1 : 1;\n } else {\n return lhs.column.type === \"axis\" ? -1 : 1;\n }\n });\n }\n return {\n src: sortJoinEntry(def.src),\n partitionFilters: sortFilters(def.partitionFilters),\n filters: sortFilters(def.filters),\n sorting: def.sorting,\n };\n}\n\nexport function mapPTableDefV2<C1, C2>(def: PTableDefV2<C1>, cb: (c: C1) => C2): PTableDefV2<C2> {\n return { query: mapSpecQueryColumns(def.query, cb) };\n}\n\nexport function mapJoinEntry<C1, C2>(entry: JoinEntry<C1>, cb: (c: C1) => C2): JoinEntry<C2> {\n switch (entry.type) {\n case \"column\":\n return {\n type: \"column\",\n column: cb(entry.column),\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return entry;\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => mapJoinEntry(col, cb)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: mapJoinEntry(entry.primary, cb),\n secondary: entry.secondary.map((col) => mapJoinEntry(col, cb)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction cmpJoinEntries(lhs: JoinEntry<PObjectId>, rhs: JoinEntry<PObjectId>): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n const type = lhs.type;\n switch (type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column ? -1 : 1;\n case \"slicedColumn\":\n case \"artificialColumn\":\n return lhs.newId < (rhs as typeof lhs).newId ? -1 : 1;\n case \"inlineColumn\": {\n return lhs.column.id < (rhs as typeof lhs).column.id ? -1 : 1;\n }\n case \"inner\":\n case \"full\": {\n const rhsInner = rhs as typeof lhs;\n if (lhs.entries.length !== rhsInner.entries.length) {\n return lhs.entries.length - rhsInner.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpJoinEntries(lhs.entries[i], rhsInner.entries[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n case \"outer\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpJoinEntries(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) {\n return cmp;\n }\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpJoinEntries(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n default:\n assertNever(type);\n }\n}\n\nexport function sortJoinEntry(entry: JoinEntry<PObjectId>): JoinEntry<PObjectId> {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return entry;\n case \"artificialColumn\": {\n const sortedAxesIndices = entry.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...entry,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"inner\":\n case \"full\": {\n const sortedEntries = entry.entries.map(sortJoinEntry);\n sortedEntries.sort(cmpJoinEntries);\n return {\n ...entry,\n entries: sortedEntries,\n };\n }\n case \"outer\": {\n const sortedSecondary = entry.secondary.map(sortJoinEntry);\n sortedSecondary.sort(cmpJoinEntries);\n return {\n ...entry,\n primary: sortJoinEntry(entry.primary),\n secondary: sortedSecondary,\n };\n }\n default:\n assertNever(entry);\n }\n}\n"],"mappings":";;;;;;;AA8YA,SAAgB,aAAqB,KAAoB,IAAkC;AACzF,QAAO;EAAE,GAAG;EAAK,KAAK,aAAa,IAAI,KAAK,GAAG;EAAE;;AAGnD,SAAgB,cAAc,KAAiD;CAC7E,SAAS,YAAY,SAAqD;AACxE,SAAO,QAAQ,UAAU,KAAK,QAAQ;AACpC,OAAI,IAAI,OAAO,SAAS,UAAU,IAAI,OAAO,SAAS,OAGpD,QAFcA,8BAAiBC,uBAAU,IAAI,OAAO,GAAG,CAAC,GAC1CD,8BAAiBC,uBAAU,IAAI,OAAO,GAAG,CAAC,GACjC,KAAK;YACnB,IAAI,OAAO,SAAS,YAAY,IAAI,OAAO,SAAS,SAC7D,QAAO,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK;OAE5C,QAAO,IAAI,OAAO,SAAS,SAAS,KAAK;IAE3C;;AAEJ,QAAO;EACL,KAAK,cAAc,IAAI,IAAI;EAC3B,kBAAkB,YAAY,IAAI,iBAAiB;EACnD,SAAS,YAAY,IAAI,QAAQ;EACjC,SAAS,IAAI;EACd;;AAGH,SAAgB,eAAuB,KAAsB,IAAoC;AAC/F,QAAO,EAAE,OAAOC,kCAAoB,IAAI,OAAO,GAAG,EAAE;;AAGtD,SAAgB,aAAqB,OAAsB,IAAkC;AAC3F,SAAQ,MAAM,MAAd;EACE,KAAK,SACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACzB;EACH,KAAK,eACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACxB,OAAO,MAAM;GACb,aAAa,MAAM;GACpB;EACH,KAAK,mBACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACxB,OAAO,MAAM;GACb,aAAa,MAAM;GACpB;EACH,KAAK,eACH,QAAO;EACT,KAAK;EACL,KAAK,OACH,QAAO;GACL,MAAM,MAAM;GACZ,SAAS,MAAM,QAAQ,KAAK,QAAQ,aAAa,KAAK,GAAG,CAAC;GAC3D;EACH,KAAK,QACH,QAAO;GACL,MAAM;GACN,SAAS,aAAa,MAAM,SAAS,GAAG;GACxC,WAAW,MAAM,UAAU,KAAK,QAAQ,aAAa,KAAK,GAAG,CAAC;GAC/D;EACH,QACE,0BAAY,MAAM;;;AAIxB,SAAS,eAAe,KAA2B,KAAmC;AACpF,KAAI,IAAI,SAAS,IAAI,KACnB,QAAO,IAAI,OAAO,IAAI,OAAO,KAAK;CAEpC,MAAM,OAAO,IAAI;AACjB,SAAQ,MAAR;EACE,KAAK,SACH,QAAO,IAAI,SAAU,IAAmB,SAAS,KAAK;EACxD,KAAK;EACL,KAAK,mBACH,QAAO,IAAI,QAAS,IAAmB,QAAQ,KAAK;EACtD,KAAK,eACH,QAAO,IAAI,OAAO,KAAM,IAAmB,OAAO,KAAK,KAAK;EAE9D,KAAK;EACL,KAAK,QAAQ;GACX,MAAM,WAAW;AACjB,OAAI,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAC1C,QAAO,IAAI,QAAQ,SAAS,SAAS,QAAQ;AAE/C,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;IAC3C,MAAM,MAAM,eAAe,IAAI,QAAQ,IAAI,SAAS,QAAQ,GAAG;AAC/D,QAAI,QAAQ,EACV,QAAO;;AAGX,UAAO;;EAET,KAAK,SAAS;GACZ,MAAM,WAAW;GACjB,MAAM,MAAM,eAAe,IAAI,SAAS,SAAS,QAAQ;AACzD,OAAI,QAAQ,EACV,QAAO;AAET,OAAI,IAAI,UAAU,WAAW,SAAS,UAAU,OAC9C,QAAO,IAAI,UAAU,SAAS,SAAS,UAAU;AAEnD,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,eAAe,IAAI,UAAU,IAAI,SAAS,UAAU,GAAG;AACnE,QAAI,QAAQ,EACV,QAAO;;AAGX,UAAO;;EAET,QACE,0BAAY,KAAK;;;AAIvB,SAAgB,cAAc,OAAmD;AAC/E,SAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK;EACL,KAAK,eACH,QAAO;EACT,KAAK,oBAAoB;GACvB,MAAM,oBAAoB,MAAM,YAAY,UAAU,KAAK,QAAQ,MAAM,IAAI;AAC7E,UAAO;IACL,GAAG;IACH,aAAa;IACd;;EAEH,KAAK;EACL,KAAK,QAAQ;GACX,MAAM,gBAAgB,MAAM,QAAQ,IAAI,cAAc;AACtD,iBAAc,KAAK,eAAe;AAClC,UAAO;IACL,GAAG;IACH,SAAS;IACV;;EAEH,KAAK,SAAS;GACZ,MAAM,kBAAkB,MAAM,UAAU,IAAI,cAAc;AAC1D,mBAAgB,KAAK,eAAe;AACpC,UAAO;IACL,GAAG;IACH,SAAS,cAAc,MAAM,QAAQ;IACrC,WAAW;IACZ;;EAEH,QACE,0BAAY,MAAM"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { PObjectId } from "../../pool/spec.js";
|
|
2
|
-
import "../../pool/index.js";
|
|
3
1
|
import { PColumn } from "./spec/spec.js";
|
|
4
2
|
import { PColumnValues } from "./data_info.js";
|
|
5
3
|
import { PTableVector } from "./data_types.js";
|
|
6
4
|
import { PTableColumnId, PTableColumnSpec } from "./table_common.js";
|
|
7
5
|
import { SpecQuery } from "./query/query_spec.js";
|
|
6
|
+
import { PObjectId } from "../../pool/spec.js";
|
|
7
|
+
import "../../pool/index.js";
|
|
8
8
|
|
|
9
9
|
//#region src/drivers/pframe/table_calculate.d.ts
|
|
10
10
|
/** Defines a terminal column node in the join request tree */
|
|
@@ -67,8 +67,7 @@ interface InnerJoin<Col> {
|
|
|
67
67
|
/**
|
|
68
68
|
* Defines a join request tree node that will output all records present at
|
|
69
69
|
* least in one of the child nodes ({@link entries}), values for those PColumns
|
|
70
|
-
* that
|
|
71
|
-
* see {@link PTableVector.absent}.
|
|
70
|
+
* that lack corresponding combinations of axis values will be null.
|
|
72
71
|
* */
|
|
73
72
|
interface FullJoin<Col> {
|
|
74
73
|
/** Node type discriminator */
|
|
@@ -80,8 +79,8 @@ interface FullJoin<Col> {
|
|
|
80
79
|
* Defines a join request tree node that will output all records present in
|
|
81
80
|
* {@link primary} child node, and records from the {@link secondary} nodes will
|
|
82
81
|
* be added to the output only if present, values for those PColumns from the
|
|
83
|
-
* {@link secondary} list, that
|
|
84
|
-
* will be
|
|
82
|
+
* {@link secondary} list, that lack corresponding combinations of axis values
|
|
83
|
+
* will be null.
|
|
85
84
|
*
|
|
86
85
|
* This node can be thought as a chain of SQL LEFT JOIN operations starting from
|
|
87
86
|
* the {@link primary} node and adding {@link secondary} nodes one by one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table_calculate.js","names":[],"sources":["../../../src/drivers/pframe/table_calculate.ts"],"sourcesContent":["import type { PTableColumnId, PTableColumnSpec } from \"./table_common\";\nimport type { PTableVector } from \"./data_types\";\nimport type { PObjectId } from \"../../pool\";\nimport { assertNever } from \"../../util\";\nimport { getAxisId, type PColumn } from \"./spec/spec\";\nimport type { PColumnValues } from \"./data_info\";\nimport type { SpecQuery } from \"./query/query_spec\";\nimport { canonicalizeJson } from \"../../json\";\nimport { mapSpecQueryColumns } from \"./query\";\n\n/** Defines a terminal column node in the join request tree */\nexport interface ColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"column\";\n\n /** Local column */\n readonly column: Col;\n}\n\n/**\n * Axis filter slicing target axis from column axes.\n * If the axis has parents or is a parent, slicing cannot be applied (an error will be thrown).\n * */\nexport interface ConstantAxisFilter {\n /** Filter type discriminator */\n readonly type: \"constant\";\n\n /** Index of axis to slice (zero-based) */\n readonly axisIndex: number;\n\n /** Equality filter reference value, see {@link SingleValueEqualPredicate} */\n readonly constant: string | number;\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface SlicedColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"slicedColumn\";\n\n /** Local column */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Non-empty list of axis filters */\n readonly axisFilters: ConstantAxisFilter[];\n}\n\nexport interface ArtificialColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"artificialColumn\";\n\n /** Column definition */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Indices of axes to pick from the column (zero-based) */\n readonly axesIndices: number[];\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface InlineColumnJoinEntry {\n /** Node type discriminator */\n readonly type: \"inlineColumn\";\n\n /** Column definition */\n readonly column: PColumn<PColumnValues>;\n}\n\n/**\n * Defines a join request tree node that will output only records present in\n * all child nodes ({@link entries}).\n * */\nexport interface InnerJoin<Col> {\n /** Node type discriminator */\n readonly type: \"inner\";\n\n /** Child nodes to be inner joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present at\n * least in one of the child nodes ({@link entries}), values for those PColumns\n * that lacks corresponding combinations of axis values will be marked as absent,\n * see {@link PTableVector.absent}.\n * */\nexport interface FullJoin<Col> {\n /** Node type discriminator */\n readonly type: \"full\";\n\n /** Child nodes to be fully outer joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present in\n * {@link primary} child node, and records from the {@link secondary} nodes will\n * be added to the output only if present, values for those PColumns from the\n * {@link secondary} list, that lacks corresponding combinations of axis values\n * will be marked as absent, see {@link PTableVector.absent}.\n *\n * This node can be thought as a chain of SQL LEFT JOIN operations starting from\n * the {@link primary} node and adding {@link secondary} nodes one by one.\n * */\nexport interface OuterJoin<Col> {\n /** Node type discriminator */\n readonly type: \"outer\";\n\n /** Primes the join operation. Left part of LEFT JOIN. */\n readonly primary: JoinEntry<Col>;\n\n /** Driven nodes, giving their values only if primary node have corresponding\n * nodes. Right parts of LEFT JOIN chain. */\n readonly secondary: JoinEntry<Col>[];\n}\n\n/**\n * Base type of all join request tree nodes. Join request tree allows to combine\n * information from multiple PColumns into a PTable. Correlation between records\n * is performed by looking for records with the same values in common axis between\n * the PColumns. Common axis are those axis which have equal {@link AxisId} derived\n * from the columns axes spec.\n * */\nexport type JoinEntry<Col> =\n | ColumnJoinEntry<Col>\n | SlicedColumnJoinEntry<Col>\n | ArtificialColumnJoinEntry<Col>\n | InlineColumnJoinEntry\n | InnerJoin<Col>\n | FullJoin<Col>\n | OuterJoin<Col>;\n\n/** Container representing whole data stored in specific PTable column. */\nexport interface FullPTableColumnData {\n /** Unified spec */\n readonly spec: PTableColumnSpec;\n\n /** Data */\n readonly data: PTableVector;\n}\n\nexport interface SingleValueIsNAPredicate {\n /** Comparison operator */\n readonly operator: \"IsNA\";\n}\n\nexport interface SingleValueEqualPredicate {\n /** Comparison operator */\n readonly operator: \"Equal\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueInSetPredicate {\n /** Comparison operator */\n readonly operator: \"InSet\";\n\n /** Reference values, NA values will not match */\n readonly references: (string | number)[];\n}\n\nexport interface SingleValueIEqualPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"IEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string;\n}\n\nexport interface SingleValueLessPredicate {\n /** Comparison operator */\n readonly operator: \"Less\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueLessOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"LessOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterPredicate {\n /** Comparison operator */\n readonly operator: \"Greater\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"GreaterOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueStringContainsPredicate {\n /** Comparison operator */\n readonly operator: \"StringContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueStringIContainsPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueMatchesPredicate {\n /** Comparison operator */\n readonly operator: \"Matches\";\n\n /** Regular expression, NA values are skipped */\n readonly regex: string;\n}\n\nexport interface SingleValueStringContainsFuzzyPredicate {\n /** Comparison operator */\n readonly operator: \"StringContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueStringIContainsFuzzyPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueNotPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Not\";\n\n /** Operand to negate */\n readonly operand: SingleValuePredicateV2;\n}\n\nexport interface SingleValueAndPredicateV2 {\n /** Comparison operator */\n readonly operator: \"And\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\nexport interface SingleValueOrPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Or\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\n/** Filtering predicate for a single axis or column value */\nexport type SingleValuePredicateV2 =\n | SingleValueIsNAPredicate\n | SingleValueEqualPredicate\n | SingleValueInSetPredicate\n | SingleValueLessPredicate\n | SingleValueLessOrEqualPredicate\n | SingleValueGreaterPredicate\n | SingleValueGreaterOrEqualPredicate\n | SingleValueStringContainsPredicate\n | SingleValueMatchesPredicate\n | SingleValueStringContainsFuzzyPredicate\n | SingleValueNotPredicateV2\n | SingleValueAndPredicateV2\n | SingleValueOrPredicateV2\n | SingleValueIEqualPredicate\n | SingleValueStringIContainsPredicate\n | SingleValueStringIContainsFuzzyPredicate;\n\n/**\n * Filter PTable records based on specific axis or column value. If this is an\n * axis value filter and the axis is part of a partitioning key in some of the\n * source PColumns, the filter will be pushed down to those columns, so only\n * specific partitions will be retrieved from the remote storage.\n * */\nexport interface PTableRecordSingleValueFilterV2 {\n /** Filter type discriminator */\n readonly type: \"bySingleColumnV2\";\n\n /** Target axis selector to examine values from */\n readonly column: PTableColumnId;\n\n /** Value predicate */\n readonly predicate: SingleValuePredicateV2;\n}\n\n/** Generic PTable records filter */\nexport type PTableRecordFilter = PTableRecordSingleValueFilterV2;\n\n/** Sorting parameters for a PTable. */\nexport type PTableSorting = {\n /** Unified column identifier */\n readonly column: PTableColumnId;\n\n /** Sorting order */\n readonly ascending: boolean;\n\n /** Sorting in respect to NA and absent values */\n readonly naAndAbsentAreLeastValues: boolean;\n};\n\n/** Information required to instantiate a PTable. */\nexport interface PTableDef<Col> {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Partition filters */\n readonly partitionFilters: PTableRecordFilter[];\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n}\n\n/** Information required to instantiate a PTable (V2, query-based). */\nexport interface PTableDefV2<Col> {\n /** Pre-built query spec describing joins, filters and sorting */\n readonly query: SpecQuery<Col>;\n}\n\n/** Request to create and retrieve entirety of data of PTable. */\nexport type CalculateTableDataRequest<Col> = {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n};\n\n/** Response for {@link CalculateTableDataRequest} */\nexport type CalculateTableDataResponse = FullPTableColumnData[];\n\nexport function mapPTableDef<C1, C2>(def: PTableDef<C1>, cb: (c: C1) => C2): PTableDef<C2> {\n return { ...def, src: mapJoinEntry(def.src, cb) };\n}\n\nexport function sortPTableDef(def: PTableDef<PObjectId>): PTableDef<PObjectId> {\n function sortFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n return filters.toSorted((lhs, rhs) => {\n if (lhs.column.type === \"axis\" && rhs.column.type === \"axis\") {\n const lhsId = canonicalizeJson(getAxisId(lhs.column.id));\n const rhsId = canonicalizeJson(getAxisId(rhs.column.id));\n return lhsId < rhsId ? -1 : 1;\n } else if (lhs.column.type === \"column\" && rhs.column.type === \"column\") {\n return lhs.column.id < rhs.column.id ? -1 : 1;\n } else {\n return lhs.column.type === \"axis\" ? -1 : 1;\n }\n });\n }\n return {\n src: sortJoinEntry(def.src),\n partitionFilters: sortFilters(def.partitionFilters),\n filters: sortFilters(def.filters),\n sorting: def.sorting,\n };\n}\n\nexport function mapPTableDefV2<C1, C2>(def: PTableDefV2<C1>, cb: (c: C1) => C2): PTableDefV2<C2> {\n return { query: mapSpecQueryColumns(def.query, cb) };\n}\n\nexport function mapJoinEntry<C1, C2>(entry: JoinEntry<C1>, cb: (c: C1) => C2): JoinEntry<C2> {\n switch (entry.type) {\n case \"column\":\n return {\n type: \"column\",\n column: cb(entry.column),\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return entry;\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => mapJoinEntry(col, cb)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: mapJoinEntry(entry.primary, cb),\n secondary: entry.secondary.map((col) => mapJoinEntry(col, cb)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction cmpJoinEntries(lhs: JoinEntry<PObjectId>, rhs: JoinEntry<PObjectId>): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n const type = lhs.type;\n switch (type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column ? -1 : 1;\n case \"slicedColumn\":\n case \"artificialColumn\":\n return lhs.newId < (rhs as typeof lhs).newId ? -1 : 1;\n case \"inlineColumn\": {\n return lhs.column.id < (rhs as typeof lhs).column.id ? -1 : 1;\n }\n case \"inner\":\n case \"full\": {\n const rhsInner = rhs as typeof lhs;\n if (lhs.entries.length !== rhsInner.entries.length) {\n return lhs.entries.length - rhsInner.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpJoinEntries(lhs.entries[i], rhsInner.entries[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n case \"outer\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpJoinEntries(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) {\n return cmp;\n }\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpJoinEntries(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n default:\n assertNever(type);\n }\n}\n\nexport function sortJoinEntry(entry: JoinEntry<PObjectId>): JoinEntry<PObjectId> {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return entry;\n case \"artificialColumn\": {\n const sortedAxesIndices = entry.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...entry,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"inner\":\n case \"full\": {\n const sortedEntries = entry.entries.map(sortJoinEntry);\n sortedEntries.sort(cmpJoinEntries);\n return {\n ...entry,\n entries: sortedEntries,\n };\n }\n case \"outer\": {\n const sortedSecondary = entry.secondary.map(sortJoinEntry);\n sortedSecondary.sort(cmpJoinEntries);\n return {\n ...entry,\n primary: sortJoinEntry(entry.primary),\n secondary: sortedSecondary,\n };\n }\n default:\n assertNever(entry);\n }\n}\n"],"mappings":";;;;;;;AA+YA,SAAgB,aAAqB,KAAoB,IAAkC;AACzF,QAAO;EAAE,GAAG;EAAK,KAAK,aAAa,IAAI,KAAK,GAAG;EAAE;;AAGnD,SAAgB,cAAc,KAAiD;CAC7E,SAAS,YAAY,SAAqD;AACxE,SAAO,QAAQ,UAAU,KAAK,QAAQ;AACpC,OAAI,IAAI,OAAO,SAAS,UAAU,IAAI,OAAO,SAAS,OAGpD,QAFc,iBAAiB,UAAU,IAAI,OAAO,GAAG,CAAC,GAC1C,iBAAiB,UAAU,IAAI,OAAO,GAAG,CAAC,GACjC,KAAK;YACnB,IAAI,OAAO,SAAS,YAAY,IAAI,OAAO,SAAS,SAC7D,QAAO,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK;OAE5C,QAAO,IAAI,OAAO,SAAS,SAAS,KAAK;IAE3C;;AAEJ,QAAO;EACL,KAAK,cAAc,IAAI,IAAI;EAC3B,kBAAkB,YAAY,IAAI,iBAAiB;EACnD,SAAS,YAAY,IAAI,QAAQ;EACjC,SAAS,IAAI;EACd;;AAGH,SAAgB,eAAuB,KAAsB,IAAoC;AAC/F,QAAO,EAAE,OAAO,oBAAoB,IAAI,OAAO,GAAG,EAAE;;AAGtD,SAAgB,aAAqB,OAAsB,IAAkC;AAC3F,SAAQ,MAAM,MAAd;EACE,KAAK,SACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACzB;EACH,KAAK,eACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACxB,OAAO,MAAM;GACb,aAAa,MAAM;GACpB;EACH,KAAK,mBACH,QAAO;GACL,MAAM;GACN,QAAQ,GAAG,MAAM,OAAO;GACxB,OAAO,MAAM;GACb,aAAa,MAAM;GACpB;EACH,KAAK,eACH,QAAO;EACT,KAAK;EACL,KAAK,OACH,QAAO;GACL,MAAM,MAAM;GACZ,SAAS,MAAM,QAAQ,KAAK,QAAQ,aAAa,KAAK,GAAG,CAAC;GAC3D;EACH,KAAK,QACH,QAAO;GACL,MAAM;GACN,SAAS,aAAa,MAAM,SAAS,GAAG;GACxC,WAAW,MAAM,UAAU,KAAK,QAAQ,aAAa,KAAK,GAAG,CAAC;GAC/D;EACH,QACE,aAAY,MAAM;;;AAIxB,SAAS,eAAe,KAA2B,KAAmC;AACpF,KAAI,IAAI,SAAS,IAAI,KACnB,QAAO,IAAI,OAAO,IAAI,OAAO,KAAK;CAEpC,MAAM,OAAO,IAAI;AACjB,SAAQ,MAAR;EACE,KAAK,SACH,QAAO,IAAI,SAAU,IAAmB,SAAS,KAAK;EACxD,KAAK;EACL,KAAK,mBACH,QAAO,IAAI,QAAS,IAAmB,QAAQ,KAAK;EACtD,KAAK,eACH,QAAO,IAAI,OAAO,KAAM,IAAmB,OAAO,KAAK,KAAK;EAE9D,KAAK;EACL,KAAK,QAAQ;GACX,MAAM,WAAW;AACjB,OAAI,IAAI,QAAQ,WAAW,SAAS,QAAQ,OAC1C,QAAO,IAAI,QAAQ,SAAS,SAAS,QAAQ;AAE/C,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;IAC3C,MAAM,MAAM,eAAe,IAAI,QAAQ,IAAI,SAAS,QAAQ,GAAG;AAC/D,QAAI,QAAQ,EACV,QAAO;;AAGX,UAAO;;EAET,KAAK,SAAS;GACZ,MAAM,WAAW;GACjB,MAAM,MAAM,eAAe,IAAI,SAAS,SAAS,QAAQ;AACzD,OAAI,QAAQ,EACV,QAAO;AAET,OAAI,IAAI,UAAU,WAAW,SAAS,UAAU,OAC9C,QAAO,IAAI,UAAU,SAAS,SAAS,UAAU;AAEnD,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,eAAe,IAAI,UAAU,IAAI,SAAS,UAAU,GAAG;AACnE,QAAI,QAAQ,EACV,QAAO;;AAGX,UAAO;;EAET,QACE,aAAY,KAAK;;;AAIvB,SAAgB,cAAc,OAAmD;AAC/E,SAAQ,MAAM,MAAd;EACE,KAAK;EACL,KAAK;EACL,KAAK,eACH,QAAO;EACT,KAAK,oBAAoB;GACvB,MAAM,oBAAoB,MAAM,YAAY,UAAU,KAAK,QAAQ,MAAM,IAAI;AAC7E,UAAO;IACL,GAAG;IACH,aAAa;IACd;;EAEH,KAAK;EACL,KAAK,QAAQ;GACX,MAAM,gBAAgB,MAAM,QAAQ,IAAI,cAAc;AACtD,iBAAc,KAAK,eAAe;AAClC,UAAO;IACL,GAAG;IACH,SAAS;IACV;;EAEH,KAAK,SAAS;GACZ,MAAM,kBAAkB,MAAM,UAAU,IAAI,cAAc;AAC1D,mBAAgB,KAAK,eAAe;AACpC,UAAO;IACL,GAAG;IACH,SAAS,cAAc,MAAM,QAAQ;IACrC,WAAW;IACZ;;EAEH,QACE,aAAY,MAAM"}
|
|
1
|
+
{"version":3,"file":"table_calculate.js","names":[],"sources":["../../../src/drivers/pframe/table_calculate.ts"],"sourcesContent":["import type { PTableColumnId, PTableColumnSpec } from \"./table_common\";\nimport type { PTableVector } from \"./data_types\";\nimport type { PObjectId } from \"../../pool\";\nimport { assertNever } from \"../../util\";\nimport { getAxisId, type PColumn } from \"./spec/spec\";\nimport type { PColumnValues } from \"./data_info\";\nimport type { SpecQuery } from \"./query/query_spec\";\nimport { canonicalizeJson } from \"../../json\";\nimport { mapSpecQueryColumns } from \"./query\";\n\n/** Defines a terminal column node in the join request tree */\nexport interface ColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"column\";\n\n /** Local column */\n readonly column: Col;\n}\n\n/**\n * Axis filter slicing target axis from column axes.\n * If the axis has parents or is a parent, slicing cannot be applied (an error will be thrown).\n * */\nexport interface ConstantAxisFilter {\n /** Filter type discriminator */\n readonly type: \"constant\";\n\n /** Index of axis to slice (zero-based) */\n readonly axisIndex: number;\n\n /** Equality filter reference value, see {@link SingleValueEqualPredicate} */\n readonly constant: string | number;\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface SlicedColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"slicedColumn\";\n\n /** Local column */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Non-empty list of axis filters */\n readonly axisFilters: ConstantAxisFilter[];\n}\n\nexport interface ArtificialColumnJoinEntry<Col> {\n /** Node type discriminator */\n readonly type: \"artificialColumn\";\n\n /** Column definition */\n readonly column: Col;\n\n /** New column id */\n readonly newId: PObjectId;\n\n /** Indices of axes to pick from the column (zero-based) */\n readonly axesIndices: number[];\n}\n\n/** Defines a terminal column node in the join request tree */\nexport interface InlineColumnJoinEntry {\n /** Node type discriminator */\n readonly type: \"inlineColumn\";\n\n /** Column definition */\n readonly column: PColumn<PColumnValues>;\n}\n\n/**\n * Defines a join request tree node that will output only records present in\n * all child nodes ({@link entries}).\n * */\nexport interface InnerJoin<Col> {\n /** Node type discriminator */\n readonly type: \"inner\";\n\n /** Child nodes to be inner joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present at\n * least in one of the child nodes ({@link entries}), values for those PColumns\n * that lack corresponding combinations of axis values will be null.\n * */\nexport interface FullJoin<Col> {\n /** Node type discriminator */\n readonly type: \"full\";\n\n /** Child nodes to be fully outer joined */\n readonly entries: JoinEntry<Col>[];\n}\n\n/**\n * Defines a join request tree node that will output all records present in\n * {@link primary} child node, and records from the {@link secondary} nodes will\n * be added to the output only if present, values for those PColumns from the\n * {@link secondary} list, that lack corresponding combinations of axis values\n * will be null.\n *\n * This node can be thought as a chain of SQL LEFT JOIN operations starting from\n * the {@link primary} node and adding {@link secondary} nodes one by one.\n * */\nexport interface OuterJoin<Col> {\n /** Node type discriminator */\n readonly type: \"outer\";\n\n /** Primes the join operation. Left part of LEFT JOIN. */\n readonly primary: JoinEntry<Col>;\n\n /** Driven nodes, giving their values only if primary node have corresponding\n * nodes. Right parts of LEFT JOIN chain. */\n readonly secondary: JoinEntry<Col>[];\n}\n\n/**\n * Base type of all join request tree nodes. Join request tree allows to combine\n * information from multiple PColumns into a PTable. Correlation between records\n * is performed by looking for records with the same values in common axis between\n * the PColumns. Common axis are those axis which have equal {@link AxisId} derived\n * from the columns axes spec.\n * */\nexport type JoinEntry<Col> =\n | ColumnJoinEntry<Col>\n | SlicedColumnJoinEntry<Col>\n | ArtificialColumnJoinEntry<Col>\n | InlineColumnJoinEntry\n | InnerJoin<Col>\n | FullJoin<Col>\n | OuterJoin<Col>;\n\n/** Container representing whole data stored in specific PTable column. */\nexport interface FullPTableColumnData {\n /** Unified spec */\n readonly spec: PTableColumnSpec;\n\n /** Data */\n readonly data: PTableVector;\n}\n\nexport interface SingleValueIsNAPredicate {\n /** Comparison operator */\n readonly operator: \"IsNA\";\n}\n\nexport interface SingleValueEqualPredicate {\n /** Comparison operator */\n readonly operator: \"Equal\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueInSetPredicate {\n /** Comparison operator */\n readonly operator: \"InSet\";\n\n /** Reference values, NA values will not match */\n readonly references: (string | number)[];\n}\n\nexport interface SingleValueIEqualPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"IEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string;\n}\n\nexport interface SingleValueLessPredicate {\n /** Comparison operator */\n readonly operator: \"Less\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueLessOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"LessOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterPredicate {\n /** Comparison operator */\n readonly operator: \"Greater\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueGreaterOrEqualPredicate {\n /** Comparison operator */\n readonly operator: \"GreaterOrEqual\";\n\n /** Reference value, NA values will not match */\n readonly reference: string | number;\n}\n\nexport interface SingleValueStringContainsPredicate {\n /** Comparison operator */\n readonly operator: \"StringContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueStringIContainsPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContains\";\n\n /** Reference substring, NA values are skipped */\n readonly substring: string;\n}\n\nexport interface SingleValueMatchesPredicate {\n /** Comparison operator */\n readonly operator: \"Matches\";\n\n /** Regular expression, NA values are skipped */\n readonly regex: string;\n}\n\nexport interface SingleValueStringContainsFuzzyPredicate {\n /** Comparison operator */\n readonly operator: \"StringContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueStringIContainsFuzzyPredicate {\n /** Comparison operator (case insensitive) */\n readonly operator: \"StringIContainsFuzzy\";\n\n /** Reference value, NA values are skipped */\n readonly reference: string;\n\n /**\n * Integer specifying the upper bound of edit distance between\n * reference and actual value.\n * When {@link substitutionsOnly} is not defined or set to false\n * Levenshtein distance is used (substitutions and indels)\n * @see https://en.wikipedia.org/wiki/Levenshtein_distance\n * When {@link substitutionsOnly} is set to true\n * Hamming distance is used (substitutions only)\n * @see https://en.wikipedia.org/wiki/Hamming_distance\n */\n readonly maxEdits: number;\n\n /** Changes the type of edit distance in {@link maxEdits} */\n readonly substitutionsOnly?: boolean;\n\n /**\n * Some character in {@link reference} that will match any\n * single character in searched text.\n */\n readonly wildcard?: string;\n}\n\nexport interface SingleValueNotPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Not\";\n\n /** Operand to negate */\n readonly operand: SingleValuePredicateV2;\n}\n\nexport interface SingleValueAndPredicateV2 {\n /** Comparison operator */\n readonly operator: \"And\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\nexport interface SingleValueOrPredicateV2 {\n /** Comparison operator */\n readonly operator: \"Or\";\n\n /** Operands to combine */\n readonly operands: SingleValuePredicateV2[];\n}\n\n/** Filtering predicate for a single axis or column value */\nexport type SingleValuePredicateV2 =\n | SingleValueIsNAPredicate\n | SingleValueEqualPredicate\n | SingleValueInSetPredicate\n | SingleValueLessPredicate\n | SingleValueLessOrEqualPredicate\n | SingleValueGreaterPredicate\n | SingleValueGreaterOrEqualPredicate\n | SingleValueStringContainsPredicate\n | SingleValueMatchesPredicate\n | SingleValueStringContainsFuzzyPredicate\n | SingleValueNotPredicateV2\n | SingleValueAndPredicateV2\n | SingleValueOrPredicateV2\n | SingleValueIEqualPredicate\n | SingleValueStringIContainsPredicate\n | SingleValueStringIContainsFuzzyPredicate;\n\n/**\n * Filter PTable records based on specific axis or column value. If this is an\n * axis value filter and the axis is part of a partitioning key in some of the\n * source PColumns, the filter will be pushed down to those columns, so only\n * specific partitions will be retrieved from the remote storage.\n * */\nexport interface PTableRecordSingleValueFilterV2 {\n /** Filter type discriminator */\n readonly type: \"bySingleColumnV2\";\n\n /** Target axis selector to examine values from */\n readonly column: PTableColumnId;\n\n /** Value predicate */\n readonly predicate: SingleValuePredicateV2;\n}\n\n/** Generic PTable records filter */\nexport type PTableRecordFilter = PTableRecordSingleValueFilterV2;\n\n/** Sorting parameters for a PTable. */\nexport type PTableSorting = {\n /** Unified column identifier */\n readonly column: PTableColumnId;\n\n /** Sorting order */\n readonly ascending: boolean;\n\n /** Sorting in respect to NA and absent values */\n readonly naAndAbsentAreLeastValues: boolean;\n};\n\n/** Information required to instantiate a PTable. */\nexport interface PTableDef<Col> {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Partition filters */\n readonly partitionFilters: PTableRecordFilter[];\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n}\n\n/** Information required to instantiate a PTable (V2, query-based). */\nexport interface PTableDefV2<Col> {\n /** Pre-built query spec describing joins, filters and sorting */\n readonly query: SpecQuery<Col>;\n}\n\n/** Request to create and retrieve entirety of data of PTable. */\nexport type CalculateTableDataRequest<Col> = {\n /** Join tree to populate the PTable */\n readonly src: JoinEntry<Col>;\n\n /** Record filters */\n readonly filters: PTableRecordFilter[];\n\n /** Table sorting */\n readonly sorting: PTableSorting[];\n};\n\n/** Response for {@link CalculateTableDataRequest} */\nexport type CalculateTableDataResponse = FullPTableColumnData[];\n\nexport function mapPTableDef<C1, C2>(def: PTableDef<C1>, cb: (c: C1) => C2): PTableDef<C2> {\n return { ...def, src: mapJoinEntry(def.src, cb) };\n}\n\nexport function sortPTableDef(def: PTableDef<PObjectId>): PTableDef<PObjectId> {\n function sortFilters(filters: PTableRecordFilter[]): PTableRecordFilter[] {\n return filters.toSorted((lhs, rhs) => {\n if (lhs.column.type === \"axis\" && rhs.column.type === \"axis\") {\n const lhsId = canonicalizeJson(getAxisId(lhs.column.id));\n const rhsId = canonicalizeJson(getAxisId(rhs.column.id));\n return lhsId < rhsId ? -1 : 1;\n } else if (lhs.column.type === \"column\" && rhs.column.type === \"column\") {\n return lhs.column.id < rhs.column.id ? -1 : 1;\n } else {\n return lhs.column.type === \"axis\" ? -1 : 1;\n }\n });\n }\n return {\n src: sortJoinEntry(def.src),\n partitionFilters: sortFilters(def.partitionFilters),\n filters: sortFilters(def.filters),\n sorting: def.sorting,\n };\n}\n\nexport function mapPTableDefV2<C1, C2>(def: PTableDefV2<C1>, cb: (c: C1) => C2): PTableDefV2<C2> {\n return { query: mapSpecQueryColumns(def.query, cb) };\n}\n\nexport function mapJoinEntry<C1, C2>(entry: JoinEntry<C1>, cb: (c: C1) => C2): JoinEntry<C2> {\n switch (entry.type) {\n case \"column\":\n return {\n type: \"column\",\n column: cb(entry.column),\n };\n case \"slicedColumn\":\n return {\n type: \"slicedColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axisFilters: entry.axisFilters,\n };\n case \"artificialColumn\":\n return {\n type: \"artificialColumn\",\n column: cb(entry.column),\n newId: entry.newId,\n axesIndices: entry.axesIndices,\n };\n case \"inlineColumn\":\n return entry;\n case \"inner\":\n case \"full\":\n return {\n type: entry.type,\n entries: entry.entries.map((col) => mapJoinEntry(col, cb)),\n };\n case \"outer\":\n return {\n type: \"outer\",\n primary: mapJoinEntry(entry.primary, cb),\n secondary: entry.secondary.map((col) => mapJoinEntry(col, cb)),\n };\n default:\n assertNever(entry);\n }\n}\n\nfunction cmpJoinEntries(lhs: JoinEntry<PObjectId>, rhs: JoinEntry<PObjectId>): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n const type = lhs.type;\n switch (type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column ? -1 : 1;\n case \"slicedColumn\":\n case \"artificialColumn\":\n return lhs.newId < (rhs as typeof lhs).newId ? -1 : 1;\n case \"inlineColumn\": {\n return lhs.column.id < (rhs as typeof lhs).column.id ? -1 : 1;\n }\n case \"inner\":\n case \"full\": {\n const rhsInner = rhs as typeof lhs;\n if (lhs.entries.length !== rhsInner.entries.length) {\n return lhs.entries.length - rhsInner.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpJoinEntries(lhs.entries[i], rhsInner.entries[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n case \"outer\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpJoinEntries(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) {\n return cmp;\n }\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpJoinEntries(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return 0;\n }\n default:\n assertNever(type);\n }\n}\n\nexport function sortJoinEntry(entry: JoinEntry<PObjectId>): JoinEntry<PObjectId> {\n switch (entry.type) {\n case \"column\":\n case \"slicedColumn\":\n case \"inlineColumn\":\n return entry;\n case \"artificialColumn\": {\n const sortedAxesIndices = entry.axesIndices.toSorted((lhs, rhs) => lhs - rhs);\n return {\n ...entry,\n axesIndices: sortedAxesIndices,\n };\n }\n case \"inner\":\n case \"full\": {\n const sortedEntries = entry.entries.map(sortJoinEntry);\n sortedEntries.sort(cmpJoinEntries);\n return {\n ...entry,\n entries: sortedEntries,\n };\n }\n case \"outer\": {\n const sortedSecondary = entry.secondary.map(sortJoinEntry);\n sortedSecondary.sort(cmpJoinEntries);\n return {\n ...entry,\n primary: sortJoinEntry(entry.primary),\n secondary: sortedSecondary,\n };\n }\n default:\n assertNever(entry);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { AxisId, AxisSpec, PColumnSpec } from "./spec/spec.js";
|
|
1
2
|
import { PObjectId } from "../../pool/spec.js";
|
|
2
3
|
import "../../pool/index.js";
|
|
3
|
-
import { AxisId, AxisSpec, PColumnSpec } from "./spec/spec.js";
|
|
4
4
|
|
|
5
5
|
//#region src/drivers/pframe/table_common.d.ts
|
|
6
6
|
type PTableColumnSpecAxis = {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { PObjectId } from "../../pool/spec.js";
|
|
2
|
-
import "../../pool/index.js";
|
|
3
1
|
import { AxisId } from "./spec/spec.js";
|
|
4
2
|
import { PTableVector } from "./data_types.js";
|
|
5
3
|
import { PTableRecordFilter } from "./table_calculate.js";
|
|
4
|
+
import { PObjectId } from "../../pool/spec.js";
|
|
5
|
+
import "../../pool/index.js";
|
|
6
6
|
|
|
7
7
|
//#region src/drivers/pframe/unique_values.d.ts
|
|
8
8
|
/** Calculate set of unique values for a specific axis for the filtered set of records */
|
package/dist/errors.cjs
CHANGED
|
@@ -22,6 +22,42 @@ function hasAbortError(error) {
|
|
|
22
22
|
function isAggregateError(error) {
|
|
23
23
|
return error instanceof Error && error.name === "AggregateError";
|
|
24
24
|
}
|
|
25
|
+
var ServiceError = class extends Error {
|
|
26
|
+
name = "ServiceError";
|
|
27
|
+
};
|
|
28
|
+
function isServiceError(error) {
|
|
29
|
+
return error instanceof Error && (error.name === "ServiceError" || error.name.startsWith("ServiceError."));
|
|
30
|
+
}
|
|
31
|
+
var ServiceInvalidIdError = class extends ServiceError {
|
|
32
|
+
name = "ServiceError.InvalidId";
|
|
33
|
+
};
|
|
34
|
+
function isServiceInvalidIdError(error) {
|
|
35
|
+
return error instanceof Error && error.name === "ServiceError.InvalidId";
|
|
36
|
+
}
|
|
37
|
+
var ServiceAlreadyRegisteredError = class extends ServiceError {
|
|
38
|
+
name = "ServiceError.AlreadyRegistered";
|
|
39
|
+
};
|
|
40
|
+
function isServiceAlreadyRegisteredError(error) {
|
|
41
|
+
return error instanceof Error && error.name === "ServiceError.AlreadyRegistered";
|
|
42
|
+
}
|
|
43
|
+
var ServiceInjectionError = class extends ServiceError {
|
|
44
|
+
name = "ServiceError.Injection";
|
|
45
|
+
};
|
|
46
|
+
function isServiceInjectionError(error) {
|
|
47
|
+
return error instanceof Error && error.name === "ServiceError.Injection";
|
|
48
|
+
}
|
|
49
|
+
var ServiceNotRegisteredError = class extends ServiceError {
|
|
50
|
+
name = "ServiceError.NotRegistered";
|
|
51
|
+
};
|
|
52
|
+
function isServiceNotRegisteredError(error) {
|
|
53
|
+
return error instanceof Error && error.name === "ServiceError.NotRegistered";
|
|
54
|
+
}
|
|
55
|
+
var ServiceMethodNotFoundError = class extends ServiceError {
|
|
56
|
+
name = "ServiceError.MethodNotFound";
|
|
57
|
+
};
|
|
58
|
+
function isServiceMethodNotFoundError(error) {
|
|
59
|
+
return error instanceof Error && error.name === "ServiceError.MethodNotFound";
|
|
60
|
+
}
|
|
25
61
|
var PFrameError = class extends Error {
|
|
26
62
|
name = "PFrameError";
|
|
27
63
|
};
|
|
@@ -108,6 +144,12 @@ exports.AbortError = AbortError;
|
|
|
108
144
|
exports.PFrameDriverError = PFrameDriverError;
|
|
109
145
|
exports.PFrameError = PFrameError;
|
|
110
146
|
exports.PFrameSpecDriverError = PFrameSpecDriverError;
|
|
147
|
+
exports.ServiceAlreadyRegisteredError = ServiceAlreadyRegisteredError;
|
|
148
|
+
exports.ServiceError = ServiceError;
|
|
149
|
+
exports.ServiceInjectionError = ServiceInjectionError;
|
|
150
|
+
exports.ServiceInvalidIdError = ServiceInvalidIdError;
|
|
151
|
+
exports.ServiceMethodNotFoundError = ServiceMethodNotFoundError;
|
|
152
|
+
exports.ServiceNotRegisteredError = ServiceNotRegisteredError;
|
|
111
153
|
exports.UiError = UiError;
|
|
112
154
|
exports.deserializeError = deserializeError;
|
|
113
155
|
exports.deserializeResult = deserializeResult;
|
|
@@ -118,6 +160,12 @@ exports.isAggregateError = isAggregateError;
|
|
|
118
160
|
exports.isPFrameDriverError = isPFrameDriverError;
|
|
119
161
|
exports.isPFrameError = isPFrameError;
|
|
120
162
|
exports.isPFrameSpecDriverError = isPFrameSpecDriverError;
|
|
163
|
+
exports.isServiceAlreadyRegisteredError = isServiceAlreadyRegisteredError;
|
|
164
|
+
exports.isServiceError = isServiceError;
|
|
165
|
+
exports.isServiceInjectionError = isServiceInjectionError;
|
|
166
|
+
exports.isServiceInvalidIdError = isServiceInvalidIdError;
|
|
167
|
+
exports.isServiceMethodNotFoundError = isServiceMethodNotFoundError;
|
|
168
|
+
exports.isServiceNotRegisteredError = isServiceNotRegisteredError;
|
|
121
169
|
exports.serializeError = serializeError;
|
|
122
170
|
exports.serializeResult = serializeResult;
|
|
123
171
|
exports.unwrapResult = unwrapResult;
|
package/dist/errors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class ServiceError extends Error {\n name = \"ServiceError\";\n}\n\nexport function isServiceError(error: unknown): error is ServiceError {\n return (\n error instanceof Error &&\n (error.name === \"ServiceError\" || error.name.startsWith(\"ServiceError.\"))\n );\n}\n\nexport class ServiceInvalidIdError extends ServiceError {\n name = \"ServiceError.InvalidId\";\n}\n\nexport function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError {\n return error instanceof Error && error.name === \"ServiceError.InvalidId\";\n}\n\nexport class ServiceAlreadyRegisteredError extends ServiceError {\n name = \"ServiceError.AlreadyRegistered\";\n}\n\nexport function isServiceAlreadyRegisteredError(\n error: unknown,\n): error is ServiceAlreadyRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.AlreadyRegistered\";\n}\n\nexport class ServiceInjectionError extends ServiceError {\n name = \"ServiceError.Injection\";\n}\n\nexport function isServiceInjectionError(error: unknown): error is ServiceInjectionError {\n return error instanceof Error && error.name === \"ServiceError.Injection\";\n}\n\nexport class ServiceNotRegisteredError extends ServiceError {\n name = \"ServiceError.NotRegistered\";\n}\n\nexport function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.NotRegistered\";\n}\n\nexport class ServiceMethodNotFoundError extends ServiceError {\n name = \"ServiceError.MethodNotFound\";\n}\n\nexport function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError {\n return error instanceof Error && error.name === \"ServiceError.MethodNotFound\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -16,6 +16,30 @@ declare function isAbortError(error: unknown): error is Error & {
|
|
|
16
16
|
};
|
|
17
17
|
declare function hasAbortError(error: unknown): boolean;
|
|
18
18
|
declare function isAggregateError(error: unknown): error is AggregateError;
|
|
19
|
+
declare class ServiceError extends Error {
|
|
20
|
+
name: string;
|
|
21
|
+
}
|
|
22
|
+
declare function isServiceError(error: unknown): error is ServiceError;
|
|
23
|
+
declare class ServiceInvalidIdError extends ServiceError {
|
|
24
|
+
name: string;
|
|
25
|
+
}
|
|
26
|
+
declare function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError;
|
|
27
|
+
declare class ServiceAlreadyRegisteredError extends ServiceError {
|
|
28
|
+
name: string;
|
|
29
|
+
}
|
|
30
|
+
declare function isServiceAlreadyRegisteredError(error: unknown): error is ServiceAlreadyRegisteredError;
|
|
31
|
+
declare class ServiceInjectionError extends ServiceError {
|
|
32
|
+
name: string;
|
|
33
|
+
}
|
|
34
|
+
declare function isServiceInjectionError(error: unknown): error is ServiceInjectionError;
|
|
35
|
+
declare class ServiceNotRegisteredError extends ServiceError {
|
|
36
|
+
name: string;
|
|
37
|
+
}
|
|
38
|
+
declare function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError;
|
|
39
|
+
declare class ServiceMethodNotFoundError extends ServiceError {
|
|
40
|
+
name: string;
|
|
41
|
+
}
|
|
42
|
+
declare function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError;
|
|
19
43
|
declare class PFrameError extends Error {
|
|
20
44
|
name: string;
|
|
21
45
|
}
|
|
@@ -51,5 +75,5 @@ declare function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<Resul
|
|
|
51
75
|
declare function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError>;
|
|
52
76
|
declare function wrapAndSerializeAsync<T>(callback: () => Promise<T>): Promise<ResultOrError<T, SerializedError>>;
|
|
53
77
|
//#endregion
|
|
54
|
-
export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ResultOrError, SerializedError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
|
|
78
|
+
export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ResultOrError, SerializedError, ServiceAlreadyRegisteredError, ServiceError, ServiceInjectionError, ServiceInvalidIdError, ServiceMethodNotFoundError, ServiceNotRegisteredError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, isServiceAlreadyRegisteredError, isServiceError, isServiceInjectionError, isServiceInvalidIdError, isServiceMethodNotFoundError, isServiceNotRegisteredError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
|
|
55
79
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.js
CHANGED
|
@@ -21,6 +21,42 @@ function hasAbortError(error) {
|
|
|
21
21
|
function isAggregateError(error) {
|
|
22
22
|
return error instanceof Error && error.name === "AggregateError";
|
|
23
23
|
}
|
|
24
|
+
var ServiceError = class extends Error {
|
|
25
|
+
name = "ServiceError";
|
|
26
|
+
};
|
|
27
|
+
function isServiceError(error) {
|
|
28
|
+
return error instanceof Error && (error.name === "ServiceError" || error.name.startsWith("ServiceError."));
|
|
29
|
+
}
|
|
30
|
+
var ServiceInvalidIdError = class extends ServiceError {
|
|
31
|
+
name = "ServiceError.InvalidId";
|
|
32
|
+
};
|
|
33
|
+
function isServiceInvalidIdError(error) {
|
|
34
|
+
return error instanceof Error && error.name === "ServiceError.InvalidId";
|
|
35
|
+
}
|
|
36
|
+
var ServiceAlreadyRegisteredError = class extends ServiceError {
|
|
37
|
+
name = "ServiceError.AlreadyRegistered";
|
|
38
|
+
};
|
|
39
|
+
function isServiceAlreadyRegisteredError(error) {
|
|
40
|
+
return error instanceof Error && error.name === "ServiceError.AlreadyRegistered";
|
|
41
|
+
}
|
|
42
|
+
var ServiceInjectionError = class extends ServiceError {
|
|
43
|
+
name = "ServiceError.Injection";
|
|
44
|
+
};
|
|
45
|
+
function isServiceInjectionError(error) {
|
|
46
|
+
return error instanceof Error && error.name === "ServiceError.Injection";
|
|
47
|
+
}
|
|
48
|
+
var ServiceNotRegisteredError = class extends ServiceError {
|
|
49
|
+
name = "ServiceError.NotRegistered";
|
|
50
|
+
};
|
|
51
|
+
function isServiceNotRegisteredError(error) {
|
|
52
|
+
return error instanceof Error && error.name === "ServiceError.NotRegistered";
|
|
53
|
+
}
|
|
54
|
+
var ServiceMethodNotFoundError = class extends ServiceError {
|
|
55
|
+
name = "ServiceError.MethodNotFound";
|
|
56
|
+
};
|
|
57
|
+
function isServiceMethodNotFoundError(error) {
|
|
58
|
+
return error instanceof Error && error.name === "ServiceError.MethodNotFound";
|
|
59
|
+
}
|
|
24
60
|
var PFrameError = class extends Error {
|
|
25
61
|
name = "PFrameError";
|
|
26
62
|
};
|
|
@@ -103,5 +139,5 @@ async function wrapAndSerializeAsync(callback) {
|
|
|
103
139
|
}
|
|
104
140
|
|
|
105
141
|
//#endregion
|
|
106
|
-
export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
|
|
142
|
+
export { AbortError, PFrameDriverError, PFrameError, PFrameSpecDriverError, ServiceAlreadyRegisteredError, ServiceError, ServiceInjectionError, ServiceInvalidIdError, ServiceMethodNotFoundError, ServiceNotRegisteredError, UiError, deserializeError, deserializeResult, ensureError, hasAbortError, isAbortError, isAggregateError, isPFrameDriverError, isPFrameError, isPFrameSpecDriverError, isServiceAlreadyRegisteredError, isServiceError, isServiceInjectionError, isServiceInvalidIdError, isServiceMethodNotFoundError, isServiceNotRegisteredError, serializeError, serializeResult, unwrapResult, wrapAndSerialize, wrapAndSerializeAsync, wrapAsyncCallback, wrapCallback };
|
|
107
143
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Just for convenience, usually it is an Error with name 'AbortError'\n */\nexport class AbortError extends Error {\n name = \"AbortError\";\n}\n\n/**\n * Throw this to show a message without stack trace in UI\n */\nexport class UiError extends Error {\n name = \"UiError\";\n}\n\nexport function isAbortError(error: unknown): error is Error & { name: \"AbortError\" } {\n return error instanceof Error && error.name === \"AbortError\";\n}\n\nexport function hasAbortError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return error.name === \"AbortError\" || hasAbortError(error.cause);\n}\n\nexport function isAggregateError(error: unknown): error is AggregateError {\n return error instanceof Error && error.name === \"AggregateError\";\n}\n\nexport class ServiceError extends Error {\n name = \"ServiceError\";\n}\n\nexport function isServiceError(error: unknown): error is ServiceError {\n return (\n error instanceof Error &&\n (error.name === \"ServiceError\" || error.name.startsWith(\"ServiceError.\"))\n );\n}\n\nexport class ServiceInvalidIdError extends ServiceError {\n name = \"ServiceError.InvalidId\";\n}\n\nexport function isServiceInvalidIdError(error: unknown): error is ServiceInvalidIdError {\n return error instanceof Error && error.name === \"ServiceError.InvalidId\";\n}\n\nexport class ServiceAlreadyRegisteredError extends ServiceError {\n name = \"ServiceError.AlreadyRegistered\";\n}\n\nexport function isServiceAlreadyRegisteredError(\n error: unknown,\n): error is ServiceAlreadyRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.AlreadyRegistered\";\n}\n\nexport class ServiceInjectionError extends ServiceError {\n name = \"ServiceError.Injection\";\n}\n\nexport function isServiceInjectionError(error: unknown): error is ServiceInjectionError {\n return error instanceof Error && error.name === \"ServiceError.Injection\";\n}\n\nexport class ServiceNotRegisteredError extends ServiceError {\n name = \"ServiceError.NotRegistered\";\n}\n\nexport function isServiceNotRegisteredError(error: unknown): error is ServiceNotRegisteredError {\n return error instanceof Error && error.name === \"ServiceError.NotRegistered\";\n}\n\nexport class ServiceMethodNotFoundError extends ServiceError {\n name = \"ServiceError.MethodNotFound\";\n}\n\nexport function isServiceMethodNotFoundError(error: unknown): error is ServiceMethodNotFoundError {\n return error instanceof Error && error.name === \"ServiceError.MethodNotFound\";\n}\n\nexport class PFrameError extends Error {\n name = \"PFrameError\";\n}\n\nexport function isPFrameError(error: unknown): error is PFrameError {\n return error instanceof Error && error.name === \"PFrameError\";\n}\n\nexport class PFrameDriverError extends PFrameError {\n name = \"PFrameError.Driver\";\n}\n\nexport function isPFrameDriverError(error: unknown): error is PFrameDriverError {\n return error instanceof Error && error.name === \"PFrameError.Driver\";\n}\n\nexport class PFrameSpecDriverError extends PFrameError {\n name = \"PFrameError.SpecDriver\";\n}\n\nexport function isPFrameSpecDriverError(error: unknown): error is PFrameSpecDriverError {\n return error instanceof Error && error.name === \"PFrameError.SpecDriver\";\n}\n\nfunction stringifyValue(value: unknown): string {\n if (typeof value === \"string\") {\n return `String value was thrown: ${value}`;\n }\n\n if (value && typeof value === \"object\") {\n try {\n return `Plain object was thrown: ${JSON.stringify(value)}`;\n } catch (jsonError) {\n const errorMessage = jsonError instanceof Error ? jsonError.message : String(jsonError);\n return `Non-serializable object was thrown (JSON.stringify failed: ${errorMessage}): ${String(value)}`;\n }\n }\n\n return String(`Non-Error value (${typeof value}) was thrown: ${value}`);\n}\n\nexport function ensureError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n\n return new Error(stringifyValue(value));\n}\n\n// Error serialization for IPC/network transmission (Error objects can't be JSON serialized)\n\nexport type SerializedError = {\n name: string;\n message: string;\n stack: string | undefined;\n cause?: SerializedError;\n};\n\nexport function deserializeError(obj: SerializedError): Error {\n const cause = obj.cause ? deserializeError(obj.cause) : undefined;\n\n const error = new Error(obj.message, cause !== undefined ? { cause } : undefined);\n error.name = obj.name || \"Error\";\n error.stack = obj.stack;\n\n return error;\n}\n\nexport function serializeError(e: unknown): SerializedError {\n const error = ensureError(e);\n const cause = error.cause ? serializeError(error.cause) : undefined;\n\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n ...(error.cause !== undefined && { cause }),\n };\n}\n\nexport type ResultOrError<S, F = Error> =\n | {\n value: S;\n error?: undefined;\n }\n | {\n error: F;\n };\n\nexport function unwrapResult<T>(result: ResultOrError<T, Error | SerializedError>): T {\n if (result.error) {\n throw result.error instanceof Error ? result.error : deserializeError(result.error);\n }\n return result.value;\n}\n\nexport function serializeResult<T>(result: ResultOrError<T>): ResultOrError<T, SerializedError> {\n if (result.error) {\n return { error: serializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function deserializeResult<T>(result: ResultOrError<T, SerializedError>): ResultOrError<T> {\n if (result.error) {\n return { error: deserializeError(result.error) };\n }\n return { value: result.value };\n}\n\nexport function wrapCallback<T>(callback: () => T): ResultOrError<T> {\n try {\n const value = callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport async function wrapAsyncCallback<T>(callback: () => Promise<T>): Promise<ResultOrError<T>> {\n try {\n const value = await callback();\n return { value };\n } catch (error) {\n return { error: ensureError(error) };\n }\n}\n\nexport function wrapAndSerialize<T>(callback: () => T): ResultOrError<T, SerializedError> {\n const result = wrapCallback(callback);\n return serializeResult(result);\n}\n\nexport async function wrapAndSerializeAsync<T>(\n callback: () => Promise<T>,\n): Promise<ResultOrError<T, SerializedError>> {\n const result = await wrapAsyncCallback(callback);\n return serializeResult(result);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_flags.cjs","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n};\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n >\n>;\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"block_flags.cjs","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"../services\";\nimport type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n} & ServiceRequireFlags;\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\n// Adding a service to Services automatically satisfies this assertion via ServiceRequireFlags.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n | ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n | keyof ServiceRequireFlags\n >\n>;\n"],"mappings":";;AAyBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { ServiceRequireFlags } from "../services/service_types.js";
|
|
2
|
+
import "../services/index.js";
|
|
3
|
+
|
|
1
4
|
//#region src/flags/block_flags.d.ts
|
|
2
5
|
/**
|
|
3
6
|
* Block-specific feature flags. Define flags that are interpreted by the desktop app to select
|
|
@@ -17,7 +20,7 @@ type BlockCodeKnownFeatureFlags = {
|
|
|
17
20
|
readonly requiresModelAPIVersion?: number;
|
|
18
21
|
readonly requiresUIAPIVersion?: number;
|
|
19
22
|
readonly requiresCreatePTable?: number;
|
|
20
|
-
};
|
|
23
|
+
} & ServiceRequireFlags;
|
|
21
24
|
declare const AllSupportsFeatureFlags: readonly ["supportsLazyState", "supportsPframeQueryRanking"];
|
|
22
25
|
declare const AllRequiresFeatureFlags: readonly ["requiresUIAPIVersion", "requiresCreatePTable", "requiresModelAPIVersion"];
|
|
23
26
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_flags.js","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n};\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n >\n>;\n"],"mappings":";
|
|
1
|
+
{"version":3,"file":"block_flags.js","names":[],"sources":["../../src/flags/block_flags.ts"],"sourcesContent":["import type { ServiceRequireFlags } from \"../services\";\nimport type { ArrayTypeUnion, Assert, Is, IsSubtypeOf } from \"./type_utils\";\n\n/**\n * Block-specific feature flags. Define flags that are interpreted by the desktop app to select\n * appropriate API to expose into Model and UI runtimes.\n *\n * Flags are split into two categories:\n * - supports... - those flags tells the desktop app that the block supports certain APIs, but can without them as well\n * - requires... - those flags tells the desktop app that the block requires certain APIs, and if desktop app doesn't support it, it can't be used in the block\n */\nexport type BlockCodeFeatureFlags = Record<`supports${string}`, boolean | number | undefined> &\n Record<`requires${string}`, boolean | number | undefined>;\n\n/**\n * Known block flags. Flags are set during model compilation, see `BlockModel.create` for more details and for initial values.\n */\nexport type BlockCodeKnownFeatureFlags = {\n readonly supportsLazyState?: boolean;\n readonly supportsPframeQueryRanking?: boolean;\n readonly requiresModelAPIVersion?: number;\n readonly requiresUIAPIVersion?: number;\n readonly requiresCreatePTable?: number;\n} & ServiceRequireFlags;\n\nexport const AllSupportsFeatureFlags = [\"supportsLazyState\", \"supportsPframeQueryRanking\"] as const;\n\nexport const AllRequiresFeatureFlags = [\n \"requiresUIAPIVersion\",\n \"requiresCreatePTable\",\n \"requiresModelAPIVersion\",\n] as const;\n\n//\n// Assertions\n//\n\n// This assertion ensures that BlockConfigV3KnownFeatureFlags is a subtype of BlockConfigV3FeatureFlags.\n// It will produce a compile-time error if there's a mismatch.\ntype _KnownFlagsAreValidFlags = Assert<\n IsSubtypeOf<BlockCodeKnownFeatureFlags, BlockCodeFeatureFlags>\n>;\n\n// This check ensures that all keys in BlockConfigV3FeatureFlags are covered in the arrays above.\n// It will produce a compile-time error if there's a mismatch.\n// Adding a service to Services automatically satisfies this assertion via ServiceRequireFlags.\ntype _AllFlagsAreCovered = Assert<\n Is<\n keyof BlockCodeKnownFeatureFlags,\n | ArrayTypeUnion<typeof AllRequiresFeatureFlags, typeof AllSupportsFeatureFlags>\n | keyof ServiceRequireFlags\n >\n>;\n"],"mappings":";AAyBA,MAAa,0BAA0B,CAAC,qBAAqB,6BAA6B;AAE1F,MAAa,0BAA0B;CACrC;CACA;CACA;CACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";
|
|
2
1
|
import { FilterKeysByPrefix } from "./type_utils.js";
|
|
2
|
+
import { BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";
|
|
3
3
|
|
|
4
4
|
//#region src/flags/flag_utils.d.ts
|
|
5
5
|
declare function checkBlockFlag(flags: BlockCodeFeatureFlags | undefined, flag: keyof BlockCodeKnownFeatureFlags, flagValue?: boolean | number): boolean;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { ArrayTypeUnion, Assert, AssertKeysEqual, FilterKeysByPrefix, Is, IsSubtypeOf } from "./type_utils.js";
|
|
2
|
+
import { IncompatibleFlagsError, RuntimeCapabilities, SupportedRequirement, checkBlockFlag, extractAllRequirements, extractAllSupports } from "./flag_utils.js";
|
|
3
|
+
import { AllRequiresFeatureFlags, AllSupportsFeatureFlags, BlockCodeFeatureFlags, BlockCodeKnownFeatureFlags } from "./block_flags.js";
|