@sqlrooms/deck 0.29.0-rc.10
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/LICENSE.md +10 -0
- package/README.md +654 -0
- package/dist/BlockMapSettings.d.ts +3 -0
- package/dist/BlockMapSettings.d.ts.map +1 -0
- package/dist/BlockMapSettings.js +57 -0
- package/dist/BlockMapSettings.js.map +1 -0
- package/dist/DashboardMapSettings.d.ts +7 -0
- package/dist/DashboardMapSettings.d.ts.map +1 -0
- package/dist/DashboardMapSettings.js +52 -0
- package/dist/DashboardMapSettings.js.map +1 -0
- package/dist/DeckJsonMap.d.ts +4 -0
- package/dist/DeckJsonMap.d.ts.map +1 -0
- package/dist/DeckJsonMap.js +370 -0
- package/dist/DeckJsonMap.js.map +1 -0
- package/dist/DeckJsonMapSpec.d.ts +7617 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -0
- package/dist/DeckJsonMapSpec.js +82 -0
- package/dist/DeckJsonMapSpec.js.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts +28 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.js +23 -0
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -0
- package/dist/DeckMapSurface.d.ts +39 -0
- package/dist/DeckMapSurface.d.ts.map +1 -0
- package/dist/DeckMapSurface.js +137 -0
- package/dist/DeckMapSurface.js.map +1 -0
- package/dist/DeckMapsSlice.d.ts +99 -0
- package/dist/DeckMapsSlice.d.ts.map +1 -0
- package/dist/DeckMapsSlice.js +89 -0
- package/dist/DeckMapsSlice.js.map +1 -0
- package/dist/MapSettings.d.ts +16 -0
- package/dist/MapSettings.d.ts.map +1 -0
- package/dist/MapSettings.js +292 -0
- package/dist/MapSettings.js.map +1 -0
- package/dist/MapSettingsControls.d.ts +40 -0
- package/dist/MapSettingsControls.d.ts.map +1 -0
- package/dist/MapSettingsControls.js +54 -0
- package/dist/MapSettingsControls.js.map +1 -0
- package/dist/ai.d.ts +261 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +392 -0
- package/dist/ai.js.map +1 -0
- package/dist/block.d.ts +21 -0
- package/dist/block.d.ts.map +1 -0
- package/dist/block.js +105 -0
- package/dist/block.js.map +1 -0
- package/dist/blockDocumentRegistration.d.ts +45 -0
- package/dist/blockDocumentRegistration.d.ts.map +1 -0
- package/dist/blockDocumentRegistration.js +68 -0
- package/dist/blockDocumentRegistration.js.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.js +85 -0
- package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
- package/dist/createOrUpdateDeckMapResource.d.ts +81 -0
- package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -0
- package/dist/createOrUpdateDeckMapResource.js +82 -0
- package/dist/createOrUpdateDeckMapResource.js.map +1 -0
- package/dist/dashboard.d.ts +6 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +337 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/dashboardConfig.d.ts +25 -0
- package/dist/dashboardConfig.d.ts.map +1 -0
- package/dist/dashboardConfig.js +82 -0
- package/dist/dashboardConfig.js.map +1 -0
- package/dist/dashboardIntegration.d.ts +3 -0
- package/dist/dashboardIntegration.d.ts.map +1 -0
- package/dist/dashboardIntegration.js +16 -0
- package/dist/dashboardIntegration.js.map +1 -0
- package/dist/datasetSourceUtils.d.ts +16 -0
- package/dist/datasetSourceUtils.d.ts.map +1 -0
- package/dist/datasetSourceUtils.js +25 -0
- package/dist/datasetSourceUtils.js.map +1 -0
- package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
- package/dist/datasets/PreparedDatasetStore.js +268 -0
- package/dist/datasets/PreparedDatasetStore.js.map +1 -0
- package/dist/datasets/helpers.d.ts +57 -0
- package/dist/datasets/helpers.d.ts.map +1 -0
- package/dist/datasets/helpers.js +155 -0
- package/dist/datasets/helpers.js.map +1 -0
- package/dist/datasets/normalizeDatasets.d.ts +11 -0
- package/dist/datasets/normalizeDatasets.d.ts.map +1 -0
- package/dist/datasets/normalizeDatasets.js +50 -0
- package/dist/datasets/normalizeDatasets.js.map +1 -0
- package/dist/datasets/tableAdapter.d.ts +11 -0
- package/dist/datasets/tableAdapter.d.ts.map +1 -0
- package/dist/datasets/tableAdapter.js +11 -0
- package/dist/datasets/tableAdapter.js.map +1 -0
- package/dist/datasets/tableDatasetSql.d.ts +16 -0
- package/dist/datasets/tableDatasetSql.d.ts.map +1 -0
- package/dist/datasets/tableDatasetSql.js +49 -0
- package/dist/datasets/tableDatasetSql.js.map +1 -0
- package/dist/datasets/types.d.ts +40 -0
- package/dist/datasets/types.d.ts.map +1 -0
- package/dist/datasets/types.js +2 -0
- package/dist/datasets/types.js.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.js +59 -0
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/json/aggregateWaypoints.d.ts +14 -0
- package/dist/json/aggregateWaypoints.d.ts.map +1 -0
- package/dist/json/aggregateWaypoints.js +190 -0
- package/dist/json/aggregateWaypoints.js.map +1 -0
- package/dist/json/colorScaleFunction.d.ts +27 -0
- package/dist/json/colorScaleFunction.d.ts.map +1 -0
- package/dist/json/colorScaleFunction.js +46 -0
- package/dist/json/colorScaleFunction.js.map +1 -0
- package/dist/json/compileColorScale.d.ts +12 -0
- package/dist/json/compileColorScale.d.ts.map +1 -0
- package/dist/json/compileColorScale.js +125 -0
- package/dist/json/compileColorScale.js.map +1 -0
- package/dist/json/compileGeoArrowAccessor.d.ts +18 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -0
- package/dist/json/compileGeoArrowAccessor.js +129 -0
- package/dist/json/compileGeoArrowAccessor.js.map +1 -0
- package/dist/json/createDeckJsonConfiguration.d.ts +9 -0
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -0
- package/dist/json/createDeckJsonConfiguration.js +315 -0
- package/dist/json/createDeckJsonConfiguration.js.map +1 -0
- package/dist/json/defaultClasses.d.ts +12 -0
- package/dist/json/defaultClasses.d.ts.map +1 -0
- package/dist/json/defaultClasses.js +35 -0
- package/dist/json/defaultClasses.js.map +1 -0
- package/dist/json/extractColorScaleLegends.d.ts +8 -0
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -0
- package/dist/json/extractColorScaleLegends.js +86 -0
- package/dist/json/extractColorScaleLegends.js.map +1 -0
- package/dist/json/heatmapDefaults.d.ts +8 -0
- package/dist/json/heatmapDefaults.d.ts.map +1 -0
- package/dist/json/heatmapDefaults.js +14 -0
- package/dist/json/heatmapDefaults.js.map +1 -0
- package/dist/json/layerCompatibility.d.ts +21 -0
- package/dist/json/layerCompatibility.d.ts.map +1 -0
- package/dist/json/layerCompatibility.js +168 -0
- package/dist/json/layerCompatibility.js.map +1 -0
- package/dist/json/layerConfig.d.ts +14 -0
- package/dist/json/layerConfig.d.ts.map +1 -0
- package/dist/json/layerConfig.js +54 -0
- package/dist/json/layerConfig.js.map +1 -0
- package/dist/json/layers/DeckColumnLayer.d.ts +10 -0
- package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckColumnLayer.js +26 -0
- package/dist/json/layers/DeckColumnLayer.js.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.js +118 -0
- package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
- package/dist/json/layers/DeckTripsLayer.d.ts +46 -0
- package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckTripsLayer.js +170 -0
- package/dist/json/layers/DeckTripsLayer.js.map +1 -0
- package/dist/json/layers/createTableToRecordBatchAdapter.d.ts +20 -0
- package/dist/json/layers/createTableToRecordBatchAdapter.d.ts.map +1 -0
- package/dist/json/layers/createTableToRecordBatchAdapter.js +81 -0
- package/dist/json/layers/createTableToRecordBatchAdapter.js.map +1 -0
- package/dist/json/layers/index.d.ts +5 -0
- package/dist/json/layers/index.d.ts.map +1 -0
- package/dist/json/layers/index.js +5 -0
- package/dist/json/layers/index.js.map +1 -0
- package/dist/json/rewriteGeoArrowAccessors.d.ts +7 -0
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -0
- package/dist/json/rewriteGeoArrowAccessors.js +55 -0
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -0
- package/dist/mapAiConfig.d.ts +111 -0
- package/dist/mapAiConfig.d.ts.map +1 -0
- package/dist/mapAiConfig.js +69 -0
- package/dist/mapAiConfig.js.map +1 -0
- package/dist/mapConfig.d.ts +73 -0
- package/dist/mapConfig.d.ts.map +1 -0
- package/dist/mapConfig.js +47 -0
- package/dist/mapConfig.js.map +1 -0
- package/dist/mapConfigUtils.d.ts +111 -0
- package/dist/mapConfigUtils.d.ts.map +1 -0
- package/dist/mapConfigUtils.js +502 -0
- package/dist/mapConfigUtils.js.map +1 -0
- package/dist/mapDataPolicy.d.ts +9 -0
- package/dist/mapDataPolicy.d.ts.map +1 -0
- package/dist/mapDataPolicy.js +25 -0
- package/dist/mapDataPolicy.js.map +1 -0
- package/dist/mapFit.d.ts +62 -0
- package/dist/mapFit.d.ts.map +1 -0
- package/dist/mapFit.js +325 -0
- package/dist/mapFit.js.map +1 -0
- package/dist/mapLayerConfigUtils.d.ts +54 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -0
- package/dist/mapLayerConfigUtils.js +296 -0
- package/dist/mapLayerConfigUtils.js.map +1 -0
- package/dist/mapResourceAuthoring.d.ts +40 -0
- package/dist/mapResourceAuthoring.d.ts.map +1 -0
- package/dist/mapResourceAuthoring.js +266 -0
- package/dist/mapResourceAuthoring.js.map +1 -0
- package/dist/mosaic.d.ts +9 -0
- package/dist/mosaic.d.ts.map +1 -0
- package/dist/mosaic.js +8 -0
- package/dist/mosaic.js.map +1 -0
- package/dist/prepare/detectGeometryColumn.d.ts +19 -0
- package/dist/prepare/detectGeometryColumn.d.ts.map +1 -0
- package/dist/prepare/detectGeometryColumn.js +126 -0
- package/dist/prepare/detectGeometryColumn.js.map +1 -0
- package/dist/prepare/geoarrow.d.ts +18 -0
- package/dist/prepare/geoarrow.d.ts.map +1 -0
- package/dist/prepare/geoarrow.js +114 -0
- package/dist/prepare/geoarrow.js.map +1 -0
- package/dist/prepare/geometryDecoder.d.ts +8 -0
- package/dist/prepare/geometryDecoder.d.ts.map +1 -0
- package/dist/prepare/geometryDecoder.js +2 -0
- package/dist/prepare/geometryDecoder.js.map +1 -0
- package/dist/prepare/prepareDeckDataset.d.ts +57 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -0
- package/dist/prepare/prepareDeckDataset.js +112 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -0
- package/dist/prepare/toGeoJsonBinary.d.ts +9 -0
- package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -0
- package/dist/prepare/toGeoJsonBinary.js +26 -0
- package/dist/prepare/toGeoJsonBinary.js.map +1 -0
- package/dist/prepare/types.d.ts +25 -0
- package/dist/prepare/types.d.ts.map +1 -0
- package/dist/prepare/types.js +2 -0
- package/dist/prepare/types.js.map +1 -0
- package/dist/prepare/wkbDecoder.d.ts +3 -0
- package/dist/prepare/wkbDecoder.d.ts.map +1 -0
- package/dist/prepare/wkbDecoder.js +419 -0
- package/dist/prepare/wkbDecoder.js.map +1 -0
- package/dist/prepare/wkbParser.d.ts +24 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -0
- package/dist/prepare/wkbParser.js +139 -0
- package/dist/prepare/wkbParser.js.map +1 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/useDeckMapDatasetSchema.d.ts +33 -0
- package/dist/useDeckMapDatasetSchema.d.ts.map +1 -0
- package/dist/useDeckMapDatasetSchema.js +138 -0
- package/dist/useDeckMapDatasetSchema.js.map +1 -0
- package/dist/useDeckMapDatasets.d.ts +17 -0
- package/dist/useDeckMapDatasets.d.ts.map +1 -0
- package/dist/useDeckMapDatasets.js +69 -0
- package/dist/useDeckMapDatasets.js.map +1 -0
- package/dist/useDeckMapFitToBounds.d.ts +31 -0
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
- package/dist/useDeckMapFitToBounds.js +58 -0
- package/dist/useDeckMapFitToBounds.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapResourceAuthoring.js","sourceRoot":"","sources":["../src/mapResourceAuthoring.ts"],"names":[],"mappings":"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","sourcesContent":["import {DeckJsonMapSpec} from './DeckJsonMapSpec';\nimport type {DeckMapConfig} from './mapConfig';\nimport {\n isDeckMapSqlDatasetSource,\n isDeckMapTableDatasetSource,\n} from './mapConfig';\n\nexport type DeckMapResourceConfigIssue = {\n path: string;\n message: string;\n};\n\nexport type DeckMapResourceConfigValidationOptions = {\n /** Empty resources are valid while waiting for a user-selected table. */\n allowEmpty?: boolean;\n};\n\n/** Controls how an incoming map config patch is merged with durable state. */\nexport type DeckMapResourceConfigMergeOptions = {\n /** Treat an incoming `spec.layers` array as the complete replacement list. */\n replaceLayers?: boolean;\n /** Treat incoming `datasets` as the complete replacement registry. */\n replaceDatasets?: boolean;\n};\n\n/** Error raised before an invalid map resource can be durably written. */\nexport class DeckMapResourceConfigError extends Error {\n readonly issues: DeckMapResourceConfigIssue[];\n\n constructor(issues: DeckMapResourceConfigIssue[]) {\n super(\n `Invalid Deck map resource config: ${issues\n .map((issue) => `${issue.path}: ${issue.message}`)\n .join('; ')}`,\n );\n this.name = 'DeckMapResourceConfigError';\n this.issues = issues;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction hasEntries(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\nfunction mergeOptionalRecord(\n existing: unknown,\n incoming: unknown,\n): Record<string, unknown> | undefined {\n if (isRecord(existing) && isRecord(incoming)) {\n return {...existing, ...incoming};\n }\n if (isRecord(incoming)) return incoming;\n return isRecord(existing) ? existing : undefined;\n}\n\nfunction mergeLayerPatch(existingLayer: unknown, incomingLayer: unknown) {\n if (!isRecord(existingLayer) || !isRecord(incomingLayer)) {\n return incomingLayer;\n }\n return {\n ...existingLayer,\n ...incomingLayer,\n _sqlroomsBinding: mergeOptionalRecord(\n existingLayer._sqlroomsBinding,\n incomingLayer._sqlroomsBinding,\n ),\n };\n}\n\nfunction mergeLayerPatches(\n existingLayers: unknown[] | undefined,\n incomingLayers: unknown[] | undefined,\n) {\n if (!incomingLayers || incomingLayers.length === 0) return existingLayers;\n if (!existingLayers || existingLayers.length === 0) return incomingLayers;\n\n const nextLayers = [...existingLayers];\n for (const [incomingIndex, incomingLayer] of incomingLayers.entries()) {\n const incomingId = isRecord(incomingLayer)\n ? (incomingLayer.id as string | undefined)\n : undefined;\n const existingIndex = incomingId\n ? existingLayers.findIndex(\n (layer) => isRecord(layer) && layer.id === incomingId,\n )\n : incomingIndex < existingLayers.length\n ? incomingIndex\n : -1;\n if (existingIndex >= 0) {\n nextLayers[existingIndex] = mergeLayerPatch(\n existingLayers[existingIndex],\n incomingLayer,\n );\n } else {\n nextLayers.push(incomingLayer);\n }\n }\n return nextLayers;\n}\n\nfunction mergeSpecPatch(\n existingSpec: unknown,\n incomingSpec: unknown,\n options: DeckMapResourceConfigMergeOptions,\n) {\n if (typeof incomingSpec === 'string') return incomingSpec;\n const existing = isRecord(existingSpec) ? existingSpec : undefined;\n const incoming = isRecord(incomingSpec) ? incomingSpec : undefined;\n if (!existing && !incoming) return incomingSpec ?? existingSpec;\n\n const existingLayers = Array.isArray(existing?.layers)\n ? existing.layers\n : undefined;\n const incomingLayers = Array.isArray(incoming?.layers)\n ? incoming.layers\n : undefined;\n const layers =\n options.replaceLayers && incomingLayers !== undefined\n ? incomingLayers\n : mergeLayerPatches(existingLayers, incomingLayers);\n return {\n ...(existing ?? {}),\n ...(incoming ?? {}),\n ...(layers ? {layers} : {}),\n };\n}\n\nfunction mergeDatasetRegistry(\n existingDatasets: DeckMapConfig['datasets'],\n incomingDatasets: DeckMapConfig['datasets'],\n replaceDatasets: boolean,\n): DeckMapConfig['datasets'] {\n if (replaceDatasets) return incomingDatasets;\n if (!hasEntries(incomingDatasets)) return existingDatasets;\n const datasets = {...existingDatasets};\n for (const [datasetId, incomingDataset] of Object.entries(incomingDatasets)) {\n const existingDataset = existingDatasets[datasetId];\n datasets[datasetId] = existingDataset\n ? {\n ...existingDataset,\n ...incomingDataset,\n source: incomingDataset.source ?? existingDataset.source,\n }\n : incomingDataset;\n }\n return datasets;\n}\n\n/**\n * Merges a sparse map-tool patch with durable state. Empty dataset registries\n * and layer arrays mean \"preserve\" only when an existing resource is present.\n */\nexport function mergeDeckMapResourceConfigPatch(\n existingConfig: DeckMapConfig | undefined,\n incomingConfig: DeckMapConfig,\n options: DeckMapResourceConfigMergeOptions = {},\n): DeckMapConfig {\n if (!existingConfig) return incomingConfig;\n return {\n ...existingConfig,\n ...incomingConfig,\n spec: mergeSpecPatch(existingConfig.spec, incomingConfig.spec, options),\n datasets: mergeDatasetRegistry(\n existingConfig.datasets,\n incomingConfig.datasets,\n options.replaceDatasets === true,\n ),\n mapProps: mergeOptionalRecord(\n existingConfig.mapProps,\n incomingConfig.mapProps,\n ),\n dataPolicy: mergeOptionalRecord(\n existingConfig.dataPolicy,\n incomingConfig.dataPolicy,\n ),\n } as DeckMapConfig;\n}\n\nfunction parseSpec(config: DeckMapConfig): {\n layers: Record<string, unknown>[];\n issues: DeckMapResourceConfigIssue[];\n} {\n let spec: unknown = config.spec;\n if (typeof spec === 'string') {\n try {\n spec = JSON.parse(spec);\n } catch {\n return {\n layers: [],\n issues: [{path: 'spec', message: 'must be valid JSON'}],\n };\n }\n }\n\n const parsed = DeckJsonMapSpec.safeParse(spec);\n if (!parsed.success) {\n return {\n layers: [],\n issues: parsed.error.issues.map((issue) => ({\n path: ['spec', ...issue.path].join('.'),\n message: issue.message,\n })),\n };\n }\n\n return {\n layers: (parsed.data.layers ?? []) as Record<string, unknown>[],\n issues: [],\n };\n}\n\n/**\n * Validates the post-merge invariants of a renderable, resource-native map.\n * Patch inputs may be sparse, but the durable result must have supported\n * dataset sources and dataset-backed layers.\n */\nexport function getDeckMapResourceConfigIssues(\n config: DeckMapConfig,\n options: DeckMapResourceConfigValidationOptions = {},\n): DeckMapResourceConfigIssue[] {\n const issues: DeckMapResourceConfigIssue[] = [];\n const datasetEntries = Object.entries(config.datasets);\n const datasetIds = datasetEntries.map(([datasetId]) => datasetId);\n const datasetIdSet = new Set(datasetIds);\n const parsedSpec = parseSpec(config);\n issues.push(...parsedSpec.issues);\n\n const isEmpty = datasetEntries.length === 0 && parsedSpec.layers.length === 0;\n if (isEmpty) {\n return options.allowEmpty\n ? issues\n : [\n ...issues,\n {\n path: 'datasets',\n message: 'must contain at least one dataset for a map write',\n },\n {\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n },\n ];\n }\n\n if (datasetEntries.length === 0) {\n issues.push({\n path: 'datasets',\n message: 'must contain at least one dataset',\n });\n }\n\n for (const [datasetId, dataset] of datasetEntries) {\n const source = dataset.source;\n const hasSqlSource =\n isDeckMapSqlDatasetSource(source) && source.sqlQuery.trim().length > 0;\n const hasTableSource =\n isDeckMapTableDatasetSource(source) && source.tableName.trim().length > 0;\n if (!hasSqlSource && !hasTableSource) {\n const legacySql = (dataset as unknown as Record<string, unknown>).sql;\n issues.push({\n path: `datasets.${datasetId}.source`,\n message:\n typeof legacySql === 'string'\n ? 'must define source.tableName or source.sqlQuery; top-level sql is not supported'\n : 'must define source.tableName or source.sqlQuery',\n });\n }\n }\n\n if (parsedSpec.layers.length === 0) {\n issues.push({\n path: 'spec.layers',\n message: 'must contain at least one dataset-backed layer',\n });\n }\n\n parsedSpec.layers.forEach((layer, index) => {\n const layerType = layer['@@type'];\n if (typeof layerType !== 'string' || layerType.trim().length === 0) {\n issues.push({\n path: `spec.layers.${index}.@@type`,\n message: 'must name a Deck JSON layer class',\n });\n }\n\n const binding =\n layer._sqlroomsBinding && typeof layer._sqlroomsBinding === 'object'\n ? (layer._sqlroomsBinding as Record<string, unknown>)\n : undefined;\n const boundDataset =\n typeof binding?.dataset === 'string' && binding.dataset.trim()\n ? binding.dataset\n : undefined;\n\n if (boundDataset) {\n if (!datasetIdSet.has(boundDataset)) {\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message: `references unknown dataset \"${boundDataset}\"`,\n });\n }\n return;\n }\n\n issues.push({\n path: `spec.layers.${index}._sqlroomsBinding.dataset`,\n message:\n 'must bind the layer to a config.datasets entry; layer data references and implicit bindings are not durable resource bindings',\n });\n });\n\n const fitDataset = config.fitToData?.dataset;\n if (fitDataset && !datasetIdSet.has(fitDataset)) {\n issues.push({\n path: 'fitToData.dataset',\n message: `references unknown dataset \"${fitDataset}\"`,\n });\n }\n\n return issues;\n}\n\n/** Rejects invalid durable map writes after sparse patches have been merged. */\nexport function assertDeckMapResourceConfig(config: DeckMapConfig): void {\n const issues = getDeckMapResourceConfigIssues(config);\n if (issues.length > 0) throw new DeckMapResourceConfigError(issues);\n}\n\n/**\n * Returns the package-owned authoring contract for hosts with direct worksheet\n * map capability. Host adapters opt into it; they do not maintain prompt copies.\n */\nexport function getDeckMapResourceAiInstructions(): string {\n return `## Direct worksheet Deck map resources\n\nWhen authoring a worksheet map config, use the resource-native Deck JSON contract:\n- A new map must contain at least one config.datasets entry and at least one spec.layers entry.\n- Every dataset must define source.tableName, source.tableName plus source.transformSql, or source.sqlQuery. Never put sql directly on the dataset object.\n- Bind every layer to a dataset with _sqlroomsBinding.dataset. Never use data: \"@@#datasetId\" or an implicit single-dataset binding as a durable resource binding.\n- Use supported Deck JSON layer classes such as GeoArrowScatterplotLayer, GeoArrowHeatmapLayer, GeoArrowPolygonLayer, GeoArrowPathLayer, GeoArrowTripsLayer, GeoArrowArcLayer, GeoArrowColumnLayer, GeoArrowH3HexagonLayer, or GeoJsonLayer.\n- For table-backed datasets, also pass the same table through the tool's top-level tableName field. A selected table does not replace the required dataset source.\n- transformSql must be a single SELECT and must read from __sqlrooms_source. Use source.sqlQuery only for a standalone pinned query.\n- Use configMode \"basic\" for a straightforward single-layer map. Use \"custom\" only for advanced properties the basic settings cannot represent; custom mode does not relax dataset-source or layer-binding requirements.\n- For a point geometry column, prefer GeoArrowScatterplotLayer with dataset.geometryColumn and _sqlroomsBinding.geometryColumn set to the exact geometry column. For longitude/latitude columns, use source.transformSql to produce WKB geometry and bind that output column.\n- For updates, sparse config patches are allowed because they are merged with the existing resource. For creates, never send empty datasets or layers.\n- To remove existing layers or datasets, set replaceLayers and/or replaceDatasets to true and send the complete desired list or registry. Omit them for additive sparse updates.\n- If a map write reports an invalid resource config, repair the reported paths and retry the same direct map operation; do not replace it with a dashboard-backed map.\n\nMinimal table-backed point map shape:\n{\"configMode\":\"basic\",\"datasets\":{\"places\":{\"source\":{\"tableName\":\"places\"},\"geometryColumn\":\"geom\",\"geometryEncodingHint\":\"wkb\"}},\"spec\":{\"layers\":[{\"@@type\":\"GeoArrowScatterplotLayer\",\"id\":\"places\",\"_sqlroomsBinding\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"},\"getRadius\":4,\"radiusUnits\":\"pixels\",\"pickable\":true}]},\"fitToData\":{\"dataset\":\"places\",\"geometryColumn\":\"geom\"}}`;\n}\n"]}
|
package/dist/mosaic.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Opt-in Mosaic dashboard adapter for Deck map panels. */
|
|
2
|
+
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
3
|
+
export type { DeckMapConfigToolParams, DeckMapDashboardConfigToolConfig, DeckMapDashboardToolParams, } from './ai';
|
|
4
|
+
export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
|
|
5
|
+
export { DeckMapDashboardSettings } from './DashboardMapSettings';
|
|
6
|
+
export { DeckMapSettingsPanel } from './MapSettings';
|
|
7
|
+
export { createDeckMapDashboardSliceOptions } from './dashboardIntegration';
|
|
8
|
+
export * from './dashboardConfig';
|
|
9
|
+
//# sourceMappingURL=mosaic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mosaic.d.ts","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AACd,YAAY,EACV,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,GAC3B,MAAM,MAAM,CAAC;AACd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC"}
|
package/dist/mosaic.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Opt-in Mosaic dashboard adapter for Deck map panels. */
|
|
2
|
+
export { DECK_MAP_AI_INSTRUCTIONS, createDashboardAgentToolWithDeckMaps, createDashboardWithDeckMapAiTools, createDeckMapAiTools, createDeckMapDashboardAiTools, createDeckMapDashboardTool, createDeckMapConfigTool, createDeckMapPanelFromNativeConfig, DeckMapDashboardConfigParameter, DeckMapConfigToolParameters, DeckMapDashboardToolParameters, getDashboardWithDeckMapAiInstructions, } from './ai';
|
|
3
|
+
export { deckMapDashboardAddPanelAction, deckMapDashboardPanelRenderer, } from './dashboard';
|
|
4
|
+
export { DeckMapDashboardSettings } from './DashboardMapSettings';
|
|
5
|
+
export { DeckMapSettingsPanel } from './MapSettings';
|
|
6
|
+
export { createDeckMapDashboardSliceOptions } from './dashboardIntegration';
|
|
7
|
+
export * from './dashboardConfig';
|
|
8
|
+
//# sourceMappingURL=mosaic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mosaic.js","sourceRoot":"","sources":["../src/mosaic.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,iCAAiC,EACjC,oBAAoB,EACpB,6BAA6B,EAC7B,0BAA0B,EAC1B,uBAAuB,EACvB,kCAAkC,EAClC,+BAA+B,EAC/B,2BAA2B,EAC3B,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,MAAM,CAAC;AAMd,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAC,wBAAwB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAC,oBAAoB,EAAC,MAAM,eAAe,CAAC;AACnD,OAAO,EAAC,kCAAkC,EAAC,MAAM,wBAAwB,CAAC;AAC1E,cAAc,mBAAmB,CAAC","sourcesContent":["/** Opt-in Mosaic dashboard adapter for Deck map panels. */\nexport {\n DECK_MAP_AI_INSTRUCTIONS,\n createDashboardAgentToolWithDeckMaps,\n createDashboardWithDeckMapAiTools,\n createDeckMapAiTools,\n createDeckMapDashboardAiTools,\n createDeckMapDashboardTool,\n createDeckMapConfigTool,\n createDeckMapPanelFromNativeConfig,\n DeckMapDashboardConfigParameter,\n DeckMapConfigToolParameters,\n DeckMapDashboardToolParameters,\n getDashboardWithDeckMapAiInstructions,\n} from './ai';\nexport type {\n DeckMapConfigToolParams,\n DeckMapDashboardConfigToolConfig,\n DeckMapDashboardToolParams,\n} from './ai';\nexport {\n deckMapDashboardAddPanelAction,\n deckMapDashboardPanelRenderer,\n} from './dashboard';\nexport {DeckMapDashboardSettings} from './DashboardMapSettings';\nexport {DeckMapSettingsPanel} from './MapSettings';\nexport {createDeckMapDashboardSliceOptions} from './dashboardIntegration';\nexport * from './dashboardConfig';\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as arrow from 'apache-arrow';
|
|
2
|
+
import type { GeometryEncodingHint, ResolvedGeometryColumn } from './types';
|
|
3
|
+
type DetectGeometryColumnOptions = {
|
|
4
|
+
table: arrow.Table;
|
|
5
|
+
geometryColumn?: string;
|
|
6
|
+
geometryEncodingHint?: GeometryEncodingHint;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Detects longitude/latitude columns in an Arrow table by matching
|
|
10
|
+
* field names against known patterns (case-insensitive).
|
|
11
|
+
* Returns the original field names if found, or null.
|
|
12
|
+
*/
|
|
13
|
+
export declare function findCoordinateColumns(table: arrow.Table): {
|
|
14
|
+
lonField: string;
|
|
15
|
+
latField: string;
|
|
16
|
+
} | null;
|
|
17
|
+
export declare function detectGeometryColumn(options: DetectGeometryColumnOptions): ResolvedGeometryColumn;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=detectGeometryColumn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectGeometryColumn.d.ts","sourceRoot":"","sources":["../../src/prepare/detectGeometryColumn.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAEvB,MAAM,SAAS,CAAC;AAEjB,KAAK,2BAA2B,GAAG;IACjC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAgBF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,CAAC,KAAK,GACjB;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI,CAU7C;AAgFD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,2BAA2B,GACnC,sBAAsB,CA2CxB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { getGeoMetadata, getGeometryColumnsFromSchema, } from '@loaders.gl/geoarrow';
|
|
2
|
+
import { isDirectGeoArrowEncoding } from './geoarrow';
|
|
3
|
+
const LON_NAMES = new Set([
|
|
4
|
+
'longitude',
|
|
5
|
+
'lon',
|
|
6
|
+
'lng',
|
|
7
|
+
'long',
|
|
8
|
+
'source_lon',
|
|
9
|
+
'target_lon',
|
|
10
|
+
]);
|
|
11
|
+
const LAT_NAMES = new Set(['latitude', 'lat', 'source_lat', 'target_lat']);
|
|
12
|
+
function getFieldNames(table) {
|
|
13
|
+
return table.schema.fields.map((field) => field.name);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detects longitude/latitude columns in an Arrow table by matching
|
|
17
|
+
* field names against known patterns (case-insensitive).
|
|
18
|
+
* Returns the original field names if found, or null.
|
|
19
|
+
*/
|
|
20
|
+
export function findCoordinateColumns(table) {
|
|
21
|
+
const fields = table.schema.fields;
|
|
22
|
+
let lonField;
|
|
23
|
+
let latField;
|
|
24
|
+
for (const field of fields) {
|
|
25
|
+
const lower = field.name.toLowerCase();
|
|
26
|
+
if (!lonField && LON_NAMES.has(lower))
|
|
27
|
+
lonField = field.name;
|
|
28
|
+
if (!latField && LAT_NAMES.has(lower))
|
|
29
|
+
latField = field.name;
|
|
30
|
+
}
|
|
31
|
+
return lonField && latField ? { lonField, latField } : null;
|
|
32
|
+
}
|
|
33
|
+
const KNOWN_GEOM_NAMES = ['geometry', 'geom', 'wkb_geometry', 'the_geom'];
|
|
34
|
+
function getFieldVector(table, fieldName) {
|
|
35
|
+
const vector = table.getChild(fieldName);
|
|
36
|
+
if (vector) {
|
|
37
|
+
return { vector };
|
|
38
|
+
}
|
|
39
|
+
// Fallback: if the requested geometry column doesn't exist, try other common names
|
|
40
|
+
if (KNOWN_GEOM_NAMES.includes(fieldName.toLowerCase())) {
|
|
41
|
+
for (const altName of KNOWN_GEOM_NAMES) {
|
|
42
|
+
if (altName.toLowerCase() === fieldName.toLowerCase())
|
|
43
|
+
continue;
|
|
44
|
+
const altVector = table.getChild(altName);
|
|
45
|
+
if (altVector) {
|
|
46
|
+
return { vector: altVector };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const available = table.schema.fields.map((f) => f.name).join(', ');
|
|
51
|
+
throw new Error(`Geometry column "${fieldName}" was not found in the Arrow table. Available columns: ${available}. ` +
|
|
52
|
+
`If the data has longitude/latitude columns, the dataset source SQL should create the geometry column ` +
|
|
53
|
+
`(e.g. ST_AsWKB(ST_Point(longitude, latitude)) AS "${fieldName}").`);
|
|
54
|
+
}
|
|
55
|
+
function normalizeEncoding(encoding) {
|
|
56
|
+
if (!encoding) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const normalized = encoding.toLowerCase();
|
|
60
|
+
switch (normalized) {
|
|
61
|
+
case 'geoarrow.point':
|
|
62
|
+
case 'geoarrow.multipoint':
|
|
63
|
+
case 'geoarrow.linestring':
|
|
64
|
+
case 'geoarrow.multilinestring':
|
|
65
|
+
case 'geoarrow.polygon':
|
|
66
|
+
case 'geoarrow.multipolygon':
|
|
67
|
+
case 'geoarrow.wkb':
|
|
68
|
+
case 'geoarrow.wkt':
|
|
69
|
+
case 'wkb':
|
|
70
|
+
case 'wkt':
|
|
71
|
+
return normalized;
|
|
72
|
+
default:
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function inferEncodingFromHint(hint) {
|
|
77
|
+
switch (hint) {
|
|
78
|
+
case 'wkb':
|
|
79
|
+
return 'wkb';
|
|
80
|
+
case 'wkt':
|
|
81
|
+
return 'wkt';
|
|
82
|
+
default:
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function inferEncodingFromVector(vector) {
|
|
87
|
+
const typeName = String(vector.type).toLowerCase();
|
|
88
|
+
if (typeName.includes('utf')) {
|
|
89
|
+
return 'wkt';
|
|
90
|
+
}
|
|
91
|
+
if (typeName.includes('binary')) {
|
|
92
|
+
return 'wkb';
|
|
93
|
+
}
|
|
94
|
+
return 'unknown';
|
|
95
|
+
}
|
|
96
|
+
export function detectGeometryColumn(options) {
|
|
97
|
+
const { table, geometryColumn, geometryEncodingHint } = options;
|
|
98
|
+
const fieldNames = getFieldNames(table);
|
|
99
|
+
const fieldMetadata = getGeometryColumnsFromSchema(table.schema);
|
|
100
|
+
const geoMetadata = getGeoMetadata(table.schema);
|
|
101
|
+
const metadataCandidates = new Set([
|
|
102
|
+
...Object.keys(fieldMetadata),
|
|
103
|
+
...Object.keys(geoMetadata?.columns ?? {}),
|
|
104
|
+
]);
|
|
105
|
+
const namedCandidates = fieldNames.filter((fieldName) => /^(geom|geometry)$/i.test(fieldName));
|
|
106
|
+
const explicitGeometryColumn = geometryColumn;
|
|
107
|
+
const detectedGeometryColumn = explicitGeometryColumn ??
|
|
108
|
+
(metadataCandidates.size === 1 ? [...metadataCandidates][0] : undefined) ??
|
|
109
|
+
(namedCandidates.length === 1 ? namedCandidates[0] : undefined);
|
|
110
|
+
if (!detectedGeometryColumn) {
|
|
111
|
+
throw new Error(`Could not detect a geometry column. Available columns: ${fieldNames.join(', ')}`);
|
|
112
|
+
}
|
|
113
|
+
const fieldResult = getFieldVector(table, detectedGeometryColumn);
|
|
114
|
+
const metadataEncoding = normalizeEncoding(fieldMetadata[detectedGeometryColumn]?.encoding) ??
|
|
115
|
+
normalizeEncoding(geoMetadata?.columns?.[detectedGeometryColumn]?.encoding);
|
|
116
|
+
const encoding = inferEncodingFromHint(geometryEncodingHint) ??
|
|
117
|
+
metadataEncoding ??
|
|
118
|
+
inferEncodingFromVector(fieldResult.vector);
|
|
119
|
+
return {
|
|
120
|
+
columnName: detectedGeometryColumn,
|
|
121
|
+
vector: fieldResult.vector,
|
|
122
|
+
encoding,
|
|
123
|
+
nativeGeoArrow: isDirectGeoArrowEncoding(encoding),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=detectGeometryColumn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectGeometryColumn.js","sourceRoot":"","sources":["../../src/prepare/detectGeometryColumn.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n getGeoMetadata,\n getGeometryColumnsFromSchema,\n} from '@loaders.gl/geoarrow';\nimport * as arrow from 'apache-arrow';\nimport {isDirectGeoArrowEncoding} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n ResolvedGeometryColumn,\n ResolvedGeometryEncoding,\n} from './types';\n\ntype DetectGeometryColumnOptions = {\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\nconst LON_NAMES = new Set([\n 'longitude',\n 'lon',\n 'lng',\n 'long',\n 'source_lon',\n 'target_lon',\n]);\nconst LAT_NAMES = new Set(['latitude', 'lat', 'source_lat', 'target_lat']);\n\nfunction getFieldNames(table: arrow.Table) {\n return table.schema.fields.map((field) => field.name);\n}\n\n/**\n * Detects longitude/latitude columns in an Arrow table by matching\n * field names against known patterns (case-insensitive).\n * Returns the original field names if found, or null.\n */\nexport function findCoordinateColumns(\n table: arrow.Table,\n): {lonField: string; latField: string} | null {\n const fields = table.schema.fields;\n let lonField: string | undefined;\n let latField: string | undefined;\n for (const field of fields) {\n const lower = field.name.toLowerCase();\n if (!lonField && LON_NAMES.has(lower)) lonField = field.name;\n if (!latField && LAT_NAMES.has(lower)) latField = field.name;\n }\n return lonField && latField ? {lonField, latField} : null;\n}\n\nconst KNOWN_GEOM_NAMES = ['geometry', 'geom', 'wkb_geometry', 'the_geom'];\n\nfunction getFieldVector(table: arrow.Table, fieldName: string) {\n const vector = table.getChild(fieldName);\n if (vector) {\n return {vector};\n }\n\n // Fallback: if the requested geometry column doesn't exist, try other common names\n if (KNOWN_GEOM_NAMES.includes(fieldName.toLowerCase())) {\n for (const altName of KNOWN_GEOM_NAMES) {\n if (altName.toLowerCase() === fieldName.toLowerCase()) continue;\n const altVector = table.getChild(altName);\n if (altVector) {\n return {vector: altVector};\n }\n }\n }\n\n const available = table.schema.fields.map((f) => f.name).join(', ');\n throw new Error(\n `Geometry column \"${fieldName}\" was not found in the Arrow table. Available columns: ${available}. ` +\n `If the data has longitude/latitude columns, the dataset source SQL should create the geometry column ` +\n `(e.g. ST_AsWKB(ST_Point(longitude, latitude)) AS \"${fieldName}\").`,\n );\n}\n\nfunction normalizeEncoding(\n encoding: string | undefined,\n): ResolvedGeometryEncoding | undefined {\n if (!encoding) {\n return undefined;\n }\n\n const normalized = encoding.toLowerCase() as ResolvedGeometryEncoding;\n switch (normalized) {\n case 'geoarrow.point':\n case 'geoarrow.multipoint':\n case 'geoarrow.linestring':\n case 'geoarrow.multilinestring':\n case 'geoarrow.polygon':\n case 'geoarrow.multipolygon':\n case 'geoarrow.wkb':\n case 'geoarrow.wkt':\n case 'wkb':\n case 'wkt':\n return normalized;\n default:\n return undefined;\n }\n}\n\nfunction inferEncodingFromHint(\n hint: GeometryEncodingHint | undefined,\n): ResolvedGeometryEncoding | undefined {\n switch (hint) {\n case 'wkb':\n return 'wkb';\n case 'wkt':\n return 'wkt';\n default:\n return undefined;\n }\n}\n\nfunction inferEncodingFromVector(\n vector: arrow.Vector,\n): ResolvedGeometryEncoding {\n const typeName = String(vector.type).toLowerCase();\n if (typeName.includes('utf')) {\n return 'wkt';\n }\n if (typeName.includes('binary')) {\n return 'wkb';\n }\n return 'unknown';\n}\n\nexport function detectGeometryColumn(\n options: DetectGeometryColumnOptions,\n): ResolvedGeometryColumn {\n const {table, geometryColumn, geometryEncodingHint} = options;\n const fieldNames = getFieldNames(table);\n const fieldMetadata = getGeometryColumnsFromSchema(table.schema as never);\n const geoMetadata = getGeoMetadata(table.schema as never);\n const metadataCandidates = new Set<string>([\n ...Object.keys(fieldMetadata),\n ...Object.keys(geoMetadata?.columns ?? {}),\n ]);\n\n const namedCandidates = fieldNames.filter((fieldName) =>\n /^(geom|geometry)$/i.test(fieldName),\n );\n\n const explicitGeometryColumn = geometryColumn;\n const detectedGeometryColumn =\n explicitGeometryColumn ??\n (metadataCandidates.size === 1 ? [...metadataCandidates][0] : undefined) ??\n (namedCandidates.length === 1 ? namedCandidates[0] : undefined);\n\n if (!detectedGeometryColumn) {\n throw new Error(\n `Could not detect a geometry column. Available columns: ${fieldNames.join(', ')}`,\n );\n }\n\n const fieldResult = getFieldVector(table, detectedGeometryColumn);\n\n const metadataEncoding =\n normalizeEncoding(fieldMetadata[detectedGeometryColumn]?.encoding) ??\n normalizeEncoding(geoMetadata?.columns?.[detectedGeometryColumn]?.encoding);\n\n const encoding =\n inferEncodingFromHint(geometryEncodingHint) ??\n metadataEncoding ??\n inferEncodingFromVector(fieldResult.vector);\n\n return {\n columnName: detectedGeometryColumn,\n vector: fieldResult.vector,\n encoding,\n nativeGeoArrow: isDirectGeoArrowEncoding(encoding),\n };\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type * as arrow from 'apache-arrow';
|
|
2
|
+
import type { ResolvedGeometryColumn, ResolvedGeometryEncoding } from './types';
|
|
3
|
+
export declare function isDirectGeoArrowEncoding(encoding: ResolvedGeometryEncoding): boolean;
|
|
4
|
+
export declare function convertGeoArrowCellToGeometry(value: unknown, encoding: ResolvedGeometryEncoding): {
|
|
5
|
+
type: string;
|
|
6
|
+
coordinates: number[];
|
|
7
|
+
} | {
|
|
8
|
+
type: string;
|
|
9
|
+
coordinates: number[][];
|
|
10
|
+
} | {
|
|
11
|
+
type: string;
|
|
12
|
+
coordinates: number[][][];
|
|
13
|
+
} | {
|
|
14
|
+
type: string;
|
|
15
|
+
coordinates: number[][][][];
|
|
16
|
+
} | null;
|
|
17
|
+
export declare function buildNativeGeoArrowBinaryData(table: arrow.Table, geometry: ResolvedGeometryColumn): unknown;
|
|
18
|
+
//# sourceMappingURL=geoarrow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoarrow.d.ts","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAC,sBAAsB,EAAE,wBAAwB,EAAC,MAAM,SAAS,CAAC;AAuF9E,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,wBAAwB,GACjC,OAAO,CAST;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,wBAAwB;;;;;;;;;;;;SAsBnC;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAUT"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { buildBinaryGeoJsonData } from './toGeoJsonBinary';
|
|
2
|
+
function itemLength(value) {
|
|
3
|
+
if (Array.isArray(value)) {
|
|
4
|
+
return value.length;
|
|
5
|
+
}
|
|
6
|
+
if (value && typeof value === 'object' && 'length' in value) {
|
|
7
|
+
return Number(value.length);
|
|
8
|
+
}
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
function itemAt(value, index) {
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return value[index];
|
|
14
|
+
}
|
|
15
|
+
if (value && typeof value === 'object' && 'get' in value) {
|
|
16
|
+
return value.get(index);
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function toCoordinates(value) {
|
|
21
|
+
return Array.from(value, (coordinate) => Number(coordinate));
|
|
22
|
+
}
|
|
23
|
+
function pointToGeometry(value) {
|
|
24
|
+
return { type: 'Point', coordinates: toCoordinates(value) };
|
|
25
|
+
}
|
|
26
|
+
function multiPointToGeometry(value) {
|
|
27
|
+
const coordinates = [];
|
|
28
|
+
for (let index = 0; index < itemLength(value); index++) {
|
|
29
|
+
const point = itemAt(value, index);
|
|
30
|
+
if (point) {
|
|
31
|
+
coordinates.push(toCoordinates(point));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { type: 'MultiPoint', coordinates };
|
|
35
|
+
}
|
|
36
|
+
function lineStringToGeometry(value) {
|
|
37
|
+
const coordinates = [];
|
|
38
|
+
for (let index = 0; index < itemLength(value); index++) {
|
|
39
|
+
const point = itemAt(value, index);
|
|
40
|
+
if (point) {
|
|
41
|
+
coordinates.push(toCoordinates(point));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { type: 'LineString', coordinates };
|
|
45
|
+
}
|
|
46
|
+
function multiLineStringToGeometry(value) {
|
|
47
|
+
const coordinates = [];
|
|
48
|
+
for (let index = 0; index < itemLength(value); index++) {
|
|
49
|
+
const lineString = itemAt(value, index);
|
|
50
|
+
if (lineString) {
|
|
51
|
+
coordinates.push(lineStringToGeometry(lineString).coordinates);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { type: 'MultiLineString', coordinates };
|
|
55
|
+
}
|
|
56
|
+
function polygonToGeometry(value) {
|
|
57
|
+
const coordinates = [];
|
|
58
|
+
for (let ringIndex = 0; ringIndex < itemLength(value); ringIndex++) {
|
|
59
|
+
const ring = itemAt(value, ringIndex);
|
|
60
|
+
if (ring) {
|
|
61
|
+
coordinates.push(lineStringToGeometry(ring).coordinates);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { type: 'Polygon', coordinates };
|
|
65
|
+
}
|
|
66
|
+
function multiPolygonToGeometry(value) {
|
|
67
|
+
const coordinates = [];
|
|
68
|
+
for (let polygonIndex = 0; polygonIndex < itemLength(value); polygonIndex++) {
|
|
69
|
+
const polygon = itemAt(value, polygonIndex);
|
|
70
|
+
if (polygon) {
|
|
71
|
+
coordinates.push(polygonToGeometry(polygon).coordinates);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { type: 'MultiPolygon', coordinates };
|
|
75
|
+
}
|
|
76
|
+
export function isDirectGeoArrowEncoding(encoding) {
|
|
77
|
+
return [
|
|
78
|
+
'geoarrow.point',
|
|
79
|
+
'geoarrow.multipoint',
|
|
80
|
+
'geoarrow.linestring',
|
|
81
|
+
'geoarrow.multilinestring',
|
|
82
|
+
'geoarrow.polygon',
|
|
83
|
+
'geoarrow.multipolygon',
|
|
84
|
+
].includes(encoding);
|
|
85
|
+
}
|
|
86
|
+
export function convertGeoArrowCellToGeometry(value, encoding) {
|
|
87
|
+
if (value == null) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
switch (encoding) {
|
|
91
|
+
case 'geoarrow.point':
|
|
92
|
+
return pointToGeometry(value);
|
|
93
|
+
case 'geoarrow.multipoint':
|
|
94
|
+
return multiPointToGeometry(value);
|
|
95
|
+
case 'geoarrow.linestring':
|
|
96
|
+
return lineStringToGeometry(value);
|
|
97
|
+
case 'geoarrow.multilinestring':
|
|
98
|
+
return multiLineStringToGeometry(value);
|
|
99
|
+
case 'geoarrow.polygon':
|
|
100
|
+
return polygonToGeometry(value);
|
|
101
|
+
case 'geoarrow.multipolygon':
|
|
102
|
+
return multiPolygonToGeometry(value);
|
|
103
|
+
default:
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function buildNativeGeoArrowBinaryData(table, geometry) {
|
|
108
|
+
return buildBinaryGeoJsonData({
|
|
109
|
+
table,
|
|
110
|
+
geometryColumnName: geometry.columnName,
|
|
111
|
+
getGeometryAt: (rowIndex) => convertGeoArrowCellToGeometry(geometry.vector.get(rowIndex), geometry.encoding),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=geoarrow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geoarrow.js","sourceRoot":"","sources":["../../src/prepare/geoarrow.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {buildBinaryGeoJsonData} from './toGeoJsonBinary';\nimport type {ResolvedGeometryColumn, ResolvedGeometryEncoding} from './types';\n\nfunction itemLength(value: unknown) {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (value && typeof value === 'object' && 'length' in value) {\n return Number((value as {length: number}).length);\n }\n return 0;\n}\n\nfunction itemAt(value: unknown, index: number): unknown {\n if (Array.isArray(value)) {\n return value[index];\n }\n if (value && typeof value === 'object' && 'get' in value) {\n return (value as {get: (index: number) => unknown}).get(index);\n }\n return undefined;\n}\n\nfunction toCoordinates(value: unknown): number[] {\n return Array.from(value as Iterable<number>, (coordinate) =>\n Number(coordinate),\n );\n}\n\nfunction pointToGeometry(value: unknown) {\n return {type: 'Point', coordinates: toCoordinates(value)};\n}\n\nfunction multiPointToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'MultiPoint', coordinates};\n}\n\nfunction lineStringToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const point = itemAt(value, index);\n if (point) {\n coordinates.push(toCoordinates(point));\n }\n }\n return {type: 'LineString', coordinates};\n}\n\nfunction multiLineStringToGeometry(value: unknown) {\n const coordinates = [];\n for (let index = 0; index < itemLength(value); index++) {\n const lineString = itemAt(value, index);\n if (lineString) {\n coordinates.push(lineStringToGeometry(lineString).coordinates);\n }\n }\n return {type: 'MultiLineString', coordinates};\n}\n\nfunction polygonToGeometry(value: unknown) {\n const coordinates = [];\n for (let ringIndex = 0; ringIndex < itemLength(value); ringIndex++) {\n const ring = itemAt(value, ringIndex);\n if (ring) {\n coordinates.push(lineStringToGeometry(ring).coordinates);\n }\n }\n return {type: 'Polygon', coordinates};\n}\n\nfunction multiPolygonToGeometry(value: unknown) {\n const coordinates = [];\n for (let polygonIndex = 0; polygonIndex < itemLength(value); polygonIndex++) {\n const polygon = itemAt(value, polygonIndex);\n if (polygon) {\n coordinates.push(polygonToGeometry(polygon).coordinates);\n }\n }\n return {type: 'MultiPolygon', coordinates};\n}\n\nexport function isDirectGeoArrowEncoding(\n encoding: ResolvedGeometryEncoding,\n): boolean {\n return [\n 'geoarrow.point',\n 'geoarrow.multipoint',\n 'geoarrow.linestring',\n 'geoarrow.multilinestring',\n 'geoarrow.polygon',\n 'geoarrow.multipolygon',\n ].includes(encoding);\n}\n\nexport function convertGeoArrowCellToGeometry(\n value: unknown,\n encoding: ResolvedGeometryEncoding,\n) {\n if (value == null) {\n return null;\n }\n\n switch (encoding) {\n case 'geoarrow.point':\n return pointToGeometry(value);\n case 'geoarrow.multipoint':\n return multiPointToGeometry(value);\n case 'geoarrow.linestring':\n return lineStringToGeometry(value);\n case 'geoarrow.multilinestring':\n return multiLineStringToGeometry(value);\n case 'geoarrow.polygon':\n return polygonToGeometry(value);\n case 'geoarrow.multipolygon':\n return multiPolygonToGeometry(value);\n default:\n return null;\n }\n}\n\nexport function buildNativeGeoArrowBinaryData(\n table: arrow.Table,\n geometry: ResolvedGeometryColumn,\n): unknown {\n return buildBinaryGeoJsonData({\n table,\n geometryColumnName: geometry.columnName,\n getGeometryAt: (rowIndex) =>\n convertGeoArrowCellToGeometry(\n geometry.vector.get(rowIndex),\n geometry.encoding,\n ),\n });\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as arrow from 'apache-arrow';
|
|
2
|
+
import type { PreparedGeoArrowLayerData, ResolvedGeometryEncoding } from './types';
|
|
3
|
+
export type GeometryDecoder = {
|
|
4
|
+
supportsGeoArrowPromotion: (layerType: string, encoding: ResolvedGeometryEncoding, table: arrow.Table, columnName: string) => boolean;
|
|
5
|
+
toGeoArrowLike: (table: arrow.Table, columnName: string, encoding: ResolvedGeometryEncoding) => PreparedGeoArrowLayerData;
|
|
6
|
+
toGeoJsonBinary: (table: arrow.Table, columnName: string, encoding: ResolvedGeometryEncoding) => unknown;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=geometryDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometryDecoder.d.ts","sourceRoot":"","sources":["../../src/prepare/geometryDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EACV,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GAAG;IAC5B,yBAAyB,EAAE,CACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,wBAAwB,EAClC,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC;IACb,cAAc,EAAE,CACd,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,KAC/B,yBAAyB,CAAC;IAC/B,eAAe,EAAE,CACf,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,wBAAwB,KAC/B,OAAO,CAAC;CACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometryDecoder.js","sourceRoot":"","sources":["../../src/prepare/geometryDecoder.ts"],"names":[],"mappings":"","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport type {\n PreparedGeoArrowLayerData,\n ResolvedGeometryEncoding,\n} from './types';\n\nexport type GeometryDecoder = {\n supportsGeoArrowPromotion: (\n layerType: string,\n encoding: ResolvedGeometryEncoding,\n table: arrow.Table,\n columnName: string,\n ) => boolean;\n toGeoArrowLike: (\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) => PreparedGeoArrowLayerData;\n toGeoJsonBinary: (\n table: arrow.Table,\n columnName: string,\n encoding: ResolvedGeometryEncoding,\n ) => unknown;\n};\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type * as arrow from 'apache-arrow';
|
|
2
|
+
import type { GeometryEncodingHint, PreparedDeckDataset } from './types';
|
|
3
|
+
type PrepareDeckDatasetOptions = {
|
|
4
|
+
datasetId: string;
|
|
5
|
+
table: arrow.Table;
|
|
6
|
+
geometryColumn?: string;
|
|
7
|
+
geometryEncodingHint?: GeometryEncodingHint;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Build the reusable deck-facing geometry helpers for one resolved Arrow table.
|
|
11
|
+
*
|
|
12
|
+
* This is the expensive preparation step that `preparedDatasetStore` caches.
|
|
13
|
+
* It accepts one resolved Arrow table plus a geometry column/hint and turns
|
|
14
|
+
* the source geometry into canonical deck-facing outputs that can be reused by
|
|
15
|
+
* multiple layers and multiple `DeckJsonMap` instances.
|
|
16
|
+
*
|
|
17
|
+
* Supported input geometry forms:
|
|
18
|
+
*
|
|
19
|
+
* - native GeoArrow columns
|
|
20
|
+
* Already columnar and geometry-aware. These are the cheapest inputs:
|
|
21
|
+
* preparation mainly does geometry-column detection plus lightweight wrapper
|
|
22
|
+
* shaping so GeoArrow-capable deck layers can consume the Arrow table/vector
|
|
23
|
+
* directly.
|
|
24
|
+
* - WKB / GeoArrow WKB columns
|
|
25
|
+
* Binary geometry needs decoding because deck layers cannot render raw WKB
|
|
26
|
+
* bytes. Preparation promotes the binary values into deck-ready geometry
|
|
27
|
+
* structures for GeoArrow layers and GeoJSON-binary fallback layers.
|
|
28
|
+
* - WKT / GeoArrow WKT columns
|
|
29
|
+
* Text geometry likewise needs parsing before deck can render it. This has a
|
|
30
|
+
* similar cost profile to WKB, but starts from text parsing rather than
|
|
31
|
+
* binary decoding.
|
|
32
|
+
*
|
|
33
|
+
* These transformations are necessary because the input table shape is chosen
|
|
34
|
+
* by the query/data source, while deck expects render-oriented geometry
|
|
35
|
+
* payloads. The canonical outputs produced here are:
|
|
36
|
+
*
|
|
37
|
+
* - GeoArrow layer data
|
|
38
|
+
* A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,
|
|
39
|
+
* either forwarded directly from native GeoArrow inputs or promoted from
|
|
40
|
+
* WKB/WKT into a GeoArrow-like representation.
|
|
41
|
+
* - GeoJSON-binary data
|
|
42
|
+
* A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do
|
|
43
|
+
* not consume GeoArrow inputs directly.
|
|
44
|
+
*
|
|
45
|
+
* The returned object also memoizes:
|
|
46
|
+
*
|
|
47
|
+
* - geometry column detection
|
|
48
|
+
* - GeoArrow layer payloads
|
|
49
|
+
* - GeoJSON-binary fallbacks
|
|
50
|
+
*
|
|
51
|
+
* Caching at this level lets deck reuse geometry decoding and shaping work
|
|
52
|
+
* even when the upstream query result is already cached by another system such
|
|
53
|
+
* as Mosaic's query manager.
|
|
54
|
+
*/
|
|
55
|
+
export declare function prepareDeckDataset(options: PrepareDeckDatasetOptions): PreparedDeckDataset;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=prepareDeckDataset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.d.ts","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAM3C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,SAAS,CAAC;AAGjB,KAAK,yBAAyB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,mBAAmB,CA4ErB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { detectGeometryColumn } from './detectGeometryColumn';
|
|
2
|
+
import { buildNativeGeoArrowBinaryData, isDirectGeoArrowEncoding, } from './geoarrow';
|
|
3
|
+
import { wkbGeometryDecoder } from './wkbDecoder';
|
|
4
|
+
/**
|
|
5
|
+
* Build the reusable deck-facing geometry helpers for one resolved Arrow table.
|
|
6
|
+
*
|
|
7
|
+
* This is the expensive preparation step that `preparedDatasetStore` caches.
|
|
8
|
+
* It accepts one resolved Arrow table plus a geometry column/hint and turns
|
|
9
|
+
* the source geometry into canonical deck-facing outputs that can be reused by
|
|
10
|
+
* multiple layers and multiple `DeckJsonMap` instances.
|
|
11
|
+
*
|
|
12
|
+
* Supported input geometry forms:
|
|
13
|
+
*
|
|
14
|
+
* - native GeoArrow columns
|
|
15
|
+
* Already columnar and geometry-aware. These are the cheapest inputs:
|
|
16
|
+
* preparation mainly does geometry-column detection plus lightweight wrapper
|
|
17
|
+
* shaping so GeoArrow-capable deck layers can consume the Arrow table/vector
|
|
18
|
+
* directly.
|
|
19
|
+
* - WKB / GeoArrow WKB columns
|
|
20
|
+
* Binary geometry needs decoding because deck layers cannot render raw WKB
|
|
21
|
+
* bytes. Preparation promotes the binary values into deck-ready geometry
|
|
22
|
+
* structures for GeoArrow layers and GeoJSON-binary fallback layers.
|
|
23
|
+
* - WKT / GeoArrow WKT columns
|
|
24
|
+
* Text geometry likewise needs parsing before deck can render it. This has a
|
|
25
|
+
* similar cost profile to WKB, but starts from text parsing rather than
|
|
26
|
+
* binary decoding.
|
|
27
|
+
*
|
|
28
|
+
* These transformations are necessary because the input table shape is chosen
|
|
29
|
+
* by the query/data source, while deck expects render-oriented geometry
|
|
30
|
+
* payloads. The canonical outputs produced here are:
|
|
31
|
+
*
|
|
32
|
+
* - GeoArrow layer data
|
|
33
|
+
* A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,
|
|
34
|
+
* either forwarded directly from native GeoArrow inputs or promoted from
|
|
35
|
+
* WKB/WKT into a GeoArrow-like representation.
|
|
36
|
+
* - GeoJSON-binary data
|
|
37
|
+
* A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do
|
|
38
|
+
* not consume GeoArrow inputs directly.
|
|
39
|
+
*
|
|
40
|
+
* The returned object also memoizes:
|
|
41
|
+
*
|
|
42
|
+
* - geometry column detection
|
|
43
|
+
* - GeoArrow layer payloads
|
|
44
|
+
* - GeoJSON-binary fallbacks
|
|
45
|
+
*
|
|
46
|
+
* Caching at this level lets deck reuse geometry decoding and shaping work
|
|
47
|
+
* even when the upstream query result is already cached by another system such
|
|
48
|
+
* as Mosaic's query manager.
|
|
49
|
+
*/
|
|
50
|
+
export function prepareDeckDataset(options) {
|
|
51
|
+
const { datasetId, table, geometryColumn, geometryEncodingHint } = options;
|
|
52
|
+
const resolvedGeometryCache = new Map();
|
|
53
|
+
const geoArrowCache = new Map();
|
|
54
|
+
const geoJsonBinaryCache = new Map();
|
|
55
|
+
const resolveGeometry = (geometryColumnOverride) => {
|
|
56
|
+
const cacheKey = geometryColumnOverride ?? '__default__';
|
|
57
|
+
const cached = resolvedGeometryCache.get(cacheKey);
|
|
58
|
+
if (cached) {
|
|
59
|
+
return cached;
|
|
60
|
+
}
|
|
61
|
+
const resolved = detectGeometryColumn({
|
|
62
|
+
table,
|
|
63
|
+
geometryColumn: geometryColumnOverride ?? geometryColumn,
|
|
64
|
+
geometryEncodingHint,
|
|
65
|
+
});
|
|
66
|
+
resolvedGeometryCache.set(cacheKey, resolved);
|
|
67
|
+
return resolved;
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
datasetId,
|
|
71
|
+
table,
|
|
72
|
+
datasetGeometryColumn: geometryColumn,
|
|
73
|
+
resolveGeometry,
|
|
74
|
+
getGeoArrowLayerData(geometryColumnOverride) {
|
|
75
|
+
const cacheKey = geometryColumnOverride ?? '__default__';
|
|
76
|
+
const cached = geoArrowCache.get(cacheKey);
|
|
77
|
+
if (cached) {
|
|
78
|
+
return cached;
|
|
79
|
+
}
|
|
80
|
+
const resolved = resolveGeometry(geometryColumnOverride);
|
|
81
|
+
let prepared;
|
|
82
|
+
if (isDirectGeoArrowEncoding(resolved.encoding)) {
|
|
83
|
+
prepared = {
|
|
84
|
+
table,
|
|
85
|
+
geometryColumnName: resolved.columnName,
|
|
86
|
+
geometryColumn: resolved.vector,
|
|
87
|
+
encoding: resolved.encoding,
|
|
88
|
+
source: 'native',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
prepared = wkbGeometryDecoder.toGeoArrowLike(table, resolved.columnName, resolved.encoding);
|
|
93
|
+
}
|
|
94
|
+
geoArrowCache.set(cacheKey, prepared);
|
|
95
|
+
return prepared;
|
|
96
|
+
},
|
|
97
|
+
getGeoJsonBinaryData(geometryColumnOverride) {
|
|
98
|
+
const cacheKey = geometryColumnOverride ?? '__default__';
|
|
99
|
+
const cached = geoJsonBinaryCache.get(cacheKey);
|
|
100
|
+
if (cached) {
|
|
101
|
+
return cached;
|
|
102
|
+
}
|
|
103
|
+
const resolved = resolveGeometry(geometryColumnOverride);
|
|
104
|
+
const binaryData = resolved.nativeGeoArrow
|
|
105
|
+
? buildNativeGeoArrowBinaryData(table, resolved)
|
|
106
|
+
: wkbGeometryDecoder.toGeoJsonBinary(table, resolved.columnName, resolved.encoding);
|
|
107
|
+
geoJsonBinaryCache.set(cacheKey, binaryData);
|
|
108
|
+
return binaryData;
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=prepareDeckDataset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepareDeckDataset.js","sourceRoot":"","sources":["../../src/prepare/prepareDeckDataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {detectGeometryColumn} from './detectGeometryColumn';\nimport {\n buildNativeGeoArrowBinaryData,\n isDirectGeoArrowEncoding,\n} from './geoarrow';\nimport type {\n GeometryEncodingHint,\n PreparedDeckDataset,\n PreparedGeoArrowLayerData,\n ResolvedGeometryColumn,\n} from './types';\nimport {wkbGeometryDecoder} from './wkbDecoder';\n\ntype PrepareDeckDatasetOptions = {\n datasetId: string;\n table: arrow.Table;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n};\n\n/**\n * Build the reusable deck-facing geometry helpers for one resolved Arrow table.\n *\n * This is the expensive preparation step that `preparedDatasetStore` caches.\n * It accepts one resolved Arrow table plus a geometry column/hint and turns\n * the source geometry into canonical deck-facing outputs that can be reused by\n * multiple layers and multiple `DeckJsonMap` instances.\n *\n * Supported input geometry forms:\n *\n * - native GeoArrow columns\n * Already columnar and geometry-aware. These are the cheapest inputs:\n * preparation mainly does geometry-column detection plus lightweight wrapper\n * shaping so GeoArrow-capable deck layers can consume the Arrow table/vector\n * directly.\n * - WKB / GeoArrow WKB columns\n * Binary geometry needs decoding because deck layers cannot render raw WKB\n * bytes. Preparation promotes the binary values into deck-ready geometry\n * structures for GeoArrow layers and GeoJSON-binary fallback layers.\n * - WKT / GeoArrow WKT columns\n * Text geometry likewise needs parsing before deck can render it. This has a\n * similar cost profile to WKB, but starts from text parsing rather than\n * binary decoding.\n *\n * These transformations are necessary because the input table shape is chosen\n * by the query/data source, while deck expects render-oriented geometry\n * payloads. The canonical outputs produced here are:\n *\n * - GeoArrow layer data\n * A `PreparedGeoArrowLayerData` payload for GeoArrow-native deck layers,\n * either forwarded directly from native GeoArrow inputs or promoted from\n * WKB/WKT into a GeoArrow-like representation.\n * - GeoJSON-binary data\n * A binary GeoJSON-style payload for layers such as `GeoJsonLayer` that do\n * not consume GeoArrow inputs directly.\n *\n * The returned object also memoizes:\n *\n * - geometry column detection\n * - GeoArrow layer payloads\n * - GeoJSON-binary fallbacks\n *\n * Caching at this level lets deck reuse geometry decoding and shaping work\n * even when the upstream query result is already cached by another system such\n * as Mosaic's query manager.\n */\nexport function prepareDeckDataset(\n options: PrepareDeckDatasetOptions,\n): PreparedDeckDataset {\n const {datasetId, table, geometryColumn, geometryEncodingHint} = options;\n const resolvedGeometryCache = new Map<string, ResolvedGeometryColumn>();\n const geoArrowCache = new Map<string, PreparedGeoArrowLayerData>();\n const geoJsonBinaryCache = new Map<string, unknown>();\n\n const resolveGeometry = (geometryColumnOverride?: string) => {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = resolvedGeometryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = detectGeometryColumn({\n table,\n geometryColumn: geometryColumnOverride ?? geometryColumn,\n geometryEncodingHint,\n });\n resolvedGeometryCache.set(cacheKey, resolved);\n return resolved;\n };\n\n return {\n datasetId,\n table,\n datasetGeometryColumn: geometryColumn,\n resolveGeometry,\n getGeoArrowLayerData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoArrowCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n let prepared: PreparedGeoArrowLayerData;\n\n if (isDirectGeoArrowEncoding(resolved.encoding)) {\n prepared = {\n table,\n geometryColumnName: resolved.columnName,\n geometryColumn: resolved.vector,\n encoding: resolved.encoding,\n source: 'native',\n };\n } else {\n prepared = wkbGeometryDecoder.toGeoArrowLike(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n }\n\n geoArrowCache.set(cacheKey, prepared);\n return prepared;\n },\n getGeoJsonBinaryData(geometryColumnOverride?: string) {\n const cacheKey = geometryColumnOverride ?? '__default__';\n const cached = geoJsonBinaryCache.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const resolved = resolveGeometry(geometryColumnOverride);\n const binaryData = resolved.nativeGeoArrow\n ? buildNativeGeoArrowBinaryData(table, resolved)\n : wkbGeometryDecoder.toGeoJsonBinary(\n table,\n resolved.columnName,\n resolved.encoding,\n );\n\n geoJsonBinaryCache.set(cacheKey, binaryData);\n return binaryData;\n },\n };\n}\n"]}
|