@milaboratories/pl-model-common 1.24.2 → 1.24.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/base32_encode.cjs +11 -11
- package/dist/base32_encode.cjs.map +1 -1
- package/dist/base32_encode.d.ts +1 -1
- package/dist/base32_encode.js +11 -11
- package/dist/base32_encode.js.map +1 -1
- package/dist/base64.cjs +2 -2
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.d.ts +1 -1
- package/dist/base64.d.ts.map +1 -1
- package/dist/base64.js +2 -2
- package/dist/base64.js.map +1 -1
- package/dist/block_state.d.ts +3 -3
- package/dist/bmodel/block_config.cjs +1 -1
- package/dist/bmodel/block_config.cjs.map +1 -1
- package/dist/bmodel/block_config.d.ts +3 -3
- package/dist/bmodel/block_config.d.ts.map +1 -1
- package/dist/bmodel/block_config.js +1 -1
- package/dist/bmodel/block_config.js.map +1 -1
- package/dist/bmodel/code.cjs +1 -1
- package/dist/bmodel/code.cjs.map +1 -1
- package/dist/bmodel/code.d.ts +2 -2
- package/dist/bmodel/code.js +1 -1
- package/dist/bmodel/code.js.map +1 -1
- package/dist/bmodel/container.d.ts +5 -5
- package/dist/bmodel/index.d.ts +5 -5
- package/dist/bmodel/normalization.cjs +17 -17
- package/dist/bmodel/normalization.cjs.map +1 -1
- package/dist/bmodel/normalization.d.ts +2 -2
- package/dist/bmodel/normalization.d.ts.map +1 -1
- package/dist/bmodel/normalization.js +17 -17
- package/dist/bmodel/normalization.js.map +1 -1
- package/dist/bmodel/types.d.ts +1 -1
- package/dist/branding.d.ts +2 -2
- package/dist/common_types.d.ts +1 -1
- package/dist/driver_kit.d.ts +1 -1
- package/dist/drivers/ChunkedStreamReader.cjs +13 -12
- package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
- package/dist/drivers/ChunkedStreamReader.d.ts +2 -2
- package/dist/drivers/ChunkedStreamReader.d.ts.map +1 -1
- package/dist/drivers/ChunkedStreamReader.js +13 -12
- package/dist/drivers/ChunkedStreamReader.js.map +1 -1
- package/dist/drivers/blob.cjs +1 -1
- package/dist/drivers/blob.cjs.map +1 -1
- package/dist/drivers/blob.d.ts +4 -4
- package/dist/drivers/blob.d.ts.map +1 -1
- package/dist/drivers/blob.js +1 -1
- package/dist/drivers/blob.js.map +1 -1
- package/dist/drivers/index.d.ts +8 -8
- package/dist/drivers/log.cjs +1 -1
- package/dist/drivers/log.cjs.map +1 -1
- package/dist/drivers/log.js +1 -1
- package/dist/drivers/log.js.map +1 -1
- package/dist/drivers/ls.cjs +3 -3
- package/dist/drivers/ls.cjs.map +1 -1
- package/dist/drivers/ls.d.ts +6 -6
- package/dist/drivers/ls.d.ts.map +1 -1
- package/dist/drivers/ls.js +3 -3
- package/dist/drivers/ls.js.map +1 -1
- package/dist/drivers/pframe/column_filter.d.ts +1 -1
- package/dist/drivers/pframe/data_info.cjs +119 -110
- package/dist/drivers/pframe/data_info.cjs.map +1 -1
- package/dist/drivers/pframe/data_info.d.ts +10 -10
- package/dist/drivers/pframe/data_info.d.ts.map +1 -1
- package/dist/drivers/pframe/data_info.js +119 -110
- package/dist/drivers/pframe/data_info.js.map +1 -1
- package/dist/drivers/pframe/data_types.cjs +7 -4
- package/dist/drivers/pframe/data_types.cjs.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts +2 -2
- package/dist/drivers/pframe/data_types.d.ts.map +1 -1
- package/dist/drivers/pframe/data_types.js +7 -4
- package/dist/drivers/pframe/data_types.js.map +1 -1
- package/dist/drivers/pframe/driver.d.ts +10 -10
- package/dist/drivers/pframe/driver.d.ts.map +1 -1
- package/dist/drivers/pframe/find_columns.d.ts +2 -2
- package/dist/drivers/pframe/index.d.ts +14 -14
- package/dist/drivers/pframe/linker_columns.cjs +13 -5
- package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
- package/dist/drivers/pframe/linker_columns.d.ts +2 -2
- package/dist/drivers/pframe/linker_columns.d.ts.map +1 -1
- package/dist/drivers/pframe/linker_columns.js +13 -5
- package/dist/drivers/pframe/linker_columns.js.map +1 -1
- package/dist/drivers/pframe/pframe.d.ts +6 -6
- package/dist/drivers/pframe/pframe.d.ts.map +1 -1
- package/dist/drivers/pframe/query/index.d.ts +2 -2
- package/dist/drivers/pframe/query/query_common.d.ts +40 -40
- package/dist/drivers/pframe/query/query_common.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_data.d.ts +2 -2
- package/dist/drivers/pframe/query/query_data.d.ts.map +1 -1
- package/dist/drivers/pframe/query/query_spec.d.ts +3 -3
- package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/anchored.cjs +6 -6
- package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +4 -4
- package/dist/drivers/pframe/spec/anchored.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/anchored.js +6 -6
- package/dist/drivers/pframe/spec/anchored.js.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts +1 -1
- package/dist/drivers/pframe/spec/filtered_column.js +1 -1
- package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
- package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +5 -5
- package/dist/drivers/pframe/spec/ids.js.map +1 -1
- package/dist/drivers/pframe/spec/index.d.ts +6 -6
- package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
- package/dist/drivers/pframe/spec/native_id.d.ts +3 -3
- package/dist/drivers/pframe/spec/native_id.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/native_id.js.map +1 -1
- package/dist/drivers/pframe/spec/selectors.cjs +1 -1
- package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +4 -4
- package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/selectors.js +1 -1
- package/dist/drivers/pframe/spec/selectors.js.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +64 -59
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +15 -15
- package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
- package/dist/drivers/pframe/spec/spec.js +64 -59
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/table.d.ts +2 -2
- package/dist/drivers/pframe/table_calculate.cjs +11 -11
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +30 -30
- package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
- package/dist/drivers/pframe/table_calculate.js +11 -11
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.cjs +4 -4
- package/dist/drivers/pframe/table_common.cjs.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +6 -6
- package/dist/drivers/pframe/table_common.js +4 -4
- package/dist/drivers/pframe/table_common.js.map +1 -1
- package/dist/drivers/pframe/type_util.d.ts.map +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +4 -4
- package/dist/drivers/urls.cjs +2 -2
- package/dist/drivers/urls.cjs.map +1 -1
- package/dist/drivers/urls.d.ts +1 -1
- package/dist/drivers/urls.js +2 -2
- package/dist/drivers/urls.js.map +1 -1
- package/dist/errors.cjs +12 -12
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +12 -12
- package/dist/errors.js.map +1 -1
- package/dist/flags/block_flags.cjs +2 -2
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts.map +1 -1
- package/dist/flags/block_flags.js +2 -2
- package/dist/flags/block_flags.js.map +1 -1
- package/dist/flags/flag_utils.cjs +31 -29
- package/dist/flags/flag_utils.cjs.map +1 -1
- package/dist/flags/flag_utils.d.ts +33 -33
- package/dist/flags/flag_utils.d.ts.map +1 -1
- package/dist/flags/flag_utils.js +31 -29
- package/dist/flags/flag_utils.js.map +1 -1
- package/dist/flags/index.d.ts +3 -3
- package/dist/flags/type_utils.d.ts +1 -1
- package/dist/flags/type_utils.d.ts.map +1 -1
- package/dist/httpAuth.cjs +4 -5
- package/dist/httpAuth.cjs.map +1 -1
- package/dist/httpAuth.d.ts +1 -1
- package/dist/httpAuth.d.ts.map +1 -1
- package/dist/httpAuth.js +4 -5
- package/dist/httpAuth.js.map +1 -1
- package/dist/index.d.ts +19 -19
- package/dist/json.cjs +1 -1
- package/dist/json.cjs.map +1 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js +1 -1
- package/dist/json.js.map +1 -1
- package/dist/navigation.cjs +1 -1
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.d.ts +3 -3
- package/dist/navigation.js +1 -1
- package/dist/navigation.js.map +1 -1
- package/dist/plid.cjs +4 -4
- package/dist/plid.cjs.map +1 -1
- package/dist/plid.d.ts +1 -1
- package/dist/plid.js +4 -4
- package/dist/plid.js.map +1 -1
- package/dist/pool/entry.d.ts +1 -1
- package/dist/pool/index.d.ts +3 -3
- package/dist/pool/query.cjs +23 -23
- package/dist/pool/query.cjs.map +1 -1
- package/dist/pool/query.d.ts +9 -9
- package/dist/pool/query.d.ts.map +1 -1
- package/dist/pool/query.js +23 -23
- package/dist/pool/query.js.map +1 -1
- package/dist/pool/spec.cjs +9 -9
- package/dist/pool/spec.cjs.map +1 -1
- package/dist/pool/spec.d.ts +4 -4
- package/dist/pool/spec.d.ts.map +1 -1
- package/dist/pool/spec.js +9 -9
- package/dist/pool/spec.js.map +1 -1
- package/dist/ref.cjs +20 -18
- package/dist/ref.cjs.map +1 -1
- package/dist/ref.d.ts +1 -1
- package/dist/ref.d.ts.map +1 -1
- package/dist/ref.js +20 -18
- package/dist/ref.js.map +1 -1
- package/dist/utag.d.ts +1 -1
- package/dist/util.cjs +1 -1
- package/dist/util.cjs.map +1 -1
- package/dist/util.js +1 -1
- package/dist/util.js.map +1 -1
- package/dist/value_or_error.cjs.map +1 -1
- package/dist/value_or_error.d.ts.map +1 -1
- package/dist/value_or_error.js.map +1 -1
- package/package.json +18 -17
- package/src/base32_encode.ts +12 -12
- package/src/base64.ts +12 -8
- package/src/block_state.ts +3 -3
- package/src/bmodel/block_config.ts +12 -6
- package/src/bmodel/code.ts +3 -3
- package/src/bmodel/container.ts +5 -5
- package/src/bmodel/index.ts +5 -5
- package/src/bmodel/normalization.ts +33 -25
- package/src/bmodel/types.ts +1 -1
- package/src/branding.ts +2 -2
- package/src/common_types.ts +1 -1
- package/src/driver_kit.ts +1 -1
- package/src/drivers/ChunkedStreamReader.ts +16 -14
- package/src/drivers/blob.ts +7 -11
- package/src/drivers/index.ts +8 -8
- package/src/drivers/log.ts +3 -3
- package/src/drivers/ls.ts +18 -18
- package/src/drivers/pframe/column_filter.ts +1 -1
- package/src/drivers/pframe/data_info.ts +146 -146
- package/src/drivers/pframe/data_types.ts +56 -36
- package/src/drivers/pframe/driver.ts +20 -36
- package/src/drivers/pframe/find_columns.ts +2 -2
- package/src/drivers/pframe/index.ts +14 -14
- package/src/drivers/pframe/linker_columns.test.ts +280 -273
- package/src/drivers/pframe/linker_columns.ts +65 -39
- package/src/drivers/pframe/pframe.ts +6 -9
- package/src/drivers/pframe/query/index.ts +2 -2
- package/src/drivers/pframe/query/query_common.ts +50 -40
- package/src/drivers/pframe/query/query_data.ts +17 -10
- package/src/drivers/pframe/query/query_spec.ts +18 -10
- package/src/drivers/pframe/spec/anchored.ts +44 -33
- package/src/drivers/pframe/spec/filtered_column.ts +2 -2
- package/src/drivers/pframe/spec/ids.ts +6 -6
- package/src/drivers/pframe/spec/index.ts +6 -6
- package/src/drivers/pframe/spec/native_id.ts +7 -9
- package/src/drivers/pframe/spec/selectors.test.ts +170 -146
- package/src/drivers/pframe/spec/selectors.ts +22 -31
- package/src/drivers/pframe/spec/spec.test.ts +163 -176
- package/src/drivers/pframe/spec/spec.ts +132 -117
- package/src/drivers/pframe/table.ts +2 -2
- package/src/drivers/pframe/table_calculate.ts +44 -50
- package/src/drivers/pframe/table_common.ts +10 -10
- package/src/drivers/pframe/type_util.ts +2 -7
- package/src/drivers/pframe/unique_values.ts +4 -4
- package/src/drivers/urls.ts +3 -3
- package/src/errors.test.ts +20 -20
- package/src/errors.ts +24 -20
- package/src/flags/block_flags.ts +8 -7
- package/src/flags/flag_utils.test.ts +94 -73
- package/src/flags/flag_utils.ts +73 -50
- package/src/flags/index.ts +3 -3
- package/src/flags/type_utils.ts +10 -7
- package/src/httpAuth.ts +5 -6
- package/src/index.ts +19 -19
- package/src/json.ts +28 -17
- package/src/navigation.ts +4 -4
- package/src/plid.ts +6 -6
- package/src/pool/entry.ts +1 -1
- package/src/pool/index.ts +3 -3
- package/src/pool/query.ts +52 -56
- package/src/pool/spec.ts +20 -17
- package/src/ref.ts +25 -19
- package/src/utag.ts +1 -1
- package/src/util.ts +1 -1
- package/src/value_or_error.ts +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchored.cjs","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from 'canonicalize';\nimport type { AxisFilter, AxisFilterValue } from './filtered_column';\nimport type { SUniversalPColumnId, UniversalPColumnId } from './ids';\nimport { stringifyColumnId } from './ids';\nimport type { AAxisSelector, AnchorAxisRef, AnchorAxisRefByIdx, AnchoredPColumnId, AnchoredPColumnSelector, AxisSelector, PColumnSelector } from './selectors';\nimport type { AxisId, PColumnSpec } from './spec';\nimport { getAxisId, matchAxisId } from './spec';\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer:\n for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined)\n dAnchor.push([domainKey, dValue]);\n else\n break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey))\n continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === 'number') {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(`Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`);\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(`Axis with name \"${axisIdOrIndex}\" not found in the column specification`);\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(anchors: Record<string, PColumnSpec>, matcher: AnchoredPColumnSelector, options?: ResolveAnchorsOptions): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === 'string') {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes)\n result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(anchors: Record<string, PColumnSpec>, axisRef: AAxisSelector): AxisSelector {\n if (!isAnchorAxisRef(axisRef))\n return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec)\n throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if ('idx' in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if ('name' in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if ('id' in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === 'object' && 'anchor' in value;\n}\n"],"names":["getAxisId","spec","stringifyColumnId","matchAxisId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchored.cjs","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\nimport type { AxisFilter, AxisFilterValue } from \"./filtered_column\";\nimport type { SUniversalPColumnId, UniversalPColumnId } from \"./ids\";\nimport { stringifyColumnId } from \"./ids\";\nimport type {\n AAxisSelector,\n AnchorAxisRef,\n AnchorAxisRefByIdx,\n AnchoredPColumnId,\n AnchoredPColumnSelector,\n AxisSelector,\n PColumnSelector,\n} from \"./selectors\";\nimport type { AxisId, PColumnSpec } from \"./spec\";\nimport { getAxisId, matchAxisId } from \"./spec\";\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer: for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined) dAnchor.push([domainKey, dValue]);\n else break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey)) continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === \"number\") {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(\n `Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`,\n );\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(\n `Axis with name \"${axisIdOrIndex}\" not found in the column specification`,\n );\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(\n anchors: Record<string, PColumnSpec>,\n matcher: AnchoredPColumnSelector,\n options?: ResolveAnchorsOptions,\n): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec) throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === \"string\") {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes) result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(\n anchors: Record<string, PColumnSpec>,\n axisRef: AAxisSelector,\n): AxisSelector {\n if (!isAnchorAxisRef(axisRef)) return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec) throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if (\"idx\" in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if (\"name\" in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if (\"id\" in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === \"object\" && \"anchor\" in value;\n}\n"],"names":["getAxisId","spec","stringifyColumnId","matchAxisId"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { AxisFilter } from
|
|
2
|
-
import type { SUniversalPColumnId, UniversalPColumnId } from
|
|
3
|
-
import type { AnchoredPColumnId, AnchoredPColumnSelector, PColumnSelector } from
|
|
4
|
-
import type { PColumnSpec } from
|
|
1
|
+
import type { AxisFilter } from "./filtered_column";
|
|
2
|
+
import type { SUniversalPColumnId, UniversalPColumnId } from "./ids";
|
|
3
|
+
import type { AnchoredPColumnId, AnchoredPColumnSelector, PColumnSelector } from "./selectors";
|
|
4
|
+
import type { PColumnSpec } from "./spec";
|
|
5
5
|
/**
|
|
6
6
|
* Context for resolving and generating anchored references to columns and axes
|
|
7
7
|
* Maintains maps of known domain values and axes that can be referenced by anchors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchored.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"anchored.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,EAIV,iBAAiB,EACjB,uBAAuB,EAEvB,eAAe,EAChB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAU,WAAW,EAAE,MAAM,QAAQ,CAAC;AAelD;;;GAGG;AACH,qBAAa,iBAAiB;aAiBA,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAhBhE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;IAC9D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAEhE;;;OAGG;gBACyB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC;IAwBhE;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB;IAE5C;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,kBAAkB;IAoFzE;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,mBAAmB;CAG5E;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACpC,OAAO,EAAE,uBAAuB,EAChC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,eAAe,CAuCjB"}
|
|
@@ -106,7 +106,7 @@ class AnchoredIdDeriver {
|
|
|
106
106
|
for (const filter of axisFilters) {
|
|
107
107
|
const [axisIdOrIndex, value] = filter;
|
|
108
108
|
// If it's already a numeric index, validate it
|
|
109
|
-
if (typeof axisIdOrIndex ===
|
|
109
|
+
if (typeof axisIdOrIndex === "number") {
|
|
110
110
|
if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {
|
|
111
111
|
throw new Error(`Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`);
|
|
112
112
|
}
|
|
@@ -161,7 +161,7 @@ function resolveAnchors(anchors, matcher, options) {
|
|
|
161
161
|
if (result.domain) {
|
|
162
162
|
const resolvedDomain = {};
|
|
163
163
|
for (const [key, value] of Object.entries(result.domain)) {
|
|
164
|
-
if (typeof value ===
|
|
164
|
+
if (typeof value === "string") {
|
|
165
165
|
resolvedDomain[key] = value;
|
|
166
166
|
}
|
|
167
167
|
else {
|
|
@@ -194,13 +194,13 @@ function resolveAxisReference(anchors, axisRef) {
|
|
|
194
194
|
const anchorSpec = anchors[anchorId];
|
|
195
195
|
if (!anchorSpec)
|
|
196
196
|
throw new Error(`Anchor "${anchorId}" not found for axis reference`);
|
|
197
|
-
if (
|
|
197
|
+
if ("idx" in axisRef) {
|
|
198
198
|
// AnchorAxisRefByIdx
|
|
199
199
|
if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)
|
|
200
200
|
throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor "${anchorId}"`);
|
|
201
201
|
return anchorSpec.axesSpec[axisRef.idx];
|
|
202
202
|
}
|
|
203
|
-
else if (
|
|
203
|
+
else if ("name" in axisRef) {
|
|
204
204
|
// AnchorAxisRefByName
|
|
205
205
|
const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);
|
|
206
206
|
if (matches.length > 1)
|
|
@@ -209,7 +209,7 @@ function resolveAxisReference(anchors, axisRef) {
|
|
|
209
209
|
throw new Error(`Axis with name "${axisRef.name}" not found in anchor "${anchorId}"`);
|
|
210
210
|
return matches[0];
|
|
211
211
|
}
|
|
212
|
-
else if (
|
|
212
|
+
else if ("id" in axisRef) {
|
|
213
213
|
// AnchorAxisRefByMatcher
|
|
214
214
|
const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));
|
|
215
215
|
if (matches.length > 1)
|
|
@@ -224,7 +224,7 @@ function resolveAxisReference(anchors, axisRef) {
|
|
|
224
224
|
* Type guard to check if a value is an anchored axis reference
|
|
225
225
|
*/
|
|
226
226
|
function isAnchorAxisRef(value) {
|
|
227
|
-
return typeof value ===
|
|
227
|
+
return typeof value === "object" && "anchor" in value;
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
export { AnchoredIdDeriver, resolveAnchors };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchored.js","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from 'canonicalize';\nimport type { AxisFilter, AxisFilterValue } from './filtered_column';\nimport type { SUniversalPColumnId, UniversalPColumnId } from './ids';\nimport { stringifyColumnId } from './ids';\nimport type { AAxisSelector, AnchorAxisRef, AnchorAxisRefByIdx, AnchoredPColumnId, AnchoredPColumnSelector, AxisSelector, PColumnSelector } from './selectors';\nimport type { AxisId, PColumnSpec } from './spec';\nimport { getAxisId, matchAxisId } from './spec';\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer:\n for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined)\n dAnchor.push([domainKey, dValue]);\n else\n break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey))\n continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === 'number') {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(`Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`);\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(`Axis with name \"${axisIdOrIndex}\" not found in the column specification`);\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(anchors: Record<string, PColumnSpec>, matcher: AnchoredPColumnSelector, options?: ResolveAnchorsOptions): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === 'string') {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes)\n result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(anchors: Record<string, PColumnSpec>, axisRef: AAxisSelector): AxisSelector {\n if (!isAnchorAxisRef(axisRef))\n return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec)\n throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if ('idx' in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if ('name' in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if ('id' in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === 'object' && 'anchor' in value;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchored.js","sources":["../../../../src/drivers/pframe/spec/anchored.ts"],"sourcesContent":["import canonicalize from \"canonicalize\";\nimport type { AxisFilter, AxisFilterValue } from \"./filtered_column\";\nimport type { SUniversalPColumnId, UniversalPColumnId } from \"./ids\";\nimport { stringifyColumnId } from \"./ids\";\nimport type {\n AAxisSelector,\n AnchorAxisRef,\n AnchorAxisRefByIdx,\n AnchoredPColumnId,\n AnchoredPColumnSelector,\n AxisSelector,\n PColumnSelector,\n} from \"./selectors\";\nimport type { AxisId, PColumnSpec } from \"./spec\";\nimport { getAxisId, matchAxisId } from \"./spec\";\n\n//\n// Helper functions\n//\n\nfunction axisKey(axis: AxisId): string {\n return canonicalize(getAxisId(axis))!;\n}\n\nfunction domainKey(key: string, value: string): string {\n return JSON.stringify([key, value]);\n}\n\n/**\n * Context for resolving and generating anchored references to columns and axes\n * Maintains maps of known domain values and axes that can be referenced by anchors\n */\nexport class AnchoredIdDeriver {\n private readonly domains = new Map<string, string>();\n private readonly axes = new Map<string, AnchorAxisRefByIdx>();\n /**\n * Domain packs are used to group domain keys that can be anchored to the same anchor\n * This is used to optimize the lookup of domain anchors\n */\n private readonly domainPacks: string[][] = [];\n /**\n * Maps domain packs to anchors\n */\n private readonly domainPackToAnchor = new Map<string, string>();\n\n /**\n * Creates a new anchor context from a set of anchor column specifications\n * @param anchors Record of anchor column specifications indexed by anchor ID\n */\n constructor(public readonly anchors: Record<string, PColumnSpec>) {\n const anchorEntries = Object.entries(anchors);\n anchorEntries.sort((a, b) => a[0].localeCompare(b[0]));\n for (const [anchorId, spec] of anchorEntries) {\n for (let axisIdx = 0; axisIdx < spec.axesSpec.length; axisIdx++) {\n const axis = spec.axesSpec[axisIdx];\n const key = axisKey(axis);\n this.axes.set(key, { anchor: anchorId, idx: axisIdx });\n }\n if (spec.domain !== undefined) {\n const domainEntries = Object.entries(spec.domain);\n domainEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n this.domainPackToAnchor.set(JSON.stringify(domainEntries), anchorId);\n this.domainPacks.push(domainEntries.map(([dKey]) => dKey));\n\n for (const [dKey, dValue] of domainEntries) {\n const key = domainKey(dKey, dValue);\n this.domains.set(key, anchorId);\n }\n }\n }\n }\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @returns An anchored column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec): AnchoredPColumnId;\n\n /**\n * Derives an anchored column identifier from a column specification\n * @param spec Column specification to anchor\n * @param axisFilters Axis filters to apply to the column\n * @returns An anchored and sliced column identifier that can be used to identify columns similar to the input specification\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId;\n\n /**\n * Implementation of derive method\n */\n derive(spec: PColumnSpec, axisFilters?: AxisFilter[]): UniversalPColumnId {\n const result: AnchoredPColumnId = {\n name: spec.name,\n axes: [],\n };\n\n let skipDomains: Set<string> | undefined = undefined;\n if (spec.domain !== undefined) {\n outer: for (const domainPack of this.domainPacks) {\n const dAnchor: string[][] = [];\n for (const domainKey of domainPack) {\n const dValue = spec.domain[domainKey];\n if (dValue !== undefined) dAnchor.push([domainKey, dValue]);\n else break outer;\n }\n const domainAnchor = this.domainPackToAnchor.get(JSON.stringify(dAnchor));\n if (domainAnchor !== undefined) {\n result.domainAnchor = domainAnchor;\n skipDomains = new Set(domainPack);\n break;\n }\n }\n }\n\n for (const [dKey, dValue] of Object.entries(spec.domain ?? {})) {\n if (skipDomains !== undefined && skipDomains.has(dKey)) continue;\n const key = domainKey(dKey, dValue);\n const anchorId = this.domains.get(key);\n result.domain ??= {};\n result.domain[dKey] = anchorId ? { anchor: anchorId } : dValue;\n }\n\n result.axes = spec.axesSpec.map((axis) => {\n const key = axisKey(axis);\n const anchorAxisRef = this.axes.get(key);\n if (anchorAxisRef === undefined) return getAxisId(axis);\n else return anchorAxisRef;\n });\n\n // If no axis filters are provided, return the anchored ID as is\n if (!axisFilters || axisFilters.length === 0) {\n return result;\n }\n\n // Process axis filters and create a sliced column ID\n const resolvedFilters: [number, AxisFilterValue][] = [];\n\n for (const filter of axisFilters) {\n const [axisIdOrIndex, value] = filter;\n\n // If it's already a numeric index, validate it\n if (typeof axisIdOrIndex === \"number\") {\n if (axisIdOrIndex < 0 || axisIdOrIndex >= spec.axesSpec.length) {\n throw new Error(\n `Axis index ${axisIdOrIndex} is out of bounds (0-${spec.axesSpec.length - 1})`,\n );\n }\n resolvedFilters.push([axisIdOrIndex, value]);\n } else {\n // If it's a string (axis name), resolve it to an index\n const axisIndex = spec.axesSpec.findIndex((axis) => axis.name === axisIdOrIndex);\n if (axisIndex === -1) {\n throw new Error(\n `Axis with name \"${axisIdOrIndex}\" not found in the column specification`,\n );\n }\n resolvedFilters.push([axisIndex, value]);\n }\n }\n\n // Sort filters by axis index to ensure consistency\n resolvedFilters.sort((a, b) => a[0] - b[0]);\n\n return {\n source: result,\n axisFilters: resolvedFilters,\n };\n }\n\n /**\n * Derives a canonicalized string representation of an anchored column identifier, can be used as a unique identifier for the column\n * @param spec Column specification to anchor\n * @param axisFilters Optional axis filters to apply to the column\n * @returns A canonicalized string representation of the anchored column identifier\n */\n deriveS(spec: PColumnSpec, axisFilters?: AxisFilter[]): SUniversalPColumnId {\n return stringifyColumnId(this.derive(spec, axisFilters));\n }\n}\n\n/**\n * Options for the resolveAnchors function\n */\nexport type ResolveAnchorsOptions = {\n /**\n * If true, missing domain keys in anchors will be ignored.\n * If false (default), an error will be thrown.\n */\n ignoreMissingDomains?: boolean;\n};\n\n/**\n * Resolves anchored references in a column matcher to create a non-anchored matcher.\n * Doing an opposite operation to {@link AnchorIdDeriver.derive()}.\n *\n * @param anchors - Record of anchor column specifications indexed by anchor id\n * @param matcher - An anchored column matcher (or id, which is subtype of it) containing references that need to be resolved\n * @param options - Options for resolving anchors\n * @returns A non-anchored column matcher with all references resolved to actual values\n */\nexport function resolveAnchors(\n anchors: Record<string, PColumnSpec>,\n matcher: AnchoredPColumnSelector,\n options?: ResolveAnchorsOptions,\n): PColumnSelector {\n const result = { ...matcher };\n const ignoreMissingDomains = options?.ignoreMissingDomains ?? false;\n\n if (result.domainAnchor !== undefined) {\n const anchorSpec = anchors[result.domainAnchor];\n if (!anchorSpec) throw new Error(`Anchor \"${result.domainAnchor}\" not found`);\n\n const anchorDomains = anchorSpec.domain || {};\n result.domain = { ...anchorDomains, ...result.domain };\n delete result.domainAnchor;\n }\n\n if (result.domain) {\n const resolvedDomain: Record<string, string> = {};\n for (const [key, value] of Object.entries(result.domain)) {\n if (typeof value === \"string\") {\n resolvedDomain[key] = value;\n } else {\n // It's an AnchorDomainRef\n const anchorSpec = anchors[value.anchor];\n if (!anchorSpec)\n throw new Error(`Anchor \"${value.anchor}\" not found for domain key \"${key}\"`);\n\n if (!anchorSpec.domain || anchorSpec.domain[key] === undefined) {\n if (!ignoreMissingDomains)\n throw new Error(`Domain key \"${key}\" not found in anchor \"${value.anchor}\"`);\n continue;\n }\n\n resolvedDomain[key] = anchorSpec.domain[key];\n }\n }\n result.domain = resolvedDomain;\n }\n\n if (result.axes) result.axes = result.axes.map((axis) => resolveAxisReference(anchors, axis));\n\n return result as PColumnSelector;\n}\n\n/**\n * Resolves an anchored axis reference to a concrete AxisId\n */\nfunction resolveAxisReference(\n anchors: Record<string, PColumnSpec>,\n axisRef: AAxisSelector,\n): AxisSelector {\n if (!isAnchorAxisRef(axisRef)) return axisRef;\n\n // It's an anchored reference\n const anchorId = axisRef.anchor;\n const anchorSpec = anchors[anchorId];\n if (!anchorSpec) throw new Error(`Anchor \"${anchorId}\" not found for axis reference`);\n\n if (\"idx\" in axisRef) {\n // AnchorAxisRefByIdx\n if (axisRef.idx < 0 || axisRef.idx >= anchorSpec.axesSpec.length)\n throw new Error(`Axis index ${axisRef.idx} out of bounds for anchor \"${anchorId}\"`);\n return anchorSpec.axesSpec[axisRef.idx];\n } else if (\"name\" in axisRef) {\n // AnchorAxisRefByName\n const matches = anchorSpec.axesSpec.filter((axis) => axis.name === axisRef.name);\n if (matches.length > 1)\n throw new Error(`Multiple axes with name \"${axisRef.name}\" found in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`Axis with name \"${axisRef.name}\" not found in anchor \"${anchorId}\"`);\n return matches[0];\n } else if (\"id\" in axisRef) {\n // AnchorAxisRefByMatcher\n const matches = anchorSpec.axesSpec.filter((axis) => matchAxisId(axisRef.id, getAxisId(axis)));\n if (matches.length > 1)\n throw new Error(`Multiple matching axes found for matcher in anchor \"${anchorId}\"`);\n if (matches.length === 0)\n throw new Error(`No matching axis found for matcher in anchor \"${anchorId}\"`);\n return matches[0];\n }\n\n throw new Error(`Unsupported axis reference type`);\n}\n\n/**\n * Type guard to check if a value is an anchored axis reference\n */\nfunction isAnchorAxisRef(value: AAxisSelector): value is AnchorAxisRef {\n return typeof value === \"object\" && \"anchor\" in value;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @returns True if the value is a FilteredPColumn, false otherwise
|
|
7
7
|
*/
|
|
8
8
|
function isFilteredPColumn(id) {
|
|
9
|
-
return typeof id ===
|
|
9
|
+
return typeof id === "object" && id !== null && "source" in id && "axisFilters" in id;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
exports.isFilteredPColumn = isFilteredPColumn;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filtered_column.cjs","sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from
|
|
1
|
+
{"version":3,"file":"filtered_column.cjs","sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n"],"names":[],"mappings":";;AAiCA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAAW,EAAA;AAC3C,IAAA,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,QAAQ,IAAI,EAAE,IAAI,aAAa,IAAI,EAAE;AACvF;;;;"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @returns True if the value is a FilteredPColumn, false otherwise
|
|
5
5
|
*/
|
|
6
6
|
function isFilteredPColumn(id) {
|
|
7
|
-
return typeof id ===
|
|
7
|
+
return typeof id === "object" && id !== null && "source" in id && "axisFilters" in id;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export { isFilteredPColumn };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filtered_column.js","sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from
|
|
1
|
+
{"version":3,"file":"filtered_column.js","sources":["../../../../src/drivers/pframe/spec/filtered_column.ts"],"sourcesContent":["import type { AnchoredPColumnId } from \"./selectors\";\n\n/** Value of an axis filter */\nexport type AxisFilterValue = number | string;\n\n/** Axis filter by index */\nexport type AxisFilterByIdx = [number, AxisFilterValue];\n\n/** Axis filter by name */\nexport type AxisFilterByName = [string, AxisFilterValue];\n\n/** Axis filter */\nexport type AxisFilter = AxisFilterByIdx | AxisFilterByName;\n\n/**\n * Identifies a column derived from a CanonicalPColumnId by fixing values on certain axes,\n * thus effectively reducing the dimensionality of the original column.\n */\nexport type FilteredPColumn<CID = AnchoredPColumnId, AFI = AxisFilter> = {\n /** The original column identifier */\n source: CID;\n\n /**\n * List of fixed axes and their corresponding values.\n * Each entry fixes one axis to a specific value, creating a slice of the multidimensional data.\n * This effectively reduces the dimensionality by one for each fixed axis.\n * Ordered by the axis index in canonical case.\n */\n axisFilters: AFI[];\n};\n\nexport type FilteredPColumnId = FilteredPColumn<AnchoredPColumnId, AxisFilterByIdx>;\n\n/**\n * Checks if a given value is a FilteredPColumn\n * @param id - The value to check\n * @returns True if the value is a FilteredPColumn, false otherwise\n */\nexport function isFilteredPColumn(id: unknown): id is FilteredPColumn {\n return typeof id === \"object\" && id !== null && \"source\" in id && \"axisFilters\" in id;\n}\n"],"names":[],"mappings":"AAiCA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAAW,EAAA;AAC3C,IAAA,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI,IAAI,QAAQ,IAAI,EAAE,IAAI,aAAa,IAAI,EAAE;AACvF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.cjs","sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { Branded } from
|
|
1
|
+
{"version":3,"file":"ids.cjs","sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { Branded } from \"../../../branding\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport type { FilteredPColumnId } from \"./filtered_column\";\nimport canonicalize from \"canonicalize\";\nimport type { PObjectId } from \"../../../pool\";\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n */\nexport type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\n/**\n * Canonically serializes a {@link UniversalPColumnId} to a string.\n * @param id - The column identifier to serialize\n * @returns The canonically serialized string\n */\nexport function stringifyColumnId(id: UniversalPColumnId): SUniversalPColumnId {\n return canonicalize(id)! as SUniversalPColumnId;\n}\n\n/**\n * Parses a canonically serialized {@link UniversalPColumnId} from a string.\n * @param str - The string to parse\n * @returns The parsed column identifier\n */\nexport function parseColumnId(str: SUniversalPColumnId): UniversalPColumnId {\n return JSON.parse(str) as UniversalPColumnId;\n}\n"],"names":[],"mappings":";;;;AAeA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAAsB,EAAA;AACtD,IAAA,OAAO,YAAY,CAAC,EAAE,CAAyB;AACjD;AAEA;;;;AAIG;AACG,SAAU,aAAa,CAAC,GAAwB,EAAA;AACpD,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB;AAC9C;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Branded } from
|
|
2
|
-
import type { AnchoredPColumnId } from
|
|
3
|
-
import type { FilteredPColumnId } from
|
|
4
|
-
import type { PObjectId } from
|
|
1
|
+
import type { Branded } from "../../../branding";
|
|
2
|
+
import type { AnchoredPColumnId } from "./selectors";
|
|
3
|
+
import type { FilteredPColumnId } from "./filtered_column";
|
|
4
|
+
import type { PObjectId } from "../../../pool";
|
|
5
5
|
/**
|
|
6
6
|
* Universal column identifier optionally anchored and optionally filtered.
|
|
7
7
|
*/
|
|
@@ -9,7 +9,7 @@ export type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;
|
|
|
9
9
|
/**
|
|
10
10
|
* Canonically serialized {@link UniversalPColumnId}.
|
|
11
11
|
*/
|
|
12
|
-
export type SUniversalPColumnId = Branded<PObjectId,
|
|
12
|
+
export type SUniversalPColumnId = Branded<PObjectId, "SUniversalPColumnId", "__pl_model_brand_2__">;
|
|
13
13
|
/**
|
|
14
14
|
* Canonically serializes a {@link UniversalPColumnId} to a string.
|
|
15
15
|
* @param id - The column identifier to serialize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ids.js","sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { Branded } from
|
|
1
|
+
{"version":3,"file":"ids.js","sources":["../../../../src/drivers/pframe/spec/ids.ts"],"sourcesContent":["import type { Branded } from \"../../../branding\";\nimport type { AnchoredPColumnId } from \"./selectors\";\nimport type { FilteredPColumnId } from \"./filtered_column\";\nimport canonicalize from \"canonicalize\";\nimport type { PObjectId } from \"../../../pool\";\n/**\n * Universal column identifier optionally anchored and optionally filtered.\n */\nexport type UniversalPColumnId = AnchoredPColumnId | FilteredPColumnId;\n\n/**\n * Canonically serialized {@link UniversalPColumnId}.\n */\nexport type SUniversalPColumnId = Branded<PObjectId, \"SUniversalPColumnId\", \"__pl_model_brand_2__\">;\n\n/**\n * Canonically serializes a {@link UniversalPColumnId} to a string.\n * @param id - The column identifier to serialize\n * @returns The canonically serialized string\n */\nexport function stringifyColumnId(id: UniversalPColumnId): SUniversalPColumnId {\n return canonicalize(id)! as SUniversalPColumnId;\n}\n\n/**\n * Parses a canonically serialized {@link UniversalPColumnId} from a string.\n * @param str - The string to parse\n * @returns The parsed column identifier\n */\nexport function parseColumnId(str: SUniversalPColumnId): UniversalPColumnId {\n return JSON.parse(str) as UniversalPColumnId;\n}\n"],"names":[],"mappings":";;AAeA;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAAsB,EAAA;AACtD,IAAA,OAAO,YAAY,CAAC,EAAE,CAAyB;AACjD;AAEA;;;;AAIG;AACG,SAAU,aAAa,CAAC,GAAwB,EAAA;AACpD,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB;AAC9C;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
1
|
+
export * from "./anchored";
|
|
2
|
+
export * from "./ids";
|
|
3
|
+
export * from "./filtered_column";
|
|
4
|
+
export * from "./spec";
|
|
5
|
+
export * from "./selectors";
|
|
6
|
+
export * from "./native_id";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_id.cjs","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"sourcesContent":["import type { Branded } from
|
|
1
|
+
{"version":3,"file":"native_id.cjs","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"sourcesContent":["import type { Branded } from \"../../../branding\";\nimport { isPColumnSpec, type PObjectSpec } from \"../../../pool\";\nimport { getAxesId } from \"./spec\";\nimport canonicalize from \"canonicalize\";\nexport type NativePObjectId = Branded<string, \"NativePObjectId\">;\n\nexport function deriveNativeId(spec: PObjectSpec): NativePObjectId {\n const result: Record<string, unknown> = {\n kind: spec.kind,\n name: spec.name,\n };\n if (spec.domain !== undefined) result.domain = spec.domain;\n if (isPColumnSpec(spec)) result.axesSpec = getAxesId(spec.axesSpec);\n return canonicalize(result) as NativePObjectId;\n}\n"],"names":["spec","isPColumnSpec","getAxesId"],"mappings":";;;;;;AAMM,SAAU,cAAc,CAACA,MAAiB,EAAA;AAC9C,IAAA,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAEA,MAAI,CAAC,IAAI;QACf,IAAI,EAAEA,MAAI,CAAC,IAAI;KAChB;AACD,IAAA,IAAIA,MAAI,CAAC,MAAM,KAAK,SAAS;AAAE,QAAA,MAAM,CAAC,MAAM,GAAGA,MAAI,CAAC,MAAM;IAC1D,IAAIC,kBAAa,CAACD,MAAI,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAGE,gBAAS,CAACF,MAAI,CAAC,QAAQ,CAAC;AACnE,IAAA,OAAO,YAAY,CAAC,MAAM,CAAoB;AAChD;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Branded } from
|
|
2
|
-
import { type PObjectSpec } from
|
|
3
|
-
export type NativePObjectId = Branded<string,
|
|
1
|
+
import type { Branded } from "../../../branding";
|
|
2
|
+
import { type PObjectSpec } from "../../../pool";
|
|
3
|
+
export type NativePObjectId = Branded<string, "NativePObjectId">;
|
|
4
4
|
export declare function deriveNativeId(spec: PObjectSpec): NativePObjectId;
|
|
5
5
|
//# sourceMappingURL=native_id.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_id.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGhE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"native_id.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGhE,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAEjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,eAAe,CAQjE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_id.js","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"sourcesContent":["import type { Branded } from
|
|
1
|
+
{"version":3,"file":"native_id.js","sources":["../../../../src/drivers/pframe/spec/native_id.ts"],"sourcesContent":["import type { Branded } from \"../../../branding\";\nimport { isPColumnSpec, type PObjectSpec } from \"../../../pool\";\nimport { getAxesId } from \"./spec\";\nimport canonicalize from \"canonicalize\";\nexport type NativePObjectId = Branded<string, \"NativePObjectId\">;\n\nexport function deriveNativeId(spec: PObjectSpec): NativePObjectId {\n const result: Record<string, unknown> = {\n kind: spec.kind,\n name: spec.name,\n };\n if (spec.domain !== undefined) result.domain = spec.domain;\n if (isPColumnSpec(spec)) result.axesSpec = getAxesId(spec.axesSpec);\n return canonicalize(result) as NativePObjectId;\n}\n"],"names":[],"mappings":";;;;AAMM,SAAU,cAAc,CAAC,IAAiB,EAAA;AAC9C,IAAA,MAAM,MAAM,GAA4B;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB;AACD,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;AAAE,QAAA,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;IAC1D,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AACnE,IAAA,OAAO,YAAY,CAAC,MAAM,CAAoB;AAChD;;;;"}
|
|
@@ -10,7 +10,7 @@ var spec = require('./spec.cjs');
|
|
|
10
10
|
*/
|
|
11
11
|
function isAnchoredPColumnId(id) {
|
|
12
12
|
// basic check, can be extended if needed
|
|
13
|
-
return typeof id ===
|
|
13
|
+
return typeof id === "object" && id !== null && "name" in id && "axes" in id;
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
16
|
* Determines if an axis ID matches an axis selector.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.cjs","sources":["../../../../src/drivers/pframe/spec/selectors.ts"],"sourcesContent":["import { isPColumnSpec, type PObjectSpec } from '../../../pool';\nimport type { AxisId, AxisValueType, Domain, PColumnSpec, ValueType } from './spec';\nimport { getAxisId } from './spec';\n\n/**\n * Defines a pattern for matching axes within the PFrame data model.\n *\n * AxisSelector provides a flexible way to identify axes based on their\n * properties. All fields are optional, allowing for partial matching.\n * When multiple properties are specified, all must match for an axis\n * to be selected (logical AND).\n *\n * This interface is used in various selection and matching operations\n * throughout the PFrame system, such as column queries and axis lookups.\n */\nexport interface AxisSelector {\n /**\n * Optional value type to match against.\n * When specified, only axes with this exact type will match.\n * Can be a single type or an array of types to match against any of them.\n * Valid types include: 'Int', 'Long', 'Float', 'Double', 'String', 'Bytes'.\n */\n type?: ValueType | ValueType[];\n\n /**\n * Optional name to match against.\n * When specified, only axes with this exact name will match.\n */\n name?: string;\n\n /**\n * Optional domain key-value pairs to match against.\n * Domains provide additional context to uniquely identify an axis beyond its name and type.\n * When specified, an axis will match only if it contains all the key-value pairs defined here.\n * An axis with additional domain entries not present in this selector will still match.\n */\n domain?: Record<string, string>;\n}\n\n/** Single axis selector */\nexport interface SingleAxisSelector {\n /** Axis name (required) */\n name: string;\n /** Axis type (optional) */\n type?: AxisValueType;\n /** Domain requirements (optional) */\n domain?: Domain;\n /** Parent axes requirements (optional) */\n parentAxes?: SingleAxisSelector[];\n}\n\n/**\n * Reference to an axis by its numerical index within the anchor column's axes array\n * Format: [anchorId, axisIndex]\n */\nexport type AnchorAxisRefByIdx = { anchor: string; idx: number };\n\n/**\n * Reference to an axis by its name within the anchor column\n * Format: [anchorId, axisName]\n */\nexport type AnchorAxisRefByName = { anchor: string; name: string };\n\n/**\n * Reference to an axis using an AxisId matcher within the anchor\n * Format: [anchorId, axisMatcher]\n */\nexport type AnchorAxisRefByMatcher = { anchor: string; id: AxisId };\n\n/**\n * Basic anchor axis reference that can be either by index or a direct AxisId\n */\nexport type AnchorAxisIdOrRefBasic = AnchorAxisRefByIdx | AxisId;\n\n/** Union of all possible ways to reference an axis in an anchored context */\nexport type AnchorAxisRef = AnchorAxisRefByIdx | AnchorAxisRefByName | AnchorAxisRefByMatcher;\n\n/** Reference to a domain value through an anchor */\nexport type AnchorDomainRef = { anchor: string };\n\n/**\n * Domain value that can be either a direct string value or a reference to a domain through an anchor\n * Used to establish domain context that can be resolved relative to other anchored columns\n */\nexport type ADomain = string | AnchorDomainRef;\n/**\n * Axis identifier that can be either a direct AxisId or a reference to an axis through an anchor\n * Allows referring to axes in a way that can be resolved in different contexts\n */\nexport type AAxisSelector = AxisSelector | AnchorAxisRef;\n\n/**\n * Match resolution strategy for PColumns\n * Specifies how to handle when multiple columns match the criteria\n * (default is \"expectSingle\")\n */\nexport type AnchoredColumnMatchStrategy = 'expectSingle' | 'expectMultiple' | 'takeFirst';\n\n/**\n * Matcher for PColumns in an anchored context\n * Supports partial matching on axes, allowing for flexible column discovery\n */\nexport interface AnchoredPColumnSelector {\n /** Optional name of the column to match; can't be used together with namePattern */\n name?: string;\n /** Optional regexp pattern for column name matching; can't be used together with name */\n namePattern?: string;\n /** Optional value type to match. If an array is provided, matches if the column's type is any of the specified types */\n type?: ValueType | ValueType[];\n /** If specified, the domain values must be anchored to this anchor */\n domainAnchor?: string;\n /** Optional domain values to match, can include anchored references, if domainAnchor is specified,\n * interpreted as additional domains to domain from the anchor */\n domain?: Record<string, ADomain>;\n /** Optional axes to match, can include anchored references */\n axes?: AAxisSelector[];\n /** When true, allows matching if only a subset of axes match */\n partialAxesMatch?: boolean;\n /** Optional annotations to match with exact values */\n annotations?: Record<string, string>;\n /** Optional annotation patterns to match with regex patterns */\n annotationPatterns?: Record<string, string>;\n /** Match resolution strategy, default is \"expectSingle\" */\n matchStrategy?: AnchoredColumnMatchStrategy;\n}\n\n/**\n * Matcher for PColumns in a non-anchored context\n */\nexport interface PColumnSelector extends AnchoredPColumnSelector {\n domainAnchor?: never;\n domain?: Record<string, string>;\n axes?: AxisSelector[];\n}\n\n/**\n * Strict identifier for PColumns in an anchored context\n * Unlike APColumnMatcher, this requires exact matches on domain and axes\n */\nexport interface AnchoredPColumnId extends AnchoredPColumnSelector {\n /** Name is required for exact column identification */\n name: string;\n /** No namePattern in ID */\n namePattern?: never;\n /** Type is not used in exact column identification */\n type?: never;\n /** Full axes specification using only basic references */\n axes: AnchorAxisIdOrRefBasic[];\n /** Partial axes matching is not allowed for exact identification */\n partialAxesMatch?: never;\n /** Annotations are not used in exact column identification */\n annotations?: never;\n /** Annotation patterns are not used in exact column identification */\n annotationPatterns?: never;\n /** \"Id\" implies single match strategy */\n matchStrategy?: never;\n}\n\n/**\n * Checks if a given value is an anchored column identifier\n * @param id - The value to check\n * @returns True if the value is an anchored column identifier, false otherwise\n */\nexport function isAnchoredPColumnId(id: unknown): id is AnchoredPColumnId {\n // basic check, can be extended if needed\n return typeof id === 'object' && id !== null && 'name' in id && 'axes' in id;\n}\n\n/**\n * Determines if an axis ID matches an axis selector.\n *\n * @param selector - The selector with criteria to match against\n * @param axis - The AxisId to check against the selector\n * @returns true if the AxisId matches all specified criteria in the selector, false otherwise\n */\nexport function matchAxis(selector: AxisSelector, axis: AxisId): boolean {\n // Match name if specified\n if (selector.name !== undefined && selector.name !== axis.name)\n return false;\n\n // Match type if specified\n if (selector.type !== undefined) {\n if (Array.isArray(selector.type)) {\n if (!selector.type.includes(axis.type))\n return false;\n } else if (selector.type !== axis.type) {\n return false;\n }\n }\n\n // Match domain if specified - using existing logic from matchAxisId\n if (selector.domain !== undefined) {\n const axisDomain = axis.domain || {};\n for (const [key, value] of Object.entries(selector.domain))\n if (axisDomain[key] !== value)\n return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a given PColumnSpec matches a selector.\n *\n * @param pcolumn - The PColumnSpec to check against the selector\n * @param selector - The selector criteria to match against\n * @returns true if the PColumnSpec matches all criteria in the selector, false otherwise\n */\nexport function matchPColumn(pcolumn: PColumnSpec, selector: PColumnSelector): boolean {\n // Match name if specified\n if (selector.name !== undefined && pcolumn.name !== selector.name)\n return false;\n\n // Match name pattern if specified\n if (selector.namePattern !== undefined && !new RegExp(selector.namePattern).test(pcolumn.name))\n return false;\n\n // Match type if specified\n if (selector.type !== undefined) {\n if (Array.isArray(selector.type)) {\n if (!selector.type.includes(pcolumn.valueType))\n return false;\n } else if (selector.type !== pcolumn.valueType) {\n return false;\n }\n }\n\n // Match domain if specified\n if (selector.domain !== undefined) {\n const columnDomain = pcolumn.domain || {};\n for (const [key, value] of Object.entries(selector.domain))\n if (columnDomain[key] !== value)\n return false;\n }\n\n // Match axes if specified\n if (selector.axes !== undefined) {\n const pcolumnAxes = pcolumn.axesSpec.map(getAxisId);\n\n if (selector.partialAxesMatch) {\n // For partial matching, all selector axes must match at least one column axis\n for (const selectorAxis of selector.axes)\n if (!pcolumnAxes.some((columnAxis) => matchAxis(selectorAxis, columnAxis)))\n return false;\n } else {\n // For exact matching, column must have the same number of axes and all must match\n if (pcolumnAxes.length !== selector.axes.length)\n return false;\n\n // Each selector axis must match a corresponding column axis\n for (let i = 0; i < selector.axes.length; i++)\n if (!matchAxis(selector.axes[i], pcolumnAxes[i]))\n return false;\n }\n }\n\n // Match annotations if specified\n if (selector.annotations !== undefined) {\n const columnAnnotations = pcolumn.annotations || {};\n for (const [key, value] of Object.entries(selector.annotations))\n if (columnAnnotations[key] !== value)\n return false;\n }\n\n // Match annotation patterns if specified\n if (selector.annotationPatterns !== undefined) {\n const columnAnnotations = pcolumn.annotations || {};\n for (const [key, pattern] of Object.entries(selector.annotationPatterns)) {\n const value = columnAnnotations[key];\n if (value === undefined || !new RegExp(pattern).test(value))\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Convert a predicate or array of selectors to a single predicate function\n * @param predicateOrSelectors - Either a function that takes a PColumnSpec and returns a boolean,\n * or an array of PColumnSelectors, or a single PColumnSelector\n * @returns A function that takes a PColumnSpec and returns a boolean\n */\nexport function selectorsToPredicate(predicateOrSelectors: PColumnSelector | PColumnSelector[]): ((spec: PObjectSpec) => boolean) {\n if (Array.isArray(predicateOrSelectors))\n return (spec) => predicateOrSelectors.some((selector) => isPColumnSpec(spec) && matchPColumn(spec, selector));\n else\n return (spec) => isPColumnSpec(spec) && matchPColumn(spec, predicateOrSelectors);\n}\n"],"names":["getAxisId","isPColumnSpec"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selectors.cjs","sources":["../../../../src/drivers/pframe/spec/selectors.ts"],"sourcesContent":["import { isPColumnSpec, type PObjectSpec } from \"../../../pool\";\nimport type { AxisId, AxisValueType, Domain, PColumnSpec, ValueType } from \"./spec\";\nimport { getAxisId } from \"./spec\";\n\n/**\n * Defines a pattern for matching axes within the PFrame data model.\n *\n * AxisSelector provides a flexible way to identify axes based on their\n * properties. All fields are optional, allowing for partial matching.\n * When multiple properties are specified, all must match for an axis\n * to be selected (logical AND).\n *\n * This interface is used in various selection and matching operations\n * throughout the PFrame system, such as column queries and axis lookups.\n */\nexport interface AxisSelector {\n /**\n * Optional value type to match against.\n * When specified, only axes with this exact type will match.\n * Can be a single type or an array of types to match against any of them.\n * Valid types include: 'Int', 'Long', 'Float', 'Double', 'String', 'Bytes'.\n */\n type?: ValueType | ValueType[];\n\n /**\n * Optional name to match against.\n * When specified, only axes with this exact name will match.\n */\n name?: string;\n\n /**\n * Optional domain key-value pairs to match against.\n * Domains provide additional context to uniquely identify an axis beyond its name and type.\n * When specified, an axis will match only if it contains all the key-value pairs defined here.\n * An axis with additional domain entries not present in this selector will still match.\n */\n domain?: Record<string, string>;\n}\n\n/** Single axis selector */\nexport interface SingleAxisSelector {\n /** Axis name (required) */\n name: string;\n /** Axis type (optional) */\n type?: AxisValueType;\n /** Domain requirements (optional) */\n domain?: Domain;\n /** Parent axes requirements (optional) */\n parentAxes?: SingleAxisSelector[];\n}\n\n/**\n * Reference to an axis by its numerical index within the anchor column's axes array\n * Format: [anchorId, axisIndex]\n */\nexport type AnchorAxisRefByIdx = { anchor: string; idx: number };\n\n/**\n * Reference to an axis by its name within the anchor column\n * Format: [anchorId, axisName]\n */\nexport type AnchorAxisRefByName = { anchor: string; name: string };\n\n/**\n * Reference to an axis using an AxisId matcher within the anchor\n * Format: [anchorId, axisMatcher]\n */\nexport type AnchorAxisRefByMatcher = { anchor: string; id: AxisId };\n\n/**\n * Basic anchor axis reference that can be either by index or a direct AxisId\n */\nexport type AnchorAxisIdOrRefBasic = AnchorAxisRefByIdx | AxisId;\n\n/** Union of all possible ways to reference an axis in an anchored context */\nexport type AnchorAxisRef = AnchorAxisRefByIdx | AnchorAxisRefByName | AnchorAxisRefByMatcher;\n\n/** Reference to a domain value through an anchor */\nexport type AnchorDomainRef = { anchor: string };\n\n/**\n * Domain value that can be either a direct string value or a reference to a domain through an anchor\n * Used to establish domain context that can be resolved relative to other anchored columns\n */\nexport type ADomain = string | AnchorDomainRef;\n/**\n * Axis identifier that can be either a direct AxisId or a reference to an axis through an anchor\n * Allows referring to axes in a way that can be resolved in different contexts\n */\nexport type AAxisSelector = AxisSelector | AnchorAxisRef;\n\n/**\n * Match resolution strategy for PColumns\n * Specifies how to handle when multiple columns match the criteria\n * (default is \"expectSingle\")\n */\nexport type AnchoredColumnMatchStrategy = \"expectSingle\" | \"expectMultiple\" | \"takeFirst\";\n\n/**\n * Matcher for PColumns in an anchored context\n * Supports partial matching on axes, allowing for flexible column discovery\n */\nexport interface AnchoredPColumnSelector {\n /** Optional name of the column to match; can't be used together with namePattern */\n name?: string;\n /** Optional regexp pattern for column name matching; can't be used together with name */\n namePattern?: string;\n /** Optional value type to match. If an array is provided, matches if the column's type is any of the specified types */\n type?: ValueType | ValueType[];\n /** If specified, the domain values must be anchored to this anchor */\n domainAnchor?: string;\n /** Optional domain values to match, can include anchored references, if domainAnchor is specified,\n * interpreted as additional domains to domain from the anchor */\n domain?: Record<string, ADomain>;\n /** Optional axes to match, can include anchored references */\n axes?: AAxisSelector[];\n /** When true, allows matching if only a subset of axes match */\n partialAxesMatch?: boolean;\n /** Optional annotations to match with exact values */\n annotations?: Record<string, string>;\n /** Optional annotation patterns to match with regex patterns */\n annotationPatterns?: Record<string, string>;\n /** Match resolution strategy, default is \"expectSingle\" */\n matchStrategy?: AnchoredColumnMatchStrategy;\n}\n\n/**\n * Matcher for PColumns in a non-anchored context\n */\nexport interface PColumnSelector extends AnchoredPColumnSelector {\n domainAnchor?: never;\n domain?: Record<string, string>;\n axes?: AxisSelector[];\n}\n\n/**\n * Strict identifier for PColumns in an anchored context\n * Unlike APColumnMatcher, this requires exact matches on domain and axes\n */\nexport interface AnchoredPColumnId extends AnchoredPColumnSelector {\n /** Name is required for exact column identification */\n name: string;\n /** No namePattern in ID */\n namePattern?: never;\n /** Type is not used in exact column identification */\n type?: never;\n /** Full axes specification using only basic references */\n axes: AnchorAxisIdOrRefBasic[];\n /** Partial axes matching is not allowed for exact identification */\n partialAxesMatch?: never;\n /** Annotations are not used in exact column identification */\n annotations?: never;\n /** Annotation patterns are not used in exact column identification */\n annotationPatterns?: never;\n /** \"Id\" implies single match strategy */\n matchStrategy?: never;\n}\n\n/**\n * Checks if a given value is an anchored column identifier\n * @param id - The value to check\n * @returns True if the value is an anchored column identifier, false otherwise\n */\nexport function isAnchoredPColumnId(id: unknown): id is AnchoredPColumnId {\n // basic check, can be extended if needed\n return typeof id === \"object\" && id !== null && \"name\" in id && \"axes\" in id;\n}\n\n/**\n * Determines if an axis ID matches an axis selector.\n *\n * @param selector - The selector with criteria to match against\n * @param axis - The AxisId to check against the selector\n * @returns true if the AxisId matches all specified criteria in the selector, false otherwise\n */\nexport function matchAxis(selector: AxisSelector, axis: AxisId): boolean {\n // Match name if specified\n if (selector.name !== undefined && selector.name !== axis.name) return false;\n\n // Match type if specified\n if (selector.type !== undefined) {\n if (Array.isArray(selector.type)) {\n if (!selector.type.includes(axis.type)) return false;\n } else if (selector.type !== axis.type) {\n return false;\n }\n }\n\n // Match domain if specified - using existing logic from matchAxisId\n if (selector.domain !== undefined) {\n const axisDomain = axis.domain || {};\n for (const [key, value] of Object.entries(selector.domain))\n if (axisDomain[key] !== value) return false;\n }\n\n return true;\n}\n\n/**\n * Determines if a given PColumnSpec matches a selector.\n *\n * @param pcolumn - The PColumnSpec to check against the selector\n * @param selector - The selector criteria to match against\n * @returns true if the PColumnSpec matches all criteria in the selector, false otherwise\n */\nexport function matchPColumn(pcolumn: PColumnSpec, selector: PColumnSelector): boolean {\n // Match name if specified\n if (selector.name !== undefined && pcolumn.name !== selector.name) return false;\n\n // Match name pattern if specified\n if (selector.namePattern !== undefined && !new RegExp(selector.namePattern).test(pcolumn.name))\n return false;\n\n // Match type if specified\n if (selector.type !== undefined) {\n if (Array.isArray(selector.type)) {\n if (!selector.type.includes(pcolumn.valueType)) return false;\n } else if (selector.type !== pcolumn.valueType) {\n return false;\n }\n }\n\n // Match domain if specified\n if (selector.domain !== undefined) {\n const columnDomain = pcolumn.domain || {};\n for (const [key, value] of Object.entries(selector.domain))\n if (columnDomain[key] !== value) return false;\n }\n\n // Match axes if specified\n if (selector.axes !== undefined) {\n const pcolumnAxes = pcolumn.axesSpec.map(getAxisId);\n\n if (selector.partialAxesMatch) {\n // For partial matching, all selector axes must match at least one column axis\n for (const selectorAxis of selector.axes)\n if (!pcolumnAxes.some((columnAxis) => matchAxis(selectorAxis, columnAxis))) return false;\n } else {\n // For exact matching, column must have the same number of axes and all must match\n if (pcolumnAxes.length !== selector.axes.length) return false;\n\n // Each selector axis must match a corresponding column axis\n for (let i = 0; i < selector.axes.length; i++)\n if (!matchAxis(selector.axes[i], pcolumnAxes[i])) return false;\n }\n }\n\n // Match annotations if specified\n if (selector.annotations !== undefined) {\n const columnAnnotations = pcolumn.annotations || {};\n for (const [key, value] of Object.entries(selector.annotations))\n if (columnAnnotations[key] !== value) return false;\n }\n\n // Match annotation patterns if specified\n if (selector.annotationPatterns !== undefined) {\n const columnAnnotations = pcolumn.annotations || {};\n for (const [key, pattern] of Object.entries(selector.annotationPatterns)) {\n const value = columnAnnotations[key];\n if (value === undefined || !new RegExp(pattern).test(value)) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Convert a predicate or array of selectors to a single predicate function\n * @param predicateOrSelectors - Either a function that takes a PColumnSpec and returns a boolean,\n * or an array of PColumnSelectors, or a single PColumnSelector\n * @returns A function that takes a PColumnSpec and returns a boolean\n */\nexport function selectorsToPredicate(\n predicateOrSelectors: PColumnSelector | PColumnSelector[],\n): (spec: PObjectSpec) => boolean {\n if (Array.isArray(predicateOrSelectors))\n return (spec) =>\n predicateOrSelectors.some((selector) => isPColumnSpec(spec) && matchPColumn(spec, selector));\n else return (spec) => isPColumnSpec(spec) && matchPColumn(spec, predicateOrSelectors);\n}\n"],"names":["getAxisId","isPColumnSpec"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type PObjectSpec } from
|
|
2
|
-
import type { AxisId, AxisValueType, Domain, PColumnSpec, ValueType } from
|
|
1
|
+
import { type PObjectSpec } from "../../../pool";
|
|
2
|
+
import type { AxisId, AxisValueType, Domain, PColumnSpec, ValueType } from "./spec";
|
|
3
3
|
/**
|
|
4
4
|
* Defines a pattern for matching axes within the PFrame data model.
|
|
5
5
|
*
|
|
@@ -92,7 +92,7 @@ export type AAxisSelector = AxisSelector | AnchorAxisRef;
|
|
|
92
92
|
* Specifies how to handle when multiple columns match the criteria
|
|
93
93
|
* (default is "expectSingle")
|
|
94
94
|
*/
|
|
95
|
-
export type AnchoredColumnMatchStrategy =
|
|
95
|
+
export type AnchoredColumnMatchStrategy = "expectSingle" | "expectMultiple" | "takeFirst";
|
|
96
96
|
/**
|
|
97
97
|
* Matcher for PColumns in an anchored context
|
|
98
98
|
* Supports partial matching on axes, allowing for flexible column discovery
|
|
@@ -178,5 +178,5 @@ export declare function matchPColumn(pcolumn: PColumnSpec, selector: PColumnSele
|
|
|
178
178
|
* or an array of PColumnSelectors, or a single PColumnSelector
|
|
179
179
|
* @returns A function that takes a PColumnSpec and returns a boolean
|
|
180
180
|
*/
|
|
181
|
-
export declare function selectorsToPredicate(predicateOrSelectors: PColumnSelector | PColumnSelector[]): (
|
|
181
|
+
export declare function selectorsToPredicate(predicateOrSelectors: PColumnSelector | PColumnSelector[]): (spec: PObjectSpec) => boolean;
|
|
182
182
|
//# sourceMappingURL=selectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/selectors.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../../../src/drivers/pframe/spec/selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { getAxisId } from './spec.js';
|
|
|
8
8
|
*/
|
|
9
9
|
function isAnchoredPColumnId(id) {
|
|
10
10
|
// basic check, can be extended if needed
|
|
11
|
-
return typeof id ===
|
|
11
|
+
return typeof id === "object" && id !== null && "name" in id && "axes" in id;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Determines if an axis ID matches an axis selector.
|