@milaboratories/pl-model-common 1.31.1 → 1.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.cjs +7 -13
- package/dist/author_marker.d.ts.map +1 -0
- package/dist/base32_encode.cjs +1 -2
- package/dist/base32_encode.cjs.map +1 -1
- package/dist/base32_encode.js +1 -1
- package/dist/base32_encode.js.map +1 -1
- package/dist/base64.cjs +1 -2
- package/dist/base64.cjs.map +1 -1
- package/dist/base64.d.ts.map +1 -0
- package/dist/base64.js +1 -1
- package/dist/block_state.d.ts.map +1 -0
- package/dist/bmodel/block_config.cjs +1 -2
- package/dist/bmodel/block_config.cjs.map +1 -1
- package/dist/bmodel/block_config.d.ts +0 -1
- package/dist/bmodel/block_config.d.ts.map +1 -0
- package/dist/bmodel/block_config.js +1 -1
- package/dist/bmodel/block_config.js.map +1 -1
- package/dist/bmodel/code.cjs +2 -3
- package/dist/bmodel/code.cjs.map +1 -1
- package/dist/bmodel/code.d.ts +0 -1
- package/dist/bmodel/code.d.ts.map +1 -0
- package/dist/bmodel/code.js +1 -2
- package/dist/bmodel/code.js.map +1 -1
- package/dist/bmodel/container.d.ts.map +1 -0
- package/dist/bmodel/index.cjs +3 -3
- package/dist/bmodel/index.js +3 -3
- package/dist/bmodel/normalization.cjs +2 -4
- package/dist/bmodel/normalization.cjs.map +1 -1
- package/dist/bmodel/normalization.d.ts.map +1 -0
- package/dist/bmodel/normalization.js +2 -3
- package/dist/bmodel/normalization.js.map +1 -1
- package/dist/bmodel/types.d.ts.map +1 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/common_types.d.ts.map +1 -0
- package/dist/driver_kit.d.ts +0 -1
- package/dist/driver_kit.d.ts.map +1 -0
- package/dist/drivers/ChunkedStreamReader.cjs +1 -2
- package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
- package/dist/drivers/ChunkedStreamReader.d.ts.map +1 -0
- package/dist/drivers/ChunkedStreamReader.js +1 -1
- package/dist/drivers/ChunkedStreamReader.js.map +1 -1
- package/dist/drivers/blob.cjs +2 -3
- package/dist/drivers/blob.cjs.map +1 -1
- package/dist/drivers/blob.d.ts.map +1 -0
- package/dist/drivers/blob.js +1 -2
- package/dist/drivers/blob.js.map +1 -1
- package/dist/drivers/index.cjs +18 -18
- package/dist/drivers/index.d.ts +5 -6
- package/dist/drivers/index.js +17 -17
- package/dist/drivers/interfaces.d.ts.map +1 -0
- package/dist/drivers/log.cjs +11 -4
- package/dist/drivers/log.cjs.map +1 -1
- package/dist/drivers/log.d.ts +14 -7
- package/dist/drivers/log.d.ts.map +1 -0
- package/dist/drivers/log.js +11 -4
- package/dist/drivers/log.js.map +1 -1
- package/dist/drivers/ls.cjs +2 -3
- package/dist/drivers/ls.cjs.map +1 -1
- package/dist/drivers/ls.d.ts +0 -2
- package/dist/drivers/ls.d.ts.map +1 -0
- package/dist/drivers/ls.js +1 -2
- package/dist/drivers/ls.js.map +1 -1
- package/dist/drivers/pframe/column_filter.d.ts.map +1 -0
- package/dist/drivers/pframe/data_info.cjs +2 -3
- package/dist/drivers/pframe/data_info.cjs.map +1 -1
- package/dist/drivers/pframe/data_info.d.ts.map +1 -0
- package/dist/drivers/pframe/data_info.js +1 -2
- package/dist/drivers/pframe/data_info.js.map +1 -1
- package/dist/drivers/pframe/data_types.cjs +4 -5
- package/dist/drivers/pframe/data_types.cjs.map +1 -1
- package/dist/drivers/pframe/data_types.d.ts.map +1 -0
- package/dist/drivers/pframe/data_types.js +3 -4
- package/dist/drivers/pframe/data_types.js.map +1 -1
- package/dist/drivers/pframe/driver.cjs +1 -2
- package/dist/drivers/pframe/driver.cjs.map +1 -1
- package/dist/drivers/pframe/driver.d.ts +0 -1
- package/dist/drivers/pframe/driver.d.ts.map +1 -0
- package/dist/drivers/pframe/driver.js +1 -1
- package/dist/drivers/pframe/filter_spec.d.ts.map +1 -0
- package/dist/drivers/pframe/find_columns.d.ts.map +1 -0
- package/dist/drivers/pframe/index.cjs +15 -15
- package/dist/drivers/pframe/index.d.ts +4 -6
- package/dist/drivers/pframe/index.js +12 -12
- package/dist/drivers/pframe/linker_columns.cjs +3 -4
- package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
- package/dist/drivers/pframe/linker_columns.d.ts.map +1 -0
- package/dist/drivers/pframe/linker_columns.js +1 -2
- package/dist/drivers/pframe/linker_columns.js.map +1 -1
- package/dist/drivers/pframe/pframe.d.ts +0 -2
- package/dist/drivers/pframe/pframe.d.ts.map +1 -0
- package/dist/drivers/pframe/query/index.cjs +1 -1
- package/dist/drivers/pframe/query/index.d.ts +2 -2
- package/dist/drivers/pframe/query/index.js +1 -1
- package/dist/drivers/pframe/query/query_common.d.ts +39 -4
- package/dist/drivers/pframe/query/query_common.d.ts.map +1 -0
- package/dist/drivers/pframe/query/query_data.d.ts +18 -5
- package/dist/drivers/pframe/query/query_data.d.ts.map +1 -0
- package/dist/drivers/pframe/query/query_spec.d.ts +14 -6
- package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -0
- package/dist/drivers/pframe/query/utils.cjs +30 -4
- package/dist/drivers/pframe/query/utils.cjs.map +1 -1
- package/dist/drivers/pframe/query/utils.d.ts.map +1 -0
- package/dist/drivers/pframe/query/utils.js +28 -2
- package/dist/drivers/pframe/query/utils.js.map +1 -1
- package/dist/drivers/pframe/spec/anchored.cjs +4 -5
- package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
- package/dist/drivers/pframe/spec/anchored.d.ts +3 -3
- package/dist/drivers/pframe/spec/anchored.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/anchored.js +1 -2
- package/dist/drivers/pframe/spec/anchored.js.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.cjs +1 -2
- package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
- package/dist/drivers/pframe/spec/filtered_column.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/filtered_column.js +1 -1
- package/dist/drivers/pframe/spec/ids.cjs +2 -3
- package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
- package/dist/drivers/pframe/spec/ids.d.ts +0 -2
- package/dist/drivers/pframe/spec/ids.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/ids.js +1 -2
- package/dist/drivers/pframe/spec/ids.js.map +1 -1
- package/dist/drivers/pframe/spec/index.cjs +6 -6
- package/dist/drivers/pframe/spec/index.d.ts +1 -1
- package/dist/drivers/pframe/spec/index.js +6 -6
- package/dist/drivers/pframe/spec/native_id.cjs +4 -5
- package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
- package/dist/drivers/pframe/spec/native_id.d.ts +0 -2
- package/dist/drivers/pframe/spec/native_id.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/native_id.js +1 -2
- package/dist/drivers/pframe/spec/native_id.js.map +1 -1
- package/dist/drivers/pframe/spec/selectors.cjs +3 -4
- package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
- package/dist/drivers/pframe/spec/selectors.d.ts +0 -2
- package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/selectors.js +1 -2
- package/dist/drivers/pframe/spec/selectors.js.map +1 -1
- package/dist/drivers/pframe/spec/spec.cjs +12 -8
- package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
- package/dist/drivers/pframe/spec/spec.d.ts +15 -3
- package/dist/drivers/pframe/spec/spec.d.ts.map +1 -0
- package/dist/drivers/pframe/spec/spec.js +9 -5
- package/dist/drivers/pframe/spec/spec.js.map +1 -1
- package/dist/drivers/pframe/spec_driver.d.ts +37 -4
- package/dist/drivers/pframe/spec_driver.d.ts.map +1 -0
- package/dist/drivers/pframe/table.d.ts.map +1 -0
- package/dist/drivers/pframe/table_calculate.cjs +6 -7
- package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
- package/dist/drivers/pframe/table_calculate.d.ts +0 -2
- package/dist/drivers/pframe/table_calculate.d.ts.map +1 -0
- package/dist/drivers/pframe/table_calculate.js +1 -2
- package/dist/drivers/pframe/table_calculate.js.map +1 -1
- package/dist/drivers/pframe/table_common.cjs +1 -2
- package/dist/drivers/pframe/table_common.cjs.map +1 -1
- package/dist/drivers/pframe/table_common.d.ts +0 -2
- package/dist/drivers/pframe/table_common.d.ts.map +1 -0
- package/dist/drivers/pframe/table_common.js +1 -1
- package/dist/drivers/pframe/unique_values.d.ts +0 -2
- package/dist/drivers/pframe/unique_values.d.ts.map +1 -0
- package/dist/drivers/upload.d.ts.map +1 -0
- package/dist/drivers/urls.cjs +1 -2
- package/dist/drivers/urls.cjs.map +1 -1
- package/dist/drivers/urls.d.ts.map +1 -0
- package/dist/drivers/urls.js +1 -1
- package/dist/errors.cjs +1 -2
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/flags/block_flags.cjs +1 -2
- package/dist/flags/block_flags.cjs.map +1 -1
- package/dist/flags/block_flags.d.ts +0 -2
- package/dist/flags/block_flags.d.ts.map +1 -0
- package/dist/flags/block_flags.js +1 -1
- package/dist/flags/flag_utils.cjs +1 -2
- package/dist/flags/flag_utils.cjs.map +1 -1
- package/dist/flags/flag_utils.d.ts.map +1 -0
- package/dist/flags/flag_utils.js +1 -1
- package/dist/flags/flag_utils.js.map +1 -1
- package/dist/flags/type_utils.d.ts.map +1 -0
- package/dist/httpAuth.cjs +1 -2
- package/dist/httpAuth.cjs.map +1 -1
- package/dist/httpAuth.d.ts.map +1 -0
- package/dist/httpAuth.js +1 -1
- package/dist/index.cjs +47 -47
- package/dist/index.d.ts +6 -11
- package/dist/index.js +2 -3
- package/dist/json.cjs +2 -3
- package/dist/json.cjs.map +1 -1
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +1 -2
- package/dist/json.js.map +1 -1
- package/dist/navigation.cjs +1 -2
- package/dist/navigation.cjs.map +1 -1
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +1 -1
- package/dist/plid.cjs +6 -7
- package/dist/plid.cjs.map +1 -1
- package/dist/plid.d.ts.map +1 -0
- package/dist/plid.js +4 -5
- package/dist/plid.js.map +1 -1
- package/dist/pool/entry.d.ts.map +1 -0
- package/dist/pool/query.cjs +2 -3
- package/dist/pool/query.cjs.map +1 -1
- package/dist/pool/query.d.ts +0 -1
- package/dist/pool/query.d.ts.map +1 -0
- package/dist/pool/query.js +1 -2
- package/dist/pool/query.js.map +1 -1
- package/dist/pool/spec.cjs +2 -3
- package/dist/pool/spec.cjs.map +1 -1
- package/dist/pool/spec.d.ts +0 -2
- package/dist/pool/spec.d.ts.map +1 -0
- package/dist/pool/spec.js +1 -2
- package/dist/pool/spec.js.map +1 -1
- package/dist/pool_entry.cjs +1 -2
- package/dist/pool_entry.cjs.map +1 -1
- package/dist/pool_entry.d.ts.map +1 -0
- package/dist/pool_entry.js +1 -1
- package/dist/pool_entry.js.map +1 -1
- package/dist/ref.cjs +2 -3
- package/dist/ref.cjs.map +1 -1
- package/dist/ref.d.ts.map +1 -0
- package/dist/ref.js +1 -2
- package/dist/ref.js.map +1 -1
- package/dist/resource_types.cjs +1 -2
- package/dist/resource_types.cjs.map +1 -1
- package/dist/resource_types.d.ts.map +1 -0
- package/dist/resource_types.js +1 -1
- package/dist/services/index.cjs +6 -6
- package/dist/services/index.js +6 -6
- package/dist/services/service_capabilities.cjs +2 -3
- package/dist/services/service_capabilities.cjs.map +1 -1
- package/dist/services/service_capabilities.d.ts.map +1 -0
- package/dist/services/service_capabilities.js +1 -2
- package/dist/services/service_capabilities.js.map +1 -1
- package/dist/services/service_declarations.cjs +2 -3
- package/dist/services/service_declarations.cjs.map +1 -1
- package/dist/services/service_declarations.d.ts +0 -2
- package/dist/services/service_declarations.d.ts.map +1 -0
- package/dist/services/service_declarations.js +1 -2
- package/dist/services/service_declarations.js.map +1 -1
- package/dist/services/service_injector_factory.cjs +1 -2
- package/dist/services/service_injector_factory.cjs.map +1 -1
- package/dist/services/service_injector_factory.d.ts.map +1 -0
- package/dist/services/service_injector_factory.js +1 -1
- package/dist/services/service_injectors.cjs +4 -5
- package/dist/services/service_injectors.cjs.map +1 -1
- package/dist/services/service_injectors.d.ts.map +1 -0
- package/dist/services/service_injectors.js +1 -2
- package/dist/services/service_injectors.js.map +1 -1
- package/dist/services/service_registry.cjs +2 -3
- package/dist/services/service_registry.cjs.map +1 -1
- package/dist/services/service_registry.d.ts.map +1 -0
- package/dist/services/service_registry.js +1 -2
- package/dist/services/service_registry.js.map +1 -1
- package/dist/services/service_types.cjs +2 -3
- package/dist/services/service_types.cjs.map +1 -1
- package/dist/services/service_types.d.ts +7 -7
- package/dist/services/service_types.d.ts.map +1 -0
- package/dist/services/service_types.js +1 -2
- package/dist/services/service_types.js.map +1 -1
- package/dist/utag.d.ts.map +1 -0
- package/dist/util.cjs +1 -2
- package/dist/util.cjs.map +1 -1
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +1 -1
- package/dist/value_or_error.cjs +1 -2
- package/dist/value_or_error.cjs.map +1 -1
- package/dist/value_or_error.d.ts.map +1 -0
- package/dist/value_or_error.js +1 -1
- package/package.json +9 -9
- package/src/drivers/log.ts +21 -7
- package/src/drivers/pframe/query/query_common.ts +39 -0
- package/src/drivers/pframe/query/query_data.ts +20 -0
- package/src/drivers/pframe/query/query_spec.ts +17 -0
- package/src/drivers/pframe/query/utils.test.ts +37 -0
- package/src/drivers/pframe/query/utils.ts +25 -0
- package/src/drivers/pframe/spec/anchored.ts +8 -3
- package/src/drivers/pframe/spec/spec.ts +19 -6
- package/src/drivers/pframe/spec_driver.ts +42 -1
- package/src/services/service_types.ts +1 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linker_columns.js","names":[],"sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n // Edge (previous[id] -> id) is stored at the \"from\" node in one-directional map\n return ids.map((id: LinkerKey) => this.data.get(previous[id])!.linkWith.get(id)!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linker_columns.js","names":[],"sources":["../../../src/drivers/pframe/linker_columns.ts"],"sourcesContent":["import { canonicalizeJson, parseJson, type CanonicalizedJson } from \"../../json\";\nimport {\n Annotation,\n readAnnotationJson,\n type AxisSpec,\n type PColumnIdAndSpec,\n type AxisSpecNormalized,\n type AxisId,\n getAxisId,\n getNormalizedAxesList,\n getArrayFromAxisTree,\n getAxesTree,\n} from \"./spec/spec\";\n\ntype LinkerKey = CanonicalizedJson<AxisId[]>;\nexport type CompositeLinkerMap = Map<\n LinkerKey,\n {\n keyAxesSpec: AxisSpecNormalized[]; // axis specs - source for the key\n linkWith: Map<LinkerKey, PColumnIdAndSpec>; // for every axis (possibly in group with parents - available by linkers another axes and corresponding linkers)\n }\n>;\n\ninterface LinkersData {\n data: CompositeLinkerMap;\n}\nexport class LinkerMap implements LinkersData {\n /** Graph of linkers connected by axes (single or grouped by parents) */\n readonly data: CompositeLinkerMap;\n\n constructor(linkerMap: CompositeLinkerMap) {\n this.data = linkerMap;\n }\n\n get keys() {\n return this.data.keys();\n }\n\n get keyAxesIds() {\n return [...this.data.keys()].map(parseJson);\n }\n\n static fromColumns(columns: PColumnIdAndSpec[]) {\n const result: CompositeLinkerMap = new Map();\n for (const linker of columns.filter(\n (l) => !!readAnnotationJson(l.spec, Annotation.IsLinkerColumn),\n )) {\n const groups = LinkerMap.getAxesGroups(getNormalizedAxesList(linker.spec.axesSpec)); // split input axes into groups by parent links from annotation\n\n if (groups.length !== 2) {\n continue; // not a valid linker column\n }\n const [left, right] = groups;\n\n // In case of group:\n // A - C\n // \\_ B _ D\n // E/\n // put 2 variants as keys:\n // A - C\n // \\_ B _ D\n // and\n // E - B - D\n const leftKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(left).map(\n (axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n },\n );\n const rightKeyVariants: [LinkerKey, AxisSpecNormalized[]][] = LinkerMap.getAxesRoots(\n right,\n ).map((axis) => {\n const axes = getArrayFromAxisTree(getAxesTree(axis));\n const key = canonicalizeJson(axes.map(getAxisId));\n return [key, axes];\n });\n\n for (const [keyLeft, spec] of leftKeyVariants) {\n if (!result.has(keyLeft)) {\n result.set(keyLeft, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyRight, spec] of rightKeyVariants) {\n if (!result.has(keyRight)) {\n result.set(keyRight, { keyAxesSpec: spec, linkWith: new Map() });\n }\n }\n for (const [keyLeft] of leftKeyVariants) {\n for (const [keyRight] of rightKeyVariants) {\n result.get(keyLeft)?.linkWith.set(keyRight, linker);\n }\n }\n }\n return new this(result);\n }\n\n /** Get all available nodes of linker graphs if start from sourceAxesKeys */\n searchAvailableAxesKeys(sourceAxesKeys: LinkerKey[]): Set<LinkerKey> {\n const startKeys = new Set(sourceAxesKeys);\n const allAvailableKeys = new Set<LinkerKey>();\n let nextKeys = sourceAxesKeys;\n while (nextKeys.length) {\n const next: LinkerKey[] = [];\n for (const key of nextKeys) {\n const node = this.data.get(key);\n if (!node) continue;\n for (const availableKey of node.linkWith.keys()) {\n if (!allAvailableKeys.has(availableKey) && !startKeys.has(availableKey)) {\n next.push(availableKey);\n allAvailableKeys.add(availableKey);\n }\n }\n }\n nextKeys = next;\n }\n return allAvailableKeys;\n }\n\n /** Get all linker columns that are necessary to reach endKey from startKey */\n searchLinkerPath(startKey: LinkerKey, endKey: LinkerKey): PColumnIdAndSpec[] {\n const previous: Record<LinkerKey, LinkerKey> = {};\n let nextIds = new Set([startKey]);\n const visited = new Set([startKey]);\n while (nextIds.size) {\n const next = new Set<LinkerKey>();\n for (const nextId of nextIds) {\n const node = this.data.get(nextId);\n if (!node) continue;\n for (const availableId of node.linkWith.keys()) {\n previous[availableId] = nextId;\n if (availableId === endKey) {\n const ids: LinkerKey[] = [];\n let current = endKey;\n while (previous[current] !== startKey) {\n ids.push(current);\n current = previous[current];\n }\n ids.push(current);\n // Edge (previous[id] -> id) is stored at the \"from\" node in one-directional map\n return ids.map((id: LinkerKey) => this.data.get(previous[id])!.linkWith.get(id)!);\n } else if (!visited.has(availableId)) {\n next.add(availableId);\n visited.add(availableId);\n }\n }\n }\n nextIds = next;\n }\n return [];\n }\n\n getLinkerColumnsForAxes({\n from: sourceAxes,\n to: targetAxes,\n throwWhenNoLinkExists = true,\n }: {\n from: AxisSpecNormalized[];\n to: AxisSpecNormalized[];\n throwWhenNoLinkExists?: boolean;\n }): PColumnIdAndSpec[] {\n // start keys - all possible keys in linker map using sourceAxes (for example, all axes of block's columns or all axes of columns in data-inputs)\n const startKeys: LinkerKey[] = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n return Array.from(\n new Map(\n LinkerMap.getAxesRoots(targetAxes)\n .map(LinkerMap.getLinkerKeyFromAxisSpec) // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n .flatMap((targetKey) => {\n const linkers = startKeys\n .map((startKey) => this.searchLinkerPath(startKey, targetKey))\n .reduce(\n (shortestPath, path) =>\n (shortestPath.length && shortestPath.length < path.length) || !path.length\n ? shortestPath\n : path,\n [] as PColumnIdAndSpec[],\n )\n .map((linker) => [linker.columnId, linker] as const);\n if (!linkers.length && throwWhenNoLinkExists) {\n throw Error(`Unable to find linker column for ${targetKey}`);\n }\n return linkers;\n }),\n ).values(),\n );\n }\n\n /** Get list of axisSpecs from keys of linker columns map */\n getAxesListFromKeysList(keys: LinkerKey[]): AxisSpecNormalized[] {\n return Array.from(\n new Map(\n keys\n .flatMap((key) => this.data.get(key)?.keyAxesSpec ?? [])\n .map((axis) => [canonicalizeJson(getAxisId(axis)), axis]),\n ).values(),\n );\n }\n\n /** Get axes of target axes that are impossible to be linked to source axes with current linker map */\n getNonLinkableAxes(\n sourceAxes: AxisSpecNormalized[],\n targetAxes: AxisSpecNormalized[],\n ): AxisSpecNormalized[] {\n const startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n // target keys contain all axes to be linked; if some of target axes has parents they must be in the key\n const targetKeys = targetAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n\n const axes = Array.from(\n new Map(\n targetAxes\n .filter((_targetAxis, idx) => {\n const targetKey = targetKeys[idx];\n return !startKeys.some((startKey) => this.searchLinkerPath(startKey, targetKey).length);\n })\n .flatMap((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map((axis) => [\n canonicalizeJson(getAxisId(axis)),\n axis,\n ]),\n ),\n ).values(),\n );\n return axes;\n }\n\n /** Get all axes that can be connected to sourceAxes by linkers */\n getReachableByLinkersAxesFromAxesNormalized(\n sourceAxes: AxisSpecNormalized[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n let startKeys: CanonicalizedJson<AxisId[]>[] = [];\n\n if (matchAxisIdFn) {\n const sourceAxisIdsGrouped: AxisId[][] = sourceAxes.map((axis) =>\n getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId),\n );\n for (const sourceAxisIdsGroup of sourceAxisIdsGrouped) {\n const matched = this.keyAxesIds.find((keyIds: AxisId[]) =>\n keyIds.every((linkerKeyAxisId) =>\n sourceAxisIdsGroup.find((sourceAxisId) => matchAxisIdFn(linkerKeyAxisId, sourceAxisId)),\n ),\n );\n if (matched) {\n startKeys.push(canonicalizeJson(matched));\n }\n }\n } else {\n startKeys = sourceAxes.map(LinkerMap.getLinkerKeyFromAxisSpec);\n }\n\n const availableKeys = this.searchAvailableAxesKeys(startKeys);\n return this.getAxesListFromKeysList([...availableKeys]);\n }\n\n getReachableByLinkersAxesFromAxes(\n sourceAxes: AxisSpec[],\n matchAxisIdFn?: (axisIdOfLinker: AxisId, axisIdOfSource: AxisId) => boolean,\n ): AxisSpecNormalized[] {\n return this.getReachableByLinkersAxesFromAxesNormalized(\n getNormalizedAxesList(sourceAxes),\n matchAxisIdFn,\n );\n }\n\n static getLinkerKeyFromAxisSpec(axis: AxisSpecNormalized): LinkerKey {\n return canonicalizeJson(getArrayFromAxisTree(getAxesTree(axis)).map(getAxisId));\n }\n\n /** Split array of axes into several arrays by parents: axes of one group are parents for each other.\n There are no order inside every group. */\n static getAxesGroups(axesSpec: AxisSpecNormalized[]): AxisSpecNormalized[][] {\n switch (axesSpec.length) {\n case 0:\n return [];\n case 1:\n return [[axesSpec[0]]];\n default:\n break;\n }\n\n const axisKeys = axesSpec.map((spec) => canonicalizeJson(getAxisId(spec)));\n const axisParentsIdxs = axesSpec.map(\n (spec) =>\n new Set(\n spec.parentAxesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)))\n .map((el) => {\n const idx = axisKeys.indexOf(el);\n if (idx === -1) {\n throw new Error(\n `malformed axesSpec: ${JSON.stringify(axesSpec)}, unable to locate parent ${el}`,\n );\n }\n return idx;\n }),\n ),\n );\n\n const allIdxs = [...axesSpec.keys()];\n const groups: number[][] = []; // groups of axis indexes\n\n const usedIdxs = new Set<number>();\n let nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n while (nextFreeEl !== undefined) {\n const currentGroup = [nextFreeEl];\n usedIdxs.add(nextFreeEl);\n\n let nextElsOfCurrentGroup = [nextFreeEl];\n while (nextElsOfCurrentGroup.length) {\n const next = new Set<number>();\n for (const groupIdx of nextElsOfCurrentGroup) {\n const groupElementParents = axisParentsIdxs[groupIdx];\n allIdxs.forEach((idx) => {\n if (idx === groupIdx || usedIdxs.has(idx)) {\n return;\n }\n const parents = axisParentsIdxs[idx];\n if (parents.has(groupIdx) || groupElementParents.has(idx)) {\n currentGroup.push(idx);\n next.add(idx);\n usedIdxs.add(idx);\n }\n });\n }\n nextElsOfCurrentGroup = [...next];\n }\n\n groups.push([...currentGroup]);\n nextFreeEl = allIdxs.find((idx) => !usedIdxs.has(idx));\n }\n\n return groups.map((group) => group.map((idx) => axesSpec[idx]));\n }\n\n /** Get all axes that are not parents of any other axis */\n static getAxesRoots(axes: AxisSpecNormalized[]): AxisSpecNormalized[] {\n const parentsSet = new Set(\n axes.flatMap((axis) => axis.parentAxesSpec).map((spec) => canonicalizeJson(getAxisId(spec))),\n );\n return axes.filter((axis) => !parentsSet.has(canonicalizeJson(getAxisId(axis))));\n }\n}\n"],"mappings":"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"}
|
|
@@ -4,8 +4,6 @@ import { FindColumnsRequest, FindColumnsResponse } from "./find_columns.js";
|
|
|
4
4
|
import { CalculateTableDataRequest, CalculateTableDataResponse } from "./table_calculate.js";
|
|
5
5
|
import { UniqueValuesRequest, UniqueValuesResponse } from "./unique_values.js";
|
|
6
6
|
import { PObjectId } from "../../pool/spec.js";
|
|
7
|
-
import "../../pool/index.js";
|
|
8
|
-
|
|
9
7
|
//#region src/drivers/pframe/pframe.d.ts
|
|
10
8
|
/** Read interface exposed by PFrames library */
|
|
11
9
|
interface PFrame {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pframe.d.ts","names":[],"sources":["../../../src/drivers/pframe/pframe.ts"],"mappings":";;;;;;;;UAQiB,MAAA;;AAAjB;;;EAKE,WAAA,CAAY,OAAA,EAAS,kBAAA,GAAqB,OAAA,CAAQ,mBAAA;EAAA;EAGlD,aAAA,CAAc,QAAA,EAAU,SAAA,GAAY,OAAA,CAAQ,WAAA;EAApB;EAGxB,WAAA,IAAe,OAAA,CAAQ,gBAAA;EAHa;EAMpC,kBAAA,CACE,OAAA,EAAS,yBAAA,CAA0B,SAAA,GACnC,KAAA,GAAQ,UAAA,GACP,OAAA,CAAQ,0BAAA;EANI;EASf,eAAA,CAAgB,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,oBAAA;AAAA;;KAI7C,SAAA,QAAiB,GAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
require("./utils.cjs");
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin } from "./query_spec.js";
|
|
2
|
-
import { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin } from "./query_data.js";
|
|
1
|
+
import { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryLinkerJoinLinker, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin } from "./query_spec.js";
|
|
2
|
+
import { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryLinkerJoin, DataQueryLinkerJoinLinker, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin } from "./query_data.js";
|
|
3
3
|
import { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec } from "./utils.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "./utils.js";
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { AxisValueType, ColumnValueType } from "../spec/spec.js";
|
|
2
2
|
import { JsonDataInfo } from "../data_info.js";
|
|
3
|
-
import "../spec/index.js";
|
|
4
3
|
import { PObjectId } from "../../../pool/spec.js";
|
|
5
|
-
import "../../../pool/index.js";
|
|
6
|
-
|
|
7
4
|
//#region src/drivers/pframe/query/query_common.d.ts
|
|
8
5
|
/**
|
|
9
6
|
* Specification of column/frame structure.
|
|
@@ -796,6 +793,44 @@ interface QueryJoinEntry<Q> {
|
|
|
796
793
|
/** The query to be joined */
|
|
797
794
|
entry: Q;
|
|
798
795
|
}
|
|
796
|
+
/**
|
|
797
|
+
* Linker-join query operation.
|
|
798
|
+
*
|
|
799
|
+
* Inner-joins a linker column (`linker`) with one or more secondary subqueries,
|
|
800
|
+
* then projects out the linker's one-side axes from the joined result. Used to
|
|
801
|
+
* traverse a linker relationship: rows on the secondary side are "lifted" onto
|
|
802
|
+
* the linker's many-side axes, with one-side axes collapsed away.
|
|
803
|
+
*
|
|
804
|
+
* Mirrors {@link QueryOuterJoin}'s `{ primary, secondary }` shape (with
|
|
805
|
+
* `secondary` as an array), but the linker side is a specialized sub-struct —
|
|
806
|
+
* a plain column reference rather than a full join entry.
|
|
807
|
+
*
|
|
808
|
+
* **Join behavior**:
|
|
809
|
+
* - The linker column is inner-joined with all `secondary` entries
|
|
810
|
+
* - After the join, the linker's one-side axes are projected out
|
|
811
|
+
* - Result axes = joined axes minus the linker's one-side axes
|
|
812
|
+
*
|
|
813
|
+
* **Note**: `secondary` must contain at least one entry (empty has no
|
|
814
|
+
* well-defined meaning for linker-join).
|
|
815
|
+
*
|
|
816
|
+
* @template L - Linker sub-struct type (layer-specific)
|
|
817
|
+
* @template JE - Join entry type for the secondary side
|
|
818
|
+
*
|
|
819
|
+
* @example
|
|
820
|
+
* // Traverse linker l1 and read rest data lifted onto l1's many-side
|
|
821
|
+
* {
|
|
822
|
+
* type: 'linkerJoin',
|
|
823
|
+
* linker: { column: 'l1' },
|
|
824
|
+
* secondary: [{ entry: restQuery, ... }]
|
|
825
|
+
* }
|
|
826
|
+
*/
|
|
827
|
+
interface QueryLinkerJoin<L, JE extends QueryJoinEntry<unknown>> {
|
|
828
|
+
type: "linkerJoin";
|
|
829
|
+
/** Linker side — column reference plus layer-specific integration data. */
|
|
830
|
+
linker: L;
|
|
831
|
+
/** Rest side — one or more subqueries joined with the linker (at least one). */
|
|
832
|
+
secondary: JE[];
|
|
833
|
+
}
|
|
799
834
|
//#endregion
|
|
800
|
-
export { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec };
|
|
835
|
+
export { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec };
|
|
801
836
|
//# sourceMappingURL=query_common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query_common.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_common.ts"],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec } from "./query_common.js";
|
|
1
|
+
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin, TypeSpec } from "./query_common.js";
|
|
2
2
|
import { PObjectId } from "../../../pool/spec.js";
|
|
3
|
-
import "../../../pool/index.js";
|
|
4
|
-
|
|
5
3
|
//#region src/drivers/pframe/query/query_data.d.ts
|
|
6
4
|
/**
|
|
7
5
|
* Column identifier with type specification.
|
|
@@ -39,6 +37,21 @@ type DataQuerySparseToDenseColumn = QuerySparseToDenseColumn<PObjectId, ColumnId
|
|
|
39
37
|
type DataQuerySymmetricJoin = QuerySymmetricJoin<DataQueryJoinEntry>;
|
|
40
38
|
/** @see QueryOuterJoin */
|
|
41
39
|
type DataQueryOuterJoin = QueryOuterJoin<DataQueryJoinEntry>;
|
|
40
|
+
/**
|
|
41
|
+
* Linker side of a data-layer linker-join.
|
|
42
|
+
*
|
|
43
|
+
* Carries the linker column id along with integration-derived artifacts needed
|
|
44
|
+
* for execution:
|
|
45
|
+
* - `axesMapping` — how the linker's axes map into the joined result
|
|
46
|
+
* - `oneSideAxesIndices` — which axis indices in the joined result to project out
|
|
47
|
+
*/
|
|
48
|
+
type DataQueryLinkerJoinLinker = {
|
|
49
|
+
/** Linker column reference. */column: PObjectId; /** Linker's axes mapped into the joined result. */
|
|
50
|
+
axesMapping: number[]; /** Axis indices (in the joined result) to project out — the linker's one-side axes. */
|
|
51
|
+
oneSideAxesIndices: number[];
|
|
52
|
+
};
|
|
53
|
+
/** @see QueryLinkerJoin */
|
|
54
|
+
type DataQueryLinkerJoin = QueryLinkerJoin<DataQueryLinkerJoinLinker, DataQueryJoinEntry>;
|
|
42
55
|
/** @see QuerySliceAxes */
|
|
43
56
|
type DataQuerySliceAxes = QuerySliceAxes<DataQuery, QueryAxisSelector<number>>;
|
|
44
57
|
/** @see QuerySort */
|
|
@@ -56,7 +69,7 @@ type DataQueryFilter = QueryFilter<DataQuery, DataQueryBooleanExpression>;
|
|
|
56
69
|
* - Join operations: innerJoin, fullJoin, outerJoin
|
|
57
70
|
* - Transformations: sliceAxes, sort, filter
|
|
58
71
|
*/
|
|
59
|
-
type DataQuery = DataQueryColumn | DataQueryInlineColumn | DataQuerySparseToDenseColumn | DataQuerySymmetricJoin | DataQueryOuterJoin | DataQuerySliceAxes | DataQuerySort | DataQueryFilter;
|
|
72
|
+
type DataQuery = DataQueryColumn | DataQueryInlineColumn | DataQuerySparseToDenseColumn | DataQuerySymmetricJoin | DataQueryOuterJoin | DataQueryLinkerJoin | DataQuerySliceAxes | DataQuerySort | DataQueryFilter;
|
|
60
73
|
/** @see ExprAxisRef */
|
|
61
74
|
type DataExprAxisRef = ExprAxisRef<number>;
|
|
62
75
|
/** @see ExprColumnRef */
|
|
@@ -64,5 +77,5 @@ type DataExprColumnRef = ExprColumnRef<number>;
|
|
|
64
77
|
type DataQueryExpression = DataExprColumnRef | DataExprAxisRef | ExprConstant | ExprNumericBinary<DataQueryExpression> | ExprNumericComparison<DataQueryExpression> | ExprNumericUnary<DataQueryExpression> | ExprStringEquals<DataQueryExpression> | ExprStringContains<DataQueryExpression> | ExprStringRegex<DataQueryExpression> | ExprStringContainsFuzzy<DataQueryExpression> | ExprIsNull<DataQueryExpression> | ExprIfNull<DataQueryExpression> | ExprLogicalUnary<DataQueryExpression> | ExprLogicalVariadic<DataQueryExpression> | ExprIsIn<DataQueryExpression, string> | ExprIsIn<DataQueryExpression, number>;
|
|
65
78
|
type DataQueryBooleanExpression = InferBooleanExpressionUnion<DataQueryExpression>;
|
|
66
79
|
//#endregion
|
|
67
|
-
export { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin };
|
|
80
|
+
export { DataExprAxisRef, DataExprColumnRef, DataQuery, DataQueryBooleanExpression, DataQueryColumn, DataQueryExpression, DataQueryFilter, DataQueryInlineColumn, DataQueryJoinEntry, DataQueryLinkerJoin, DataQueryLinkerJoinLinker, DataQueryOuterJoin, DataQuerySliceAxes, DataQuerySort, DataQuerySparseToDenseColumn, DataQuerySymmetricJoin };
|
|
68
81
|
//# sourceMappingURL=query_data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query_data.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_data.ts"],"mappings":";;;;;;AA8BwB;;;KAQnB,mBAAA;EAEH,sCAAA,EAAA,EAAI,SAAA,EAEJ;EAAA,QAAA,EAAU,QAAA;AAAA;;AAeZ;;;;;;;;;AAMA;;UANiB,kBAAA,SAA2B,cAAA,CAAe,SAAA;EAM7B;EAJ5B,WAAA;AAAA;;KAIU,eAAA,GAAkB,WAAA;;KAElB,qBAAA,GAAwB,iBAAA,CAAkB,mBAAA;AAEtD;AAAA,KAAY,4BAAA,GAA+B,wBAAA,CAAyB,SAAA,EAAW,mBAAA;;KAEnE,sBAAA,GAAyB,kBAAA,CAAmB,kBAAA;;KAE5C,kBAAA,GAAqB,cAAA,CAAe,kBAAA;;;;;;;;AAFhD;KAWY,yBAAA;iCAEV,MAAA,EAAQ,SAAA,EAbgE;EAexE,WAAA,YAb4B;EAe5B,kBAAA;AAAA;;KAGU,mBAAA,GAAsB,eAAA,CAAgB,yBAAA,EAA2B,kBAAA;;KAEjE,kBAAA,GAAqB,cAAA,CAAe,SAAA,EAAW,iBAAA;;KAE/C,aAAA,GAAgB,SAAA,CAAU,SAAA,EAAW,mBAAA;;KAErC,eAAA,GAAkB,WAAA,CAAY,SAAA,EAAW,0BAAA;;;;AANrD;;;;;;;;KAmBY,SAAA,GACR,eAAA,GACA,qBAAA,GACA,4BAAA,GACA,sBAAA,GACA,kBAAA,GACA,mBAAA,GACA,kBAAA,GACA,aAAA,GACA,eAAA;;KAGQ,eAAA,GAAkB,WAAA;;KAElB,iBAAA,GAAoB,aAAA;AAAA,KAEpB,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,UAAA,CAAW,mBAAA,IACX,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA;AAAA,KAED,0BAAA,GAA6B,2BAAA,CAA4B,mBAAA"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { Domain, PColumnIdAndSpec, PColumnSpec } from "../spec/spec.js";
|
|
2
2
|
import { SingleAxisSelector } from "../spec/selectors.js";
|
|
3
|
-
import "
|
|
4
|
-
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin } from "./query_common.js";
|
|
3
|
+
import { ExprAxisRef, ExprColumnRef, ExprConstant, ExprIfNull, ExprIsIn, ExprIsNull, ExprLogicalUnary, ExprLogicalVariadic, ExprNumericBinary, ExprNumericComparison, ExprNumericUnary, ExprStringContains, ExprStringContainsFuzzy, ExprStringEquals, ExprStringRegex, InferBooleanExpressionUnion, QueryAxisSelector, QueryColumn, QueryFilter, QueryInlineColumn, QueryJoinEntry, QueryLinkerJoin, QueryOuterJoin, QuerySliceAxes, QuerySort, QuerySparseToDenseColumn, QuerySymmetricJoin } from "./query_common.js";
|
|
5
4
|
import { PObjectId } from "../../../pool/spec.js";
|
|
6
|
-
import "../../../pool/index.js";
|
|
7
|
-
|
|
8
5
|
//#region src/drivers/pframe/query/query_spec.d.ts
|
|
9
6
|
/**
|
|
10
7
|
* Column identifier with specification.
|
|
@@ -48,6 +45,17 @@ type SpecQuerySparseToDenseColumn<C = PObjectId> = QuerySparseToDenseColumn<C, P
|
|
|
48
45
|
type SpecQuerySymmetricJoin<C = PObjectId> = QuerySymmetricJoin<SpecQueryJoinEntry<C>>;
|
|
49
46
|
/** @see QueryOuterJoin */
|
|
50
47
|
type SpecQueryOuterJoin<C = PObjectId> = QueryOuterJoin<SpecQueryJoinEntry<C>>;
|
|
48
|
+
/**
|
|
49
|
+
* Linker side of a spec-layer linker-join.
|
|
50
|
+
*
|
|
51
|
+
* At the spec layer the linker is just a column reference — integration artifacts
|
|
52
|
+
* (axes mapping, one-side indices) are derived during spec→data conversion.
|
|
53
|
+
*/
|
|
54
|
+
type SpecQueryLinkerJoinLinker<C = PObjectId> = {
|
|
55
|
+
/** Linker column reference. */column: C;
|
|
56
|
+
};
|
|
57
|
+
/** @see QueryLinkerJoin */
|
|
58
|
+
type SpecQueryLinkerJoin<C = PObjectId> = QueryLinkerJoin<SpecQueryLinkerJoinLinker<C>, SpecQueryJoinEntry<C>>;
|
|
51
59
|
/** @see QuerySliceAxes */
|
|
52
60
|
type SpecQuerySliceAxes<C = PObjectId> = QuerySliceAxes<SpecQuery<C>, QueryAxisSelector<SingleAxisSelector>>;
|
|
53
61
|
/** @see QuerySort */
|
|
@@ -69,7 +77,7 @@ type SpecQueryFilter<C = PObjectId> = QueryFilter<SpecQuery<C>, SpecQueryBoolean
|
|
|
69
77
|
* - Join operations: innerJoin, fullJoin, outerJoin
|
|
70
78
|
* - Transformations: sliceAxes, sort, filter
|
|
71
79
|
*/
|
|
72
|
-
type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C>;
|
|
80
|
+
type SpecQuery<C = PObjectId> = SpecQueryColumn<C> | SpecQueryInlineColumn | SpecQuerySparseToDenseColumn<C> | SpecQuerySymmetricJoin<C> | SpecQueryOuterJoin<C> | SpecQueryLinkerJoin<C> | SpecQuerySliceAxes<C> | SpecQuerySort<C> | SpecQueryFilter<C>;
|
|
73
81
|
/** @see ExprAxisRef */
|
|
74
82
|
type SpecExprAxisRef = ExprAxisRef<SingleAxisSelector>;
|
|
75
83
|
/** @see ExprColumnRef */
|
|
@@ -77,5 +85,5 @@ type SpecExprColumnRef = ExprColumnRef<PObjectId>;
|
|
|
77
85
|
type SpecQueryExpression = SpecExprColumnRef | SpecExprAxisRef | ExprConstant | ExprNumericBinary<SpecQueryExpression> | ExprNumericComparison<SpecQueryExpression> | ExprNumericUnary<SpecQueryExpression> | ExprStringEquals<SpecQueryExpression> | ExprStringContains<SpecQueryExpression> | ExprStringRegex<SpecQueryExpression> | ExprStringContainsFuzzy<SpecQueryExpression> | ExprIsNull<SpecQueryExpression> | ExprIfNull<SpecQueryExpression> | ExprLogicalUnary<SpecQueryExpression> | ExprLogicalVariadic<SpecQueryExpression> | ExprIsIn<SpecQueryExpression, string> | ExprIsIn<SpecQueryExpression, number>;
|
|
78
86
|
type SpecQueryBooleanExpression = InferBooleanExpressionUnion<SpecQueryExpression>;
|
|
79
87
|
//#endregion
|
|
80
|
-
export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin };
|
|
88
|
+
export { SpecExprAxisRef, SpecExprColumnRef, SpecQuery, SpecQueryBooleanExpression, SpecQueryColumn, SpecQueryExpression, SpecQueryFilter, SpecQueryInlineColumn, SpecQueryJoinEntry, SpecQueryLinkerJoin, SpecQueryLinkerJoinLinker, SpecQueryOuterJoin, SpecQuerySliceAxes, SpecQuerySort, SpecQuerySparseToDenseColumn, SpecQuerySymmetricJoin };
|
|
81
89
|
//# sourceMappingURL=query_spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query_spec.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/query_spec.ts"],"mappings":";;;;;;;;;;AA8ByF;KAQpF,eAAA;wCAEH,EAAA,EAAI,SAAA,EAAJ;EAEA,IAAA,EAAM,WAAA;AAAA;;;;AAmBR;;;;;;;;;;;;;KAAY,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,SAAA,CAAU,CAAA;EAAV,6DAE7D,cAAA;IAAA,sDAEE,IAAA,EAAM,kBAAA,EAAA;IAEN,aAAA,EAAe,MAAA;EAAA;AAAA;;KAKP,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,CAAA;;KAE7C,qBAAA,GAAwB,iBAAA,CAAkB,eAAA;;KAE1C,4BAAA,KAAiC,SAAA,IAAa,wBAAA,CACxD,CAAA,EACA,gBAAA;;KAGU,sBAAA,KAA2B,SAAA,IAAa,kBAAA,CAAmB,kBAAA,CAAmB,CAAA;;KAE9E,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAAe,kBAAA,CAAmB,CAAA;;;;;;AATlF;KAgBY,yBAAA,KAA8B,SAAA;iCAExC,MAAA,EAAQ,CAAA;AAAA;AAhBV;AAAA,KAmBY,mBAAA,KAAwB,SAAA,IAAa,eAAA,CAC/C,yBAAA,CAA0B,CAAA,GAC1B,kBAAA,CAAmB,CAAA;;KAGT,kBAAA,KAAuB,SAAA,IAAa,cAAA,CAC9C,SAAA,CAAU,CAAA,GACV,iBAAA,CAAkB,kBAAA;;KAGR,aAAA,KAAkB,SAAA,IAAa,SAAA,CAAU,SAAA,CAAU,CAAA,GAAI,mBAAA;;KAEvD,eAAA,KAAoB,SAAA,IAAa,WAAA,CAAY,SAAA,CAAU,CAAA,GAAI,0BAAA;;;;;;;;;AA1BvE;;;;;;;KA2CY,SAAA,KAAc,SAAA,IACtB,eAAA,CAAgB,CAAA,IAChB,qBAAA,GACA,4BAAA,CAA6B,CAAA,IAC7B,sBAAA,CAAuB,CAAA,IACvB,kBAAA,CAAmB,CAAA,IACnB,mBAAA,CAAoB,CAAA,IACpB,kBAAA,CAAmB,CAAA,IACnB,aAAA,CAAc,CAAA,IACd,eAAA,CAAgB,CAAA;;KAGR,eAAA,GAAkB,WAAA,CAAY,kBAAA;;KAE9B,iBAAA,GAAoB,aAAA,CAAc,SAAA;AAAA,KAElC,mBAAA,GACR,iBAAA,GACA,eAAA,GACA,YAAA,GACA,iBAAA,CAAkB,mBAAA,IAClB,qBAAA,CAAsB,mBAAA,IACtB,gBAAA,CAAiB,mBAAA,IACjB,gBAAA,CAAiB,mBAAA,IACjB,kBAAA,CAAmB,mBAAA,IACnB,eAAA,CAAgB,mBAAA,IAChB,uBAAA,CAAwB,mBAAA,IACxB,UAAA,CAAW,mBAAA,IACX,UAAA,CAAW,mBAAA,IACX,gBAAA,CAAiB,mBAAA,IACjB,mBAAA,CAAoB,mBAAA,IACpB,QAAA,CAAS,mBAAA,YACT,QAAA,CAAS,mBAAA;AAAA,KAED,0BAAA,GAA6B,2BAAA,CAA4B,mBAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
const require_util = require(
|
|
2
|
-
const require_json = require(
|
|
3
|
-
|
|
1
|
+
const require_util = require("../../../util.cjs");
|
|
2
|
+
const require_json = require("../../../json.cjs");
|
|
4
3
|
//#region src/drivers/pframe/query/utils.ts
|
|
5
4
|
const booleanTypesSet = new Set([
|
|
6
5
|
"numericComparison",
|
|
@@ -66,6 +65,16 @@ function traverseQuerySpec(query, visitor) {
|
|
|
66
65
|
secondary: query.secondary.map(traverseEntry)
|
|
67
66
|
};
|
|
68
67
|
break;
|
|
68
|
+
case "linkerJoin":
|
|
69
|
+
result = {
|
|
70
|
+
...query,
|
|
71
|
+
linker: {
|
|
72
|
+
...query.linker,
|
|
73
|
+
column: visitor.column(query.linker.column)
|
|
74
|
+
},
|
|
75
|
+
secondary: query.secondary.map(traverseEntry)
|
|
76
|
+
};
|
|
77
|
+
break;
|
|
69
78
|
case "filter":
|
|
70
79
|
case "sort":
|
|
71
80
|
case "sliceAxes":
|
|
@@ -115,6 +124,13 @@ function sortSpecQuery(query) {
|
|
|
115
124
|
secondary: sorted
|
|
116
125
|
};
|
|
117
126
|
}
|
|
127
|
+
case "linkerJoin": {
|
|
128
|
+
const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
|
|
129
|
+
return {
|
|
130
|
+
...node,
|
|
131
|
+
secondary: sorted
|
|
132
|
+
};
|
|
133
|
+
}
|
|
118
134
|
case "sliceAxes": return {
|
|
119
135
|
...node,
|
|
120
136
|
axisFilters: node.axisFilters.toSorted((a, b) => {
|
|
@@ -163,6 +179,16 @@ function cmpQuerySpec(lhs, rhs) {
|
|
|
163
179
|
}
|
|
164
180
|
return 0;
|
|
165
181
|
}
|
|
182
|
+
case "linkerJoin": {
|
|
183
|
+
const rhsLinker = rhs;
|
|
184
|
+
if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
|
|
185
|
+
if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
|
|
186
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
187
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
|
|
188
|
+
if (cmp !== 0) return cmp;
|
|
189
|
+
}
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
166
192
|
case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
|
|
167
193
|
case "sort": return cmpQuerySpec(lhs.input, rhs.input);
|
|
168
194
|
case "filter": return cmpQuerySpec(lhs.input, rhs.input);
|
|
@@ -180,11 +206,11 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
|
|
|
180
206
|
}
|
|
181
207
|
return 0;
|
|
182
208
|
}
|
|
183
|
-
|
|
184
209
|
//#endregion
|
|
185
210
|
exports.collectSpecQueryColumns = collectSpecQueryColumns;
|
|
186
211
|
exports.isBooleanExpression = isBooleanExpression;
|
|
187
212
|
exports.mapSpecQueryColumns = mapSpecQueryColumns;
|
|
188
213
|
exports.sortSpecQuery = sortSpecQuery;
|
|
189
214
|
exports.traverseQuerySpec = traverseQuerySpec;
|
|
215
|
+
|
|
190
216
|
//# sourceMappingURL=utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.cjs","names":["canonicalizeJson"],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"mappings":";;;iBAsBgB,mBAAA,CAAoB,IAAA,EAAM,mBAAA,GAAsB,IAAA,IAAQ,0BAAA;;AAAxE;;;;;;;;;iBAiBgB,iBAAA,QAAA,CACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,OAAA;EAFc,+EAIZ,MAAA,GAAS,CAAA,EAAG,EAAA,KAAO,EAAA,EAJU;EAM7B,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,EAAA,MAAQ,SAAA,CAAU,EAAA,GALrC;EAOL,SAAA,IAAa,KAAA,EAAO,kBAAA,CAAmB,EAAA,MAAQ,kBAAA,CAAmB,EAAA;AAAA,IAEnE,SAAA,CAAU,EAAA;;iBAmDG,mBAAA,QAAA,CACd,KAAA,EAAO,SAAA,CAAU,EAAA,GACjB,EAAA,GAAK,CAAA,EAAG,EAAA,KAAO,EAAA,GACd,SAAA,CAAU,EAAA;;iBAKG,uBAAA,GAAA,CAA2B,KAAA,EAAO,SAAA,CAAU,CAAA,IAAK,CAAA;AAAA,iBAWjD,aAAA,CAAc,KAAA,EAAO,SAAA,GAAY,SAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { assertNever } from "../../../util.js";
|
|
2
2
|
import { canonicalizeJson } from "../../../json.js";
|
|
3
|
-
|
|
4
3
|
//#region src/drivers/pframe/query/utils.ts
|
|
5
4
|
const booleanTypesSet = new Set([
|
|
6
5
|
"numericComparison",
|
|
@@ -66,6 +65,16 @@ function traverseQuerySpec(query, visitor) {
|
|
|
66
65
|
secondary: query.secondary.map(traverseEntry)
|
|
67
66
|
};
|
|
68
67
|
break;
|
|
68
|
+
case "linkerJoin":
|
|
69
|
+
result = {
|
|
70
|
+
...query,
|
|
71
|
+
linker: {
|
|
72
|
+
...query.linker,
|
|
73
|
+
column: visitor.column(query.linker.column)
|
|
74
|
+
},
|
|
75
|
+
secondary: query.secondary.map(traverseEntry)
|
|
76
|
+
};
|
|
77
|
+
break;
|
|
69
78
|
case "filter":
|
|
70
79
|
case "sort":
|
|
71
80
|
case "sliceAxes":
|
|
@@ -115,6 +124,13 @@ function sortSpecQuery(query) {
|
|
|
115
124
|
secondary: sorted
|
|
116
125
|
};
|
|
117
126
|
}
|
|
127
|
+
case "linkerJoin": {
|
|
128
|
+
const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);
|
|
129
|
+
return {
|
|
130
|
+
...node,
|
|
131
|
+
secondary: sorted
|
|
132
|
+
};
|
|
133
|
+
}
|
|
118
134
|
case "sliceAxes": return {
|
|
119
135
|
...node,
|
|
120
136
|
axisFilters: node.axisFilters.toSorted((a, b) => {
|
|
@@ -163,6 +179,16 @@ function cmpQuerySpec(lhs, rhs) {
|
|
|
163
179
|
}
|
|
164
180
|
return 0;
|
|
165
181
|
}
|
|
182
|
+
case "linkerJoin": {
|
|
183
|
+
const rhsLinker = rhs;
|
|
184
|
+
if (lhs.linker.column !== rhsLinker.linker.column) return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;
|
|
185
|
+
if (lhs.secondary.length !== rhsLinker.secondary.length) return lhs.secondary.length - rhsLinker.secondary.length;
|
|
186
|
+
for (let i = 0; i < lhs.secondary.length; i++) {
|
|
187
|
+
const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);
|
|
188
|
+
if (cmp !== 0) return cmp;
|
|
189
|
+
}
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
166
192
|
case "sliceAxes": return cmpQuerySpec(lhs.input, rhs.input);
|
|
167
193
|
case "sort": return cmpQuerySpec(lhs.input, rhs.input);
|
|
168
194
|
case "filter": return cmpQuerySpec(lhs.input, rhs.input);
|
|
@@ -180,7 +206,7 @@ function cmpQueryJoinEntrySpec(lhs, rhs) {
|
|
|
180
206
|
}
|
|
181
207
|
return 0;
|
|
182
208
|
}
|
|
183
|
-
|
|
184
209
|
//#endregion
|
|
185
210
|
export { collectSpecQueryColumns, isBooleanExpression, mapSpecQueryColumns, sortSpecQuery, traverseQuerySpec };
|
|
211
|
+
|
|
186
212
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":";;;;AASA,MAAM,kBAAkB,IAAI,IAAwC;CAClE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,oBAAoB,MAA+D;AACjG,QAAO,gBAAgB,IAErB,KAAK,KACN;;;;;;;;;;;;AAaH,SAAgB,kBACd,OACA,SAQe;CACf,MAAM,iBAAiB,UAA0D;EAC/E,MAAM,YAAoC;GACxC,GAAG;GACH,OAAO,kBAAkB,MAAM,OAAO,QAAQ;GAC/C;AACD,SAAO,QAAQ,YAAY,QAAQ,UAAU,UAAU,GAAG;;CAG5D,IAAI;AACJ,SAAQ,MAAM,MAAd;EACE,KAAK;AACH,YAAS;IAAE,MAAM;IAAU,QAAQ,QAAQ,OAAO,MAAM,OAAO;IAAE;AACjE;EACF,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,QAAQ,QAAQ,OAAO,MAAM,OAAO;IAAE;AAC3D;EACF,KAAK;AACH,YAAS;AACT;EACF,KAAK;EACL,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,SAAS,MAAM,QAAQ,IAAI,cAAc;IAAE;AAChE;EACF,KAAK;AACH,YAAS;IACP,GAAG;IACH,SAAS,cAAc,MAAM,QAAQ;IACrC,WAAW,MAAM,UAAU,IAAI,cAAc;IAC9C;AACD;EACF,KAAK;EACL,KAAK;EACL,KAAK;AACH,YAAS;IAAE,GAAG;IAAO,OAAO,kBAAkB,MAAM,OAAO,QAAQ;IAAE;AACrE;EACF,QACE,aAAY,MAAM;;AAGtB,QAAO,QAAQ,OAAO,QAAQ,KAAK,OAAO,GAAG;;;AAI/C,SAAgB,oBACd,OACA,IACe;AACf,QAAO,kBAAkB,OAAO,EAAE,QAAQ,IAAI,CAAC;;;AAIjD,SAAgB,wBAA2B,OAA0B;CACnE,MAAM,SAAc,EAAE;AACtB,mBAAkB,OAAO,EACvB,SAAS,MAAS;AAChB,SAAO,KAAK,EAAE;AACd,SAAO;IAEV,CAAC;AACF,QAAO;;AAGT,SAAgB,cAAc,OAA6B;AACzD,QAAO,kBAAkB,OAAO;EAC9B,SAAS,MAAM;EACf,OAAO,SAAS;AACd,WAAQ,KAAK,MAAb;IACE,KAAK,sBACH,QAAO;KAAE,GAAG;KAAM,aAAa,KAAK,YAAY,UAAU,GAAG,MAAM,IAAI,EAAE;KAAE;IAC7E,KAAK;IACL,KAAK,YAAY;KACf,MAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,CAAC,KAAK,sBAAsB;AAC5D,YAAO;MAAE,GAAG;MAAM,SAAS;MAAQ;;IAErC,KAAK,aAAa;KAChB,MAAM,SAAS,CAAC,GAAG,KAAK,UAAU,CAAC,KAAK,sBAAsB;AAC9D,YAAO;MAAE,GAAG;MAAM,WAAW;MAAQ;;IAEvC,KAAK,YACH,QAAO;KACL,GAAG;KACH,aAAa,KAAK,YAAY,UAAU,GAAG,MAAM;MAC/C,MAAM,KAAK,iBAAiB,EAAE,aAAa;MAC3C,MAAM,KAAK,iBAAiB,EAAE,aAAa;AAC3C,aAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;OACtC;KACH;IACH,QACE,QAAO;;;EAGb,YAAY,WAAW;GACrB,GAAG;GACH,gBAAgB,MAAM,eAAe,UAAU,GAAG,MAAM;IACtD,MAAM,KAAK,iBAAiB,EAAE,KAAK;IACnC,MAAM,KAAK,iBAAiB,EAAE,KAAK;AACnC,WAAO,KAAK,KAAK,KAAK,OAAO,KAAK,IAAI;KACtC;GACH;EACF,CAAC;;AAGJ,SAAS,aAAa,KAAgB,KAAwB;AAC5D,KAAI,IAAI,SAAS,IAAI,KACnB,QAAO,IAAI,OAAO,IAAI,OAAO,KAAK;AAEpC,SAAQ,IAAI,MAAZ;EACE,KAAK,SACH,QAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK,eACH,QAAO,IAAI,KAAK,KAAM,IAAmB,KAAK,KAC1C,KACA,IAAI,KAAK,OAAQ,IAAmB,KAAK,KACvC,IACA;EACR,KAAK,sBACH,QAAO,IAAI,SAAU,IAAmB,SACpC,KACA,IAAI,WAAY,IAAmB,SACjC,IACA;EACR,KAAK;EACL,KAAK,YAAY;GACf,MAAM,UAAU;AAChB,OAAI,IAAI,QAAQ,WAAW,QAAQ,QAAQ,OACzC,QAAO,IAAI,QAAQ,SAAS,QAAQ,QAAQ;AAE9C,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,QAAQ,KAAK;IAC3C,MAAM,MAAM,sBAAsB,IAAI,QAAQ,IAAI,QAAQ,QAAQ,GAAG;AACrE,QAAI,QAAQ,EAAG,QAAO;;AAExB,UAAO;;EAET,KAAK,aAAa;GAChB,MAAM,WAAW;GACjB,MAAM,MAAM,sBAAsB,IAAI,SAAS,SAAS,QAAQ;AAChE,OAAI,QAAQ,EAAG,QAAO;AACtB,OAAI,IAAI,UAAU,WAAW,SAAS,UAAU,OAC9C,QAAO,IAAI,UAAU,SAAS,SAAS,UAAU;AAEnD,QAAK,IAAI,IAAI,GAAG,IAAI,IAAI,UAAU,QAAQ,KAAK;IAC7C,MAAM,MAAM,sBAAsB,IAAI,UAAU,IAAI,SAAS,UAAU,GAAG;AAC1E,QAAI,QAAQ,EAAG,QAAO;;AAExB,UAAO;;EAET,KAAK,YACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,KAAK,OACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,KAAK,SACH,QAAO,aAAa,IAAI,OAAQ,IAAmB,MAAM;EAC3D,QACE,aAAY,IAAI;;;AAItB,SAAS,sBAAsB,KAAyB,KAAiC;CACvF,MAAM,MAAM,aAAa,IAAI,OAAO,IAAI,MAAM;AAC9C,KAAI,QAAQ,EAAG,QAAO;AACtB,KAAI,IAAI,eAAe,WAAW,IAAI,eAAe,OACnD,QAAO,IAAI,eAAe,SAAS,IAAI,eAAe;AAExD,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,eAAe,QAAQ,KAAK;EAClD,MAAM,OAAO,iBAAiB,IAAI,eAAe,GAAG;EACpD,MAAM,OAAO,iBAAiB,IAAI,eAAe,GAAG;AACpD,MAAI,SAAS,KAAM,QAAO,OAAO,OAAO,KAAK;;AAE/C,QAAO"}
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../src/drivers/pframe/query/utils.ts"],"sourcesContent":["import { canonicalizeJson } from \"../../../json\";\nimport { assertNever } from \"../../../util\";\nimport type {\n SpecQueryBooleanExpression,\n SpecQueryExpression,\n SpecQuery,\n SpecQueryJoinEntry,\n} from \"./query_spec\";\n\nconst booleanTypesSet = new Set<SpecQueryBooleanExpression[\"type\"]>([\n \"numericComparison\",\n \"stringEquals\",\n \"stringContains\",\n \"stringContainsFuzzy\",\n \"stringRegex\",\n \"isNull\",\n \"not\",\n \"and\",\n \"or\",\n \"isIn\",\n]);\n\nexport function isBooleanExpression(expr: SpecQueryExpression): expr is SpecQueryBooleanExpression {\n return booleanTypesSet.has(\n // @ts-expect-error -- TypeScript doesn't understand the discriminated union here, but we do at runtime\n expr.type,\n );\n}\n\n/**\n * Recursively traverses a SpecQuery tree bottom-up, applying visitor callbacks.\n *\n * Traversal order:\n * 1. Recurse into child queries\n * 2. Apply `column` to transform column references in leaf nodes\n * 3. Apply `joinEntry` to each join entry (with inner query already traversed)\n * 4. Assemble node with transformed children\n * 5. Apply `node` to the assembled node\n */\nexport function traverseQuerySpec<C1, C2>(\n query: SpecQuery<C1>,\n visitor: {\n /** Transform column references in leaf nodes (column, sparseToDenseColumn). */\n column: (c: C1) => C2;\n /** Visit a node after its children have been traversed. */\n node?: (node: SpecQuery<C2>) => SpecQuery<C2>;\n /** Visit a join entry after its inner query has been traversed. */\n joinEntry?: (entry: SpecQueryJoinEntry<C2>) => SpecQueryJoinEntry<C2>;\n },\n): SpecQuery<C2> {\n const traverseEntry = (entry: SpecQueryJoinEntry<C1>): SpecQueryJoinEntry<C2> => {\n const traversed: SpecQueryJoinEntry<C2> = {\n ...entry,\n entry: traverseQuerySpec(entry.entry, visitor),\n };\n return visitor.joinEntry ? visitor.joinEntry(traversed) : traversed;\n };\n\n let result: SpecQuery<C2>;\n switch (query.type) {\n case \"column\":\n result = { type: \"column\", column: visitor.column(query.column) };\n break;\n case \"sparseToDenseColumn\":\n result = { ...query, column: visitor.column(query.column) };\n break;\n case \"inlineColumn\":\n result = query;\n break;\n case \"innerJoin\":\n case \"fullJoin\":\n result = { ...query, entries: query.entries.map(traverseEntry) };\n break;\n case \"outerJoin\":\n result = {\n ...query,\n primary: traverseEntry(query.primary),\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"linkerJoin\":\n result = {\n ...query,\n linker: { ...query.linker, column: visitor.column(query.linker.column) },\n secondary: query.secondary.map(traverseEntry),\n };\n break;\n case \"filter\":\n case \"sort\":\n case \"sliceAxes\":\n result = { ...query, input: traverseQuerySpec(query.input, visitor) };\n break;\n default:\n assertNever(query);\n }\n\n return visitor.node ? visitor.node(result) : result;\n}\n\n/** Recursively maps all column references in a SpecQuery tree. */\nexport function mapSpecQueryColumns<C1, C2>(\n query: SpecQuery<C1>,\n cb: (c: C1) => C2,\n): SpecQuery<C2> {\n return traverseQuerySpec(query, { column: cb });\n}\n\n/** Collects all column references from a SpecQuery tree. */\nexport function collectSpecQueryColumns<C>(query: SpecQuery<C>): C[] {\n const result: C[] = [];\n traverseQuerySpec(query, {\n column: (c: C) => {\n result.push(c);\n return c;\n },\n });\n return result;\n}\n\nexport function sortSpecQuery(query: SpecQuery): SpecQuery {\n return traverseQuerySpec(query, {\n column: (c) => c,\n node: (node) => {\n switch (node.type) {\n case \"sparseToDenseColumn\":\n return { ...node, axesIndices: node.axesIndices.toSorted((a, b) => a - b) };\n case \"innerJoin\":\n case \"fullJoin\": {\n const sorted = [...node.entries].sort(cmpQueryJoinEntrySpec);\n return { ...node, entries: sorted };\n }\n case \"outerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"linkerJoin\": {\n const sorted = [...node.secondary].sort(cmpQueryJoinEntrySpec);\n return { ...node, secondary: sorted };\n }\n case \"sliceAxes\":\n return {\n ...node,\n axisFilters: node.axisFilters.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axisSelector);\n const bk = canonicalizeJson(b.axisSelector);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n };\n default:\n return node;\n }\n },\n joinEntry: (entry) => ({\n ...entry,\n qualifications: entry.qualifications.toSorted((a, b) => {\n const ak = canonicalizeJson(a.axis);\n const bk = canonicalizeJson(b.axis);\n return ak < bk ? -1 : ak === bk ? 0 : 1;\n }),\n }),\n });\n}\n\nfunction cmpQuerySpec(lhs: SpecQuery, rhs: SpecQuery): number {\n if (lhs.type !== rhs.type) {\n return lhs.type < rhs.type ? -1 : 1;\n }\n switch (lhs.type) {\n case \"column\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"inlineColumn\":\n return lhs.spec.id < (rhs as typeof lhs).spec.id\n ? -1\n : lhs.spec.id === (rhs as typeof lhs).spec.id\n ? 0\n : 1;\n case \"sparseToDenseColumn\":\n return lhs.column < (rhs as typeof lhs).column\n ? -1\n : lhs.column === (rhs as typeof lhs).column\n ? 0\n : 1;\n case \"innerJoin\":\n case \"fullJoin\": {\n const rhsJoin = rhs as typeof lhs;\n if (lhs.entries.length !== rhsJoin.entries.length) {\n return lhs.entries.length - rhsJoin.entries.length;\n }\n for (let i = 0; i < lhs.entries.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.entries[i], rhsJoin.entries[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"outerJoin\": {\n const rhsOuter = rhs as typeof lhs;\n const cmp = cmpQueryJoinEntrySpec(lhs.primary, rhsOuter.primary);\n if (cmp !== 0) return cmp;\n if (lhs.secondary.length !== rhsOuter.secondary.length) {\n return lhs.secondary.length - rhsOuter.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsOuter.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"linkerJoin\": {\n const rhsLinker = rhs as typeof lhs;\n if (lhs.linker.column !== rhsLinker.linker.column) {\n return lhs.linker.column < rhsLinker.linker.column ? -1 : 1;\n }\n if (lhs.secondary.length !== rhsLinker.secondary.length) {\n return lhs.secondary.length - rhsLinker.secondary.length;\n }\n for (let i = 0; i < lhs.secondary.length; i++) {\n const cmp = cmpQueryJoinEntrySpec(lhs.secondary[i], rhsLinker.secondary[i]);\n if (cmp !== 0) return cmp;\n }\n return 0;\n }\n case \"sliceAxes\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"sort\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n case \"filter\":\n return cmpQuerySpec(lhs.input, (rhs as typeof lhs).input);\n default:\n assertNever(lhs);\n }\n}\n\nfunction cmpQueryJoinEntrySpec(lhs: SpecQueryJoinEntry, rhs: SpecQueryJoinEntry): number {\n const cmp = cmpQuerySpec(lhs.entry, rhs.entry);\n if (cmp !== 0) return cmp;\n if (lhs.qualifications.length !== rhs.qualifications.length) {\n return lhs.qualifications.length - rhs.qualifications.length;\n }\n for (let i = 0; i < lhs.qualifications.length; i++) {\n const lhsQ = canonicalizeJson(lhs.qualifications[i]);\n const rhsQ = canonicalizeJson(rhs.qualifications[i]);\n if (lhsQ !== rhsQ) return lhsQ < rhsQ ? -1 : 1;\n }\n return 0;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
const require_runtime = require(
|
|
2
|
-
const require_spec = require(
|
|
3
|
-
const require_ids = require(
|
|
1
|
+
const require_runtime = require("../../../_virtual/_rolldown/runtime.cjs");
|
|
2
|
+
const require_spec = require("./spec.cjs");
|
|
3
|
+
const require_ids = require("./ids.cjs");
|
|
4
4
|
let canonicalize = require("canonicalize");
|
|
5
5
|
canonicalize = require_runtime.__toESM(canonicalize);
|
|
6
|
-
|
|
7
6
|
//#region src/drivers/pframe/spec/anchored.ts
|
|
8
7
|
function axisKey(axis) {
|
|
9
8
|
return (0, canonicalize.default)(require_spec.getAxisId(axis));
|
|
@@ -247,8 +246,8 @@ function resolveAxisReference(anchors, axisRef) {
|
|
|
247
246
|
function isAnchorAxisRef(value) {
|
|
248
247
|
return typeof value === "object" && "anchor" in value;
|
|
249
248
|
}
|
|
250
|
-
|
|
251
249
|
//#endregion
|
|
252
250
|
exports.AnchoredIdDeriver = AnchoredIdDeriver;
|
|
253
251
|
exports.resolveAnchors = resolveAnchors;
|
|
252
|
+
|
|
254
253
|
//# sourceMappingURL=anchored.cjs.map
|