@nshiab/simple-data-analysis-core 2.0.8 → 2.1.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/esm/class/SDAError.d.ts +6 -6
- package/esm/class/SDAError.js +6 -6
- package/esm/class/Simple.d.ts +9 -9
- package/esm/class/Simple.js +9 -9
- package/esm/class/SimpleDB.d.ts +80 -76
- package/esm/class/SimpleDB.d.ts.map +1 -1
- package/esm/class/SimpleDB.js +80 -76
- package/esm/class/SimpleTable.d.ts +2805 -1077
- package/esm/class/SimpleTable.d.ts.map +1 -1
- package/esm/class/SimpleTable.js +2777 -1077
- package/esm/helpers/appendColumnBatches.d.ts +3 -0
- package/esm/helpers/appendColumnBatches.d.ts.map +1 -0
- package/esm/helpers/appendColumnBatches.js +21 -0
- package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
- package/esm/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
- package/esm/helpers/buildApproximateMutualReachabilityMst.js +212 -0
- package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
- package/esm/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
- package/esm/helpers/buildChronologicalGraphComponentsSql.js +167 -0
- package/esm/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
- package/esm/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
- package/esm/helpers/buildExactMutualReachabilityMst.js +97 -0
- package/esm/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
- package/esm/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
- package/esm/helpers/buildGraphTemporalCostStateSql.js +86 -0
- package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
- package/esm/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
- package/esm/helpers/buildGraphTemporalReachabilitySql.js +70 -0
- package/esm/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
- package/esm/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
- package/esm/helpers/buildSparseMutualReachabilityMst.js +47 -0
- package/esm/helpers/buildUmapGraph.d.ts +21 -0
- package/esm/helpers/buildUmapGraph.d.ts.map +1 -0
- package/esm/helpers/buildUmapGraph.js +61 -0
- package/esm/helpers/buildVectorNeighbors.d.ts +45 -0
- package/esm/helpers/buildVectorNeighbors.d.ts.map +1 -0
- package/esm/helpers/buildVectorNeighbors.js +170 -0
- package/esm/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
- package/esm/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
- package/esm/helpers/buildWeakGraphComponentsSql.js +32 -0
- package/esm/helpers/cacheDatabase.d.ts.map +1 -1
- package/esm/helpers/cacheDatabase.js +2 -1
- package/esm/helpers/camelCase.d.ts +7 -5
- package/esm/helpers/camelCase.d.ts.map +1 -1
- package/esm/helpers/camelCase.js +7 -5
- package/esm/helpers/capitalize.d.ts +6 -4
- package/esm/helpers/capitalize.d.ts.map +1 -1
- package/esm/helpers/capitalize.js +6 -4
- package/esm/helpers/clusterHdbscan.d.ts +18 -0
- package/esm/helpers/clusterHdbscan.d.ts.map +1 -0
- package/esm/helpers/clusterHdbscan.js +342 -0
- package/esm/helpers/computeCovariance.d.ts +16 -0
- package/esm/helpers/computeCovariance.d.ts.map +1 -0
- package/esm/helpers/computeCovariance.js +99 -0
- package/esm/helpers/computeMahalanobisDistances.d.ts +14 -0
- package/esm/helpers/computeMahalanobisDistances.d.ts.map +1 -0
- package/esm/helpers/computeMahalanobisDistances.js +87 -0
- package/esm/helpers/createDirectory.d.ts +4 -3
- package/esm/helpers/createDirectory.d.ts.map +1 -1
- package/esm/helpers/createDirectory.js +4 -3
- package/esm/helpers/dataToArrays.d.ts +6 -4
- package/esm/helpers/dataToArrays.d.ts.map +1 -1
- package/esm/helpers/dataToArrays.js +6 -4
- package/esm/helpers/extractTypes.d.ts +1 -1
- package/esm/helpers/extractTypes.js +4 -9
- package/esm/helpers/factorCovariance.d.ts +17 -0
- package/esm/helpers/factorCovariance.d.ts.map +1 -0
- package/esm/helpers/factorCovariance.js +189 -0
- package/esm/helpers/findGeoColumn.d.ts +6 -4
- package/esm/helpers/findGeoColumn.d.ts.map +1 -1
- package/esm/helpers/findGeoColumn.js +6 -4
- package/esm/helpers/findGeoColumnFromSchema.d.ts +8 -5
- package/esm/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
- package/esm/helpers/findGeoColumnFromSchema.js +8 -5
- package/esm/helpers/fitUmapCurve.d.ts +2 -0
- package/esm/helpers/fitUmapCurve.d.ts.map +1 -0
- package/esm/helpers/fitUmapCurve.js +66 -0
- package/esm/helpers/formatDate.d.ts +12 -6
- package/esm/helpers/formatDate.d.ts.map +1 -1
- package/esm/helpers/formatDate.js +12 -6
- package/esm/helpers/formatMissingTables.d.ts +8 -5
- package/esm/helpers/formatMissingTables.d.ts.map +1 -1
- package/esm/helpers/formatMissingTables.js +8 -5
- package/esm/helpers/formatNumber.d.ts +19 -10
- package/esm/helpers/formatNumber.d.ts.map +1 -1
- package/esm/helpers/formatNumber.js +32 -17
- package/esm/helpers/getGraphEdgeIdColumn.d.ts +9 -0
- package/esm/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
- package/esm/helpers/getGraphEdgeIdColumn.js +25 -0
- package/esm/helpers/getGraphEndpointColumns.d.ts +11 -0
- package/esm/helpers/getGraphEndpointColumns.d.ts.map +1 -0
- package/esm/helpers/getGraphEndpointColumns.js +160 -0
- package/esm/helpers/getGraphWeightColumn.d.ts +10 -0
- package/esm/helpers/getGraphWeightColumn.d.ts.map +1 -0
- package/esm/helpers/getGraphWeightColumn.js +40 -0
- package/esm/helpers/graphRouteResultSchema.d.ts +4 -0
- package/esm/helpers/graphRouteResultSchema.d.ts.map +1 -0
- package/esm/helpers/graphRouteResultSchema.js +12 -0
- package/esm/helpers/graphRouteResultSelect.d.ts +4 -0
- package/esm/helpers/graphRouteResultSelect.d.ts.map +1 -0
- package/esm/helpers/graphRouteResultSelect.js +22 -0
- package/esm/helpers/hasGeometryColumn.d.ts +4 -3
- package/esm/helpers/hasGeometryColumn.d.ts.map +1 -1
- package/esm/helpers/hasGeometryColumn.js +4 -3
- package/esm/helpers/initialUmapCoordinates.d.ts +2 -0
- package/esm/helpers/initialUmapCoordinates.d.ts.map +1 -0
- package/esm/helpers/initialUmapCoordinates.js +5 -0
- package/esm/helpers/inspectGraphConnectivity.d.ts +10 -0
- package/esm/helpers/inspectGraphConnectivity.d.ts.map +1 -0
- package/esm/helpers/inspectGraphConnectivity.js +55 -0
- package/esm/helpers/mergeOptions.d.ts +24 -13
- package/esm/helpers/mergeOptions.d.ts.map +1 -1
- package/esm/helpers/mergeOptions.js +24 -13
- package/esm/helpers/optimizeUmapLayout.d.ts +7 -0
- package/esm/helpers/optimizeUmapLayout.d.ts.map +1 -0
- package/esm/helpers/optimizeUmapLayout.js +93 -0
- package/esm/helpers/parseValue.d.ts +6 -4
- package/esm/helpers/parseValue.d.ts.map +1 -1
- package/esm/helpers/parseValue.js +6 -4
- package/esm/helpers/prepareGraphRouteSql.d.ts +31 -0
- package/esm/helpers/prepareGraphRouteSql.d.ts.map +1 -0
- package/esm/helpers/prepareGraphRouteSql.js +86 -0
- package/esm/helpers/prepareGraphStarts.d.ts +9 -0
- package/esm/helpers/prepareGraphStarts.d.ts.map +1 -0
- package/esm/helpers/prepareGraphStarts.js +68 -0
- package/esm/helpers/prepareGraphTemporalSql.d.ts +28 -0
- package/esm/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
- package/esm/helpers/prepareGraphTemporalSql.js +154 -0
- package/esm/helpers/prepareGraphTraversal.d.ts +19 -0
- package/esm/helpers/prepareGraphTraversal.d.ts.map +1 -0
- package/esm/helpers/prepareGraphTraversal.js +79 -0
- package/esm/helpers/prepareNumericFeatures.d.ts +41 -0
- package/esm/helpers/prepareNumericFeatures.d.ts.map +1 -0
- package/esm/helpers/prepareNumericFeatures.js +210 -0
- package/esm/helpers/prepareUmapLayoutOptions.d.ts +14 -0
- package/esm/helpers/prepareUmapLayoutOptions.d.ts.map +1 -0
- package/esm/helpers/prepareUmapLayoutOptions.js +23 -0
- package/esm/helpers/prettyDuration.d.ts +14 -8
- package/esm/helpers/prettyDuration.d.ts.map +1 -1
- package/esm/helpers/prettyDuration.js +14 -8
- package/esm/helpers/printTable.d.ts +18 -13
- package/esm/helpers/printTable.d.ts.map +1 -1
- package/esm/helpers/printTable.js +18 -13
- package/esm/helpers/publishPreparedColumns.d.ts +37 -0
- package/esm/helpers/publishPreparedColumns.d.ts.map +1 -0
- package/esm/helpers/publishPreparedColumns.js +113 -0
- package/esm/helpers/queryDB.d.ts +24 -13
- package/esm/helpers/queryDB.d.ts.map +1 -1
- package/esm/helpers/queryDB.js +24 -13
- package/esm/helpers/queueAsyncBarrier.d.ts +12 -7
- package/esm/helpers/queueAsyncBarrier.d.ts.map +1 -1
- package/esm/helpers/queueAsyncBarrier.js +12 -7
- package/esm/helpers/queueGraphResult.d.ts +18 -0
- package/esm/helpers/queueGraphResult.d.ts.map +1 -0
- package/esm/helpers/queueGraphResult.js +39 -0
- package/esm/helpers/quoteIdentifier.d.ts +4 -3
- package/esm/helpers/quoteIdentifier.d.ts.map +1 -1
- package/esm/helpers/quoteIdentifier.js +4 -3
- package/esm/helpers/quoteQualifiedIdentifier.d.ts +6 -4
- package/esm/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
- package/esm/helpers/quoteQualifiedIdentifier.js +6 -4
- package/esm/helpers/readScalarNumber.d.ts +3 -0
- package/esm/helpers/readScalarNumber.d.ts.map +1 -0
- package/esm/helpers/readScalarNumber.js +4 -0
- package/esm/helpers/runQuery.d.ts.map +1 -1
- package/esm/helpers/runQuery.js +17 -3
- package/esm/helpers/selectFuzzyReplacements.d.ts +11 -0
- package/esm/helpers/selectFuzzyReplacements.d.ts.map +1 -0
- package/esm/helpers/selectFuzzyReplacements.js +124 -0
- package/esm/helpers/stabilizeCosineVectors.d.ts +14 -0
- package/esm/helpers/stabilizeCosineVectors.d.ts.map +1 -0
- package/esm/helpers/stabilizeCosineVectors.js +34 -0
- package/esm/helpers/stringToArray.d.ts +4 -3
- package/esm/helpers/stringToArray.d.ts.map +1 -1
- package/esm/helpers/stringToArray.js +4 -3
- package/esm/helpers/umapRandom.d.ts +2 -0
- package/esm/helpers/umapRandom.d.ts.map +1 -0
- package/esm/helpers/umapRandom.js +10 -0
- package/esm/helpers/updateColumnsWithJS.d.ts +12 -6
- package/esm/helpers/updateColumnsWithJS.d.ts.map +1 -1
- package/esm/helpers/updateColumnsWithJS.js +12 -6
- package/esm/helpers/validateGraphRouteResultSchema.d.ts +4 -0
- package/esm/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
- package/esm/helpers/validateGraphRouteResultSchema.js +13 -0
- package/esm/helpers/validateGraphTemporalEvents.d.ts +7 -0
- package/esm/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
- package/esm/helpers/validateGraphTemporalEvents.js +47 -0
- package/esm/helpers/validateNumericalAnalysis.d.ts +10 -6
- package/esm/helpers/validateNumericalAnalysis.d.ts.map +1 -1
- package/esm/helpers/validateNumericalAnalysis.js +10 -6
- package/esm/helpers/validateVectorRowIds.d.ts +4 -0
- package/esm/helpers/validateVectorRowIds.d.ts.map +1 -0
- package/esm/helpers/validateVectorRowIds.js +16 -0
- package/esm/helpers/vectorDistanceExpression.d.ts +6 -0
- package/esm/helpers/vectorDistanceExpression.d.ts.map +1 -0
- package/esm/helpers/vectorDistanceExpression.js +11 -0
- package/esm/helpers/wrapString.d.ts +10 -7
- package/esm/helpers/wrapString.d.ts.map +1 -1
- package/esm/helpers/wrapString.js +10 -7
- package/esm/methods/addId.d.ts +5 -0
- package/esm/methods/addId.d.ts.map +1 -0
- package/esm/methods/addId.js +38 -0
- package/esm/methods/cache.js +1 -1
- package/esm/methods/commonNeighbors.d.ts +10 -0
- package/esm/methods/commonNeighbors.d.ts.map +1 -0
- package/esm/methods/commonNeighbors.js +101 -0
- package/esm/methods/connectedComponents.d.ts +9 -0
- package/esm/methods/connectedComponents.d.ts.map +1 -0
- package/esm/methods/connectedComponents.js +147 -0
- package/esm/methods/degree.d.ts +9 -0
- package/esm/methods/degree.d.ts.map +1 -0
- package/esm/methods/degree.js +135 -0
- package/esm/methods/distances.d.ts +12 -0
- package/esm/methods/distances.d.ts.map +1 -0
- package/esm/methods/distances.js +164 -0
- package/esm/methods/findCycles.d.ts +12 -0
- package/esm/methods/findCycles.d.ts.map +1 -0
- package/esm/methods/findCycles.js +330 -0
- package/esm/methods/fuzzyClean.d.ts.map +1 -1
- package/esm/methods/fuzzyClean.js +17 -136
- package/esm/methods/fuzzyJoin.js +70 -16
- package/esm/methods/getTypes.d.ts +1 -1
- package/esm/methods/hdbscan.d.ts +5 -0
- package/esm/methods/hdbscan.d.ts.map +1 -0
- package/esm/methods/hdbscan.js +208 -0
- package/esm/methods/loadArray.d.ts.map +1 -1
- package/esm/methods/loadArray.js +3 -20
- package/esm/methods/mahalanobis.d.ts +5 -0
- package/esm/methods/mahalanobis.d.ts.map +1 -0
- package/esm/methods/mahalanobis.js +92 -0
- package/esm/methods/neighbors.d.ts +9 -0
- package/esm/methods/neighbors.d.ts.map +1 -0
- package/esm/methods/neighbors.js +81 -0
- package/esm/methods/normalizeVector.d.ts +5 -0
- package/esm/methods/normalizeVector.d.ts.map +1 -0
- package/esm/methods/normalizeVector.js +132 -0
- package/esm/methods/paths.d.ts +12 -0
- package/esm/methods/paths.d.ts.map +1 -0
- package/esm/methods/paths.js +287 -0
- package/esm/methods/reachable.d.ts +11 -0
- package/esm/methods/reachable.d.ts.map +1 -0
- package/esm/methods/reachable.js +131 -0
- package/esm/methods/rowToVector.d.ts +5 -0
- package/esm/methods/rowToVector.d.ts.map +1 -0
- package/esm/methods/rowToVector.js +77 -0
- package/esm/methods/shortestPath.d.ts +12 -0
- package/esm/methods/shortestPath.d.ts.map +1 -0
- package/esm/methods/shortestPath.js +337 -0
- package/esm/methods/topologicalSort.d.ts +7 -0
- package/esm/methods/topologicalSort.d.ts.map +1 -0
- package/esm/methods/topologicalSort.js +164 -0
- package/esm/methods/umap.d.ts +5 -0
- package/esm/methods/umap.d.ts.map +1 -0
- package/esm/methods/umap.js +156 -0
- package/esm/methods/updateWithJS.js +9 -21
- package/llm.md +2170 -128
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/script/class/SDAError.d.ts +6 -6
- package/script/class/SDAError.js +6 -6
- package/script/class/Simple.d.ts +9 -9
- package/script/class/Simple.js +9 -9
- package/script/class/SimpleDB.d.ts +80 -76
- package/script/class/SimpleDB.d.ts.map +1 -1
- package/script/class/SimpleDB.js +80 -76
- package/script/class/SimpleTable.d.ts +2805 -1077
- package/script/class/SimpleTable.d.ts.map +1 -1
- package/script/class/SimpleTable.js +2777 -1077
- package/script/helpers/appendColumnBatches.d.ts +3 -0
- package/script/helpers/appendColumnBatches.d.ts.map +1 -0
- package/script/helpers/appendColumnBatches.js +24 -0
- package/script/helpers/buildApproximateMutualReachabilityMst.d.ts +45 -0
- package/script/helpers/buildApproximateMutualReachabilityMst.d.ts.map +1 -0
- package/script/helpers/buildApproximateMutualReachabilityMst.js +219 -0
- package/script/helpers/buildChronologicalGraphComponentsSql.d.ts +14 -0
- package/script/helpers/buildChronologicalGraphComponentsSql.d.ts.map +1 -0
- package/script/helpers/buildChronologicalGraphComponentsSql.js +174 -0
- package/script/helpers/buildExactMutualReachabilityMst.d.ts +28 -0
- package/script/helpers/buildExactMutualReachabilityMst.d.ts.map +1 -0
- package/script/helpers/buildExactMutualReachabilityMst.js +103 -0
- package/script/helpers/buildGraphTemporalCostStateSql.d.ts +12 -0
- package/script/helpers/buildGraphTemporalCostStateSql.d.ts.map +1 -0
- package/script/helpers/buildGraphTemporalCostStateSql.js +92 -0
- package/script/helpers/buildGraphTemporalReachabilitySql.d.ts +13 -0
- package/script/helpers/buildGraphTemporalReachabilitySql.d.ts.map +1 -0
- package/script/helpers/buildGraphTemporalReachabilitySql.js +76 -0
- package/script/helpers/buildSparseMutualReachabilityMst.d.ts +10 -0
- package/script/helpers/buildSparseMutualReachabilityMst.d.ts.map +1 -0
- package/script/helpers/buildSparseMutualReachabilityMst.js +50 -0
- package/script/helpers/buildUmapGraph.d.ts +21 -0
- package/script/helpers/buildUmapGraph.d.ts.map +1 -0
- package/script/helpers/buildUmapGraph.js +67 -0
- package/script/helpers/buildVectorNeighbors.d.ts +45 -0
- package/script/helpers/buildVectorNeighbors.d.ts.map +1 -0
- package/script/helpers/buildVectorNeighbors.js +176 -0
- package/script/helpers/buildWeakGraphComponentsSql.d.ts +3 -0
- package/script/helpers/buildWeakGraphComponentsSql.d.ts.map +1 -0
- package/script/helpers/buildWeakGraphComponentsSql.js +38 -0
- package/script/helpers/cacheDatabase.d.ts.map +1 -1
- package/script/helpers/cacheDatabase.js +2 -1
- package/script/helpers/camelCase.d.ts +7 -5
- package/script/helpers/camelCase.d.ts.map +1 -1
- package/script/helpers/camelCase.js +7 -5
- package/script/helpers/capitalize.d.ts +6 -4
- package/script/helpers/capitalize.d.ts.map +1 -1
- package/script/helpers/capitalize.js +6 -4
- package/script/helpers/clusterHdbscan.d.ts +18 -0
- package/script/helpers/clusterHdbscan.d.ts.map +1 -0
- package/script/helpers/clusterHdbscan.js +346 -0
- package/script/helpers/computeCovariance.d.ts +16 -0
- package/script/helpers/computeCovariance.d.ts.map +1 -0
- package/script/helpers/computeCovariance.js +105 -0
- package/script/helpers/computeMahalanobisDistances.d.ts +14 -0
- package/script/helpers/computeMahalanobisDistances.d.ts.map +1 -0
- package/script/helpers/computeMahalanobisDistances.js +93 -0
- package/script/helpers/createDirectory.d.ts +4 -3
- package/script/helpers/createDirectory.d.ts.map +1 -1
- package/script/helpers/createDirectory.js +4 -3
- package/script/helpers/dataToArrays.d.ts +6 -4
- package/script/helpers/dataToArrays.d.ts.map +1 -1
- package/script/helpers/dataToArrays.js +6 -4
- package/script/helpers/extractTypes.d.ts +1 -1
- package/script/helpers/extractTypes.js +4 -9
- package/script/helpers/factorCovariance.d.ts +17 -0
- package/script/helpers/factorCovariance.d.ts.map +1 -0
- package/script/helpers/factorCovariance.js +194 -0
- package/script/helpers/findGeoColumn.d.ts +6 -4
- package/script/helpers/findGeoColumn.d.ts.map +1 -1
- package/script/helpers/findGeoColumn.js +6 -4
- package/script/helpers/findGeoColumnFromSchema.d.ts +8 -5
- package/script/helpers/findGeoColumnFromSchema.d.ts.map +1 -1
- package/script/helpers/findGeoColumnFromSchema.js +8 -5
- package/script/helpers/fitUmapCurve.d.ts +2 -0
- package/script/helpers/fitUmapCurve.d.ts.map +1 -0
- package/script/helpers/fitUmapCurve.js +69 -0
- package/script/helpers/formatDate.d.ts +12 -6
- package/script/helpers/formatDate.d.ts.map +1 -1
- package/script/helpers/formatDate.js +12 -6
- package/script/helpers/formatMissingTables.d.ts +8 -5
- package/script/helpers/formatMissingTables.d.ts.map +1 -1
- package/script/helpers/formatMissingTables.js +8 -5
- package/script/helpers/formatNumber.d.ts +19 -10
- package/script/helpers/formatNumber.d.ts.map +1 -1
- package/script/helpers/formatNumber.js +32 -17
- package/script/helpers/getGraphEdgeIdColumn.d.ts +9 -0
- package/script/helpers/getGraphEdgeIdColumn.d.ts.map +1 -0
- package/script/helpers/getGraphEdgeIdColumn.js +31 -0
- package/script/helpers/getGraphEndpointColumns.d.ts +11 -0
- package/script/helpers/getGraphEndpointColumns.d.ts.map +1 -0
- package/script/helpers/getGraphEndpointColumns.js +166 -0
- package/script/helpers/getGraphWeightColumn.d.ts +10 -0
- package/script/helpers/getGraphWeightColumn.d.ts.map +1 -0
- package/script/helpers/getGraphWeightColumn.js +46 -0
- package/script/helpers/graphRouteResultSchema.d.ts +4 -0
- package/script/helpers/graphRouteResultSchema.d.ts.map +1 -0
- package/script/helpers/graphRouteResultSchema.js +18 -0
- package/script/helpers/graphRouteResultSelect.d.ts +4 -0
- package/script/helpers/graphRouteResultSelect.d.ts.map +1 -0
- package/script/helpers/graphRouteResultSelect.js +28 -0
- package/script/helpers/hasGeometryColumn.d.ts +4 -3
- package/script/helpers/hasGeometryColumn.d.ts.map +1 -1
- package/script/helpers/hasGeometryColumn.js +4 -3
- package/script/helpers/initialUmapCoordinates.d.ts +2 -0
- package/script/helpers/initialUmapCoordinates.d.ts.map +1 -0
- package/script/helpers/initialUmapCoordinates.js +11 -0
- package/script/helpers/inspectGraphConnectivity.d.ts +10 -0
- package/script/helpers/inspectGraphConnectivity.d.ts.map +1 -0
- package/script/helpers/inspectGraphConnectivity.js +58 -0
- package/script/helpers/mergeOptions.d.ts +24 -13
- package/script/helpers/mergeOptions.d.ts.map +1 -1
- package/script/helpers/mergeOptions.js +24 -13
- package/script/helpers/optimizeUmapLayout.d.ts +7 -0
- package/script/helpers/optimizeUmapLayout.d.ts.map +1 -0
- package/script/helpers/optimizeUmapLayout.js +99 -0
- package/script/helpers/parseValue.d.ts +6 -4
- package/script/helpers/parseValue.d.ts.map +1 -1
- package/script/helpers/parseValue.js +6 -4
- package/script/helpers/prepareGraphRouteSql.d.ts +31 -0
- package/script/helpers/prepareGraphRouteSql.d.ts.map +1 -0
- package/script/helpers/prepareGraphRouteSql.js +127 -0
- package/script/helpers/prepareGraphStarts.d.ts +9 -0
- package/script/helpers/prepareGraphStarts.d.ts.map +1 -0
- package/script/helpers/prepareGraphStarts.js +71 -0
- package/script/helpers/prepareGraphTemporalSql.d.ts +28 -0
- package/script/helpers/prepareGraphTemporalSql.d.ts.map +1 -0
- package/script/helpers/prepareGraphTemporalSql.js +161 -0
- package/script/helpers/prepareGraphTraversal.d.ts +19 -0
- package/script/helpers/prepareGraphTraversal.d.ts.map +1 -0
- package/script/helpers/prepareGraphTraversal.js +87 -0
- package/script/helpers/prepareNumericFeatures.d.ts +41 -0
- package/script/helpers/prepareNumericFeatures.d.ts.map +1 -0
- package/script/helpers/prepareNumericFeatures.js +217 -0
- package/script/helpers/prepareUmapLayoutOptions.d.ts +14 -0
- package/script/helpers/prepareUmapLayoutOptions.d.ts.map +1 -0
- package/script/helpers/prepareUmapLayoutOptions.js +29 -0
- package/script/helpers/prettyDuration.d.ts +14 -8
- package/script/helpers/prettyDuration.d.ts.map +1 -1
- package/script/helpers/prettyDuration.js +14 -8
- package/script/helpers/printTable.d.ts +18 -13
- package/script/helpers/printTable.d.ts.map +1 -1
- package/script/helpers/printTable.js +18 -13
- package/script/helpers/publishPreparedColumns.d.ts +37 -0
- package/script/helpers/publishPreparedColumns.d.ts.map +1 -0
- package/script/helpers/publishPreparedColumns.js +119 -0
- package/script/helpers/queryDB.d.ts +24 -13
- package/script/helpers/queryDB.d.ts.map +1 -1
- package/script/helpers/queryDB.js +24 -13
- package/script/helpers/queueAsyncBarrier.d.ts +12 -7
- package/script/helpers/queueAsyncBarrier.d.ts.map +1 -1
- package/script/helpers/queueAsyncBarrier.js +12 -7
- package/script/helpers/queueGraphResult.d.ts +18 -0
- package/script/helpers/queueGraphResult.d.ts.map +1 -0
- package/script/helpers/queueGraphResult.js +45 -0
- package/script/helpers/quoteIdentifier.d.ts +4 -3
- package/script/helpers/quoteIdentifier.d.ts.map +1 -1
- package/script/helpers/quoteIdentifier.js +4 -3
- package/script/helpers/quoteQualifiedIdentifier.d.ts +6 -4
- package/script/helpers/quoteQualifiedIdentifier.d.ts.map +1 -1
- package/script/helpers/quoteQualifiedIdentifier.js +6 -4
- package/script/helpers/readScalarNumber.d.ts +3 -0
- package/script/helpers/readScalarNumber.d.ts.map +1 -0
- package/script/helpers/readScalarNumber.js +7 -0
- package/script/helpers/runQuery.d.ts.map +1 -1
- package/script/helpers/runQuery.js +17 -3
- package/script/helpers/selectFuzzyReplacements.d.ts +11 -0
- package/script/helpers/selectFuzzyReplacements.d.ts.map +1 -0
- package/script/helpers/selectFuzzyReplacements.js +127 -0
- package/script/helpers/stabilizeCosineVectors.d.ts +14 -0
- package/script/helpers/stabilizeCosineVectors.d.ts.map +1 -0
- package/script/helpers/stabilizeCosineVectors.js +40 -0
- package/script/helpers/stringToArray.d.ts +4 -3
- package/script/helpers/stringToArray.d.ts.map +1 -1
- package/script/helpers/stringToArray.js +4 -3
- package/script/helpers/umapRandom.d.ts +2 -0
- package/script/helpers/umapRandom.d.ts.map +1 -0
- package/script/helpers/umapRandom.js +13 -0
- package/script/helpers/updateColumnsWithJS.d.ts +12 -6
- package/script/helpers/updateColumnsWithJS.d.ts.map +1 -1
- package/script/helpers/updateColumnsWithJS.js +12 -6
- package/script/helpers/validateGraphRouteResultSchema.d.ts +4 -0
- package/script/helpers/validateGraphRouteResultSchema.d.ts.map +1 -0
- package/script/helpers/validateGraphRouteResultSchema.js +19 -0
- package/script/helpers/validateGraphTemporalEvents.d.ts +7 -0
- package/script/helpers/validateGraphTemporalEvents.d.ts.map +1 -0
- package/script/helpers/validateGraphTemporalEvents.js +53 -0
- package/script/helpers/validateNumericalAnalysis.d.ts +10 -6
- package/script/helpers/validateNumericalAnalysis.d.ts.map +1 -1
- package/script/helpers/validateNumericalAnalysis.js +10 -6
- package/script/helpers/validateVectorRowIds.d.ts +4 -0
- package/script/helpers/validateVectorRowIds.d.ts.map +1 -0
- package/script/helpers/validateVectorRowIds.js +19 -0
- package/script/helpers/vectorDistanceExpression.d.ts +6 -0
- package/script/helpers/vectorDistanceExpression.d.ts.map +1 -0
- package/script/helpers/vectorDistanceExpression.js +14 -0
- package/script/helpers/wrapString.d.ts +10 -7
- package/script/helpers/wrapString.d.ts.map +1 -1
- package/script/helpers/wrapString.js +10 -7
- package/script/methods/addId.d.ts +5 -0
- package/script/methods/addId.d.ts.map +1 -0
- package/script/methods/addId.js +44 -0
- package/script/methods/cache.js +1 -1
- package/script/methods/commonNeighbors.d.ts +10 -0
- package/script/methods/commonNeighbors.d.ts.map +1 -0
- package/script/methods/commonNeighbors.js +140 -0
- package/script/methods/connectedComponents.d.ts +9 -0
- package/script/methods/connectedComponents.d.ts.map +1 -0
- package/script/methods/connectedComponents.js +186 -0
- package/script/methods/degree.d.ts +9 -0
- package/script/methods/degree.d.ts.map +1 -0
- package/script/methods/degree.js +141 -0
- package/script/methods/distances.d.ts +12 -0
- package/script/methods/distances.d.ts.map +1 -0
- package/script/methods/distances.js +203 -0
- package/script/methods/findCycles.d.ts +12 -0
- package/script/methods/findCycles.d.ts.map +1 -0
- package/script/methods/findCycles.js +369 -0
- package/script/methods/fuzzyClean.d.ts.map +1 -1
- package/script/methods/fuzzyClean.js +17 -136
- package/script/methods/fuzzyJoin.js +70 -16
- package/script/methods/getTypes.d.ts +1 -1
- package/script/methods/hdbscan.d.ts +5 -0
- package/script/methods/hdbscan.d.ts.map +1 -0
- package/script/methods/hdbscan.js +214 -0
- package/script/methods/loadArray.d.ts.map +1 -1
- package/script/methods/loadArray.js +2 -19
- package/script/methods/mahalanobis.d.ts +5 -0
- package/script/methods/mahalanobis.d.ts.map +1 -0
- package/script/methods/mahalanobis.js +98 -0
- package/script/methods/neighbors.d.ts +9 -0
- package/script/methods/neighbors.d.ts.map +1 -0
- package/script/methods/neighbors.js +120 -0
- package/script/methods/normalizeVector.d.ts +5 -0
- package/script/methods/normalizeVector.d.ts.map +1 -0
- package/script/methods/normalizeVector.js +138 -0
- package/script/methods/paths.d.ts +12 -0
- package/script/methods/paths.d.ts.map +1 -0
- package/script/methods/paths.js +326 -0
- package/script/methods/reachable.d.ts +11 -0
- package/script/methods/reachable.d.ts.map +1 -0
- package/script/methods/reachable.js +170 -0
- package/script/methods/rowToVector.d.ts +5 -0
- package/script/methods/rowToVector.d.ts.map +1 -0
- package/script/methods/rowToVector.js +83 -0
- package/script/methods/shortestPath.d.ts +12 -0
- package/script/methods/shortestPath.d.ts.map +1 -0
- package/script/methods/shortestPath.js +376 -0
- package/script/methods/topologicalSort.d.ts +7 -0
- package/script/methods/topologicalSort.d.ts.map +1 -0
- package/script/methods/topologicalSort.js +170 -0
- package/script/methods/umap.d.ts +5 -0
- package/script/methods/umap.d.ts.map +1 -0
- package/script/methods/umap.js +162 -0
- package/script/methods/updateWithJS.js +9 -21
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import computeCovariance from "../helpers/computeCovariance.js";
|
|
2
|
+
import computeMahalanobisDistances from "../helpers/computeMahalanobisDistances.js";
|
|
3
|
+
import foldIdentifier from "../helpers/foldIdentifier.js";
|
|
4
|
+
import prepareNumericFeatures from "../helpers/prepareNumericFeatures.js";
|
|
5
|
+
import publishPreparedColumns from "../helpers/publishPreparedColumns.js";
|
|
6
|
+
import queueOp from "../helpers/queueOp.js";
|
|
7
|
+
import quoteIdentifier from "../helpers/quoteIdentifier.js";
|
|
8
|
+
export default function mahalanobis(table, columns, referencePoint, newColumn, options = {}) {
|
|
9
|
+
if (!Array.isArray(referencePoint) || referencePoint.length === 0 ||
|
|
10
|
+
Array.from(referencePoint).some((value) => typeof value !== "number" || !Number.isFinite(value))) {
|
|
11
|
+
throw new Error("mahalanobis() referencePoint must be a nonempty array of finite numbers in feature-dimension order.");
|
|
12
|
+
}
|
|
13
|
+
const selected = typeof columns === "string" ? columns : [...columns];
|
|
14
|
+
const reference = [...referencePoint];
|
|
15
|
+
const settings = { ...options };
|
|
16
|
+
queueOp(table, {
|
|
17
|
+
kind: "barrier",
|
|
18
|
+
method: "mahalanobis()",
|
|
19
|
+
parameters: {
|
|
20
|
+
columns: selected,
|
|
21
|
+
referencePoint: reference,
|
|
22
|
+
newColumn,
|
|
23
|
+
options: settings,
|
|
24
|
+
},
|
|
25
|
+
execute: () => execute(table, selected, reference, newColumn, settings),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function execute(table, columns, referencePoint, newColumn, options) {
|
|
29
|
+
const sourceColumns = Object.keys(await table.getTypes());
|
|
30
|
+
const outputNames = options.similarityScoreColumn === undefined
|
|
31
|
+
? [newColumn]
|
|
32
|
+
: [newColumn, options.similarityScoreColumn];
|
|
33
|
+
const seen = new Set();
|
|
34
|
+
for (const name of outputNames) {
|
|
35
|
+
if (typeof name !== "string" || name.length === 0 || name.includes("\0")) {
|
|
36
|
+
throw new Error("mahalanobis() output column names must be nonempty strings without null characters.");
|
|
37
|
+
}
|
|
38
|
+
const folded = foldIdentifier(name);
|
|
39
|
+
if (seen.has(folded)) {
|
|
40
|
+
throw new Error("mahalanobis() distance and similarity score columns must have different names (case-insensitive).");
|
|
41
|
+
}
|
|
42
|
+
seen.add(folded);
|
|
43
|
+
if (sourceColumns.some((column) => foldIdentifier(column) === folded)) {
|
|
44
|
+
throw new Error(`mahalanobis() cannot create ${quoteIdentifier(name)} because that column already exists. Remove it first or choose a different name.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const prepared = await prepareNumericFeatures(table, typeof columns === "string"
|
|
48
|
+
? { kind: "vector", column: columns }
|
|
49
|
+
: { kind: "scalars", columns }, { method: "mahalanobis()" });
|
|
50
|
+
try {
|
|
51
|
+
if (referencePoint.length !== prepared.dimensions) {
|
|
52
|
+
throw new Error(`mahalanobis() referencePoint must contain ${prepared.dimensions} values in feature-dimension order; received ${referencePoint.length}.`);
|
|
53
|
+
}
|
|
54
|
+
const model = await computeCovariance(table.connection, {
|
|
55
|
+
relation: prepared.relation,
|
|
56
|
+
rowIdColumn: prepared.rowIdColumn,
|
|
57
|
+
vectorColumn: prepared.vectorColumn,
|
|
58
|
+
observations: prepared.rowCount,
|
|
59
|
+
dimensions: prepared.dimensions,
|
|
60
|
+
});
|
|
61
|
+
const distances = await computeMahalanobisDistances(table.connection, {
|
|
62
|
+
relation: prepared.relation,
|
|
63
|
+
rowIdColumn: prepared.rowIdColumn,
|
|
64
|
+
vectorColumn: prepared.vectorColumn,
|
|
65
|
+
}, model, referencePoint);
|
|
66
|
+
try {
|
|
67
|
+
const distance = `r.${quoteIdentifier(distances.distanceColumn)}`;
|
|
68
|
+
const outputs = [{ name: newColumn, expression: distance }];
|
|
69
|
+
if (options.similarityScoreColumn !== undefined) {
|
|
70
|
+
outputs.push({
|
|
71
|
+
name: options.similarityScoreColumn,
|
|
72
|
+
expression: `CASE WHEN max(${distance}) OVER () = 0 THEN 1::DOUBLE ELSE 1 - ${distance} / max(${distance}) OVER () END`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
await publishPreparedColumns(table, prepared, {
|
|
76
|
+
method: "mahalanobis()",
|
|
77
|
+
parameters: { columns, referencePoint, newColumn, options },
|
|
78
|
+
result: {
|
|
79
|
+
relation: distances.relation,
|
|
80
|
+
rowIdColumn: distances.rowIdColumn,
|
|
81
|
+
},
|
|
82
|
+
outputs,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
await distances.cleanup();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await prepared.cleanup();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type GraphId } from "../helpers/prepareGraphStarts.js";
|
|
2
|
+
import type SimpleTable from "../class/SimpleTable.js";
|
|
3
|
+
type NeighborsOptions = {
|
|
4
|
+
direction?: "outgoing" | "incoming" | "both";
|
|
5
|
+
outputTable?: string | boolean;
|
|
6
|
+
};
|
|
7
|
+
export default function neighbors(simpleTable: SimpleTable, sourceColumn: string, targetColumn: string, startNodes: GraphId | GraphId[], options?: NeighborsOptions): SimpleTable;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=neighbors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neighbors.d.ts","sourceRoot":"","sources":["../../src/methods/neighbors.ts"],"names":[],"mappings":"AAAA,OAA2B,EACzB,KAAK,OAAO,EAEb,MAAM,kCAAkC,CAAC;AAO1C,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAGvD,KAAK,gBAAgB,GAAG;IACtB,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,EAC/B,OAAO,GAAE,gBAAqB,GAC7B,WAAW,CAuEb"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import prepareGraphStarts from "../helpers/prepareGraphStarts.js";
|
|
2
|
+
import prepareGraphTraversal, { validateGraphStarts, } from "../helpers/prepareGraphTraversal.js";
|
|
3
|
+
import queueGraphResult from "../helpers/queueGraphResult.js";
|
|
4
|
+
import quoteIdentifier from "../helpers/quoteIdentifier.js";
|
|
5
|
+
export default function neighbors(simpleTable, sourceColumn, targetColumn, startNodes, options = {}) {
|
|
6
|
+
if (typeof sourceColumn !== "string") {
|
|
7
|
+
throw new TypeError("neighbors() sourceColumn must be a string.");
|
|
8
|
+
}
|
|
9
|
+
if (typeof targetColumn !== "string") {
|
|
10
|
+
throw new TypeError("neighbors() targetColumn must be a string.");
|
|
11
|
+
}
|
|
12
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
13
|
+
throw new TypeError("neighbors() options must be an object.");
|
|
14
|
+
}
|
|
15
|
+
if (options.direction !== undefined &&
|
|
16
|
+
!["outgoing", "incoming", "both"].includes(options.direction)) {
|
|
17
|
+
throw new TypeError('neighbors() options.direction must be "outgoing", "incoming", or "both".');
|
|
18
|
+
}
|
|
19
|
+
if (options.outputTable !== undefined &&
|
|
20
|
+
typeof options.outputTable !== "string" &&
|
|
21
|
+
typeof options.outputTable !== "boolean") {
|
|
22
|
+
throw new TypeError("neighbors() options.outputTable must be a string or boolean.");
|
|
23
|
+
}
|
|
24
|
+
const preparedStarts = prepareGraphStarts(startNodes, "neighbors()", "startNodes");
|
|
25
|
+
options = structuredClone(options);
|
|
26
|
+
const direction = options.direction ?? "outgoing";
|
|
27
|
+
const parameters = {
|
|
28
|
+
sourceColumn,
|
|
29
|
+
targetColumn,
|
|
30
|
+
startNodes: structuredClone(startNodes),
|
|
31
|
+
options,
|
|
32
|
+
};
|
|
33
|
+
return queueGraphResult(simpleTable, {
|
|
34
|
+
method: "neighbors()",
|
|
35
|
+
parameters,
|
|
36
|
+
outputTable: options.outputTable,
|
|
37
|
+
values: (schema) => {
|
|
38
|
+
validateStarts(schema, sourceColumn, targetColumn, preparedStarts);
|
|
39
|
+
return preparedStarts.values;
|
|
40
|
+
},
|
|
41
|
+
buildSelect: (input, schema) => neighborsSelect(input, schema, sourceColumn, targetColumn, preparedStarts, direction),
|
|
42
|
+
outputSchema: (schema) => {
|
|
43
|
+
const endpoints = validateStarts(schema, sourceColumn, targetColumn, preparedStarts);
|
|
44
|
+
return { start: endpoints.idType, node: endpoints.idType };
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function validateStarts(schema, source, target, starts) {
|
|
49
|
+
return validateGraphStarts(schema, source, target, starts, "neighbors()", "startNodes");
|
|
50
|
+
}
|
|
51
|
+
function neighborsSelect(input, schema, source, target, starts, direction) {
|
|
52
|
+
const prepared = prepareGraphTraversal(input, schema, source, target, starts, "neighbors()", "startNodes");
|
|
53
|
+
const relations = prepared.relationNames([
|
|
54
|
+
"graph_starts",
|
|
55
|
+
"graph_edges",
|
|
56
|
+
"neighbor_matches",
|
|
57
|
+
]);
|
|
58
|
+
const startsRelation = relations.graph_starts;
|
|
59
|
+
const edgesRelation = relations.graph_edges;
|
|
60
|
+
const matchesRelation = relations.neighbor_matches;
|
|
61
|
+
return `WITH ${startsRelation}(${quoteIdentifier("start")}) AS (
|
|
62
|
+
VALUES ${prepared.startValues}
|
|
63
|
+
), ${edgesRelation} AS (
|
|
64
|
+
${prepared.edges(direction)}
|
|
65
|
+
), ${matchesRelation} AS (
|
|
66
|
+
SELECT ${quoteIdentifier("starts")}.${quoteIdentifier("start")},
|
|
67
|
+
${quoteIdentifier("edges")}.${quoteIdentifier("__to")} AS ${quoteIdentifier("node")},
|
|
68
|
+
${quoteIdentifier("edges")}.${quoteIdentifier("__from_key")} AS ${quoteIdentifier("__start_key")},
|
|
69
|
+
${quoteIdentifier("edges")}.${quoteIdentifier("__to_key")} AS ${quoteIdentifier("__node_key")}
|
|
70
|
+
FROM ${edgesRelation} AS ${quoteIdentifier("edges")}
|
|
71
|
+
INNER JOIN ${startsRelation} AS ${quoteIdentifier("starts")}
|
|
72
|
+
ON ${quoteIdentifier("edges")}.${quoteIdentifier("__from_key")} =
|
|
73
|
+
${prepared.key(`${quoteIdentifier("starts")}.${quoteIdentifier("start")}`)}
|
|
74
|
+
)
|
|
75
|
+
SELECT ${quoteIdentifier("start")}, ${quoteIdentifier("node")}
|
|
76
|
+
FROM (
|
|
77
|
+
SELECT DISTINCT ${quoteIdentifier("start")}, ${quoteIdentifier("node")}, ${quoteIdentifier("__start_key")}, ${quoteIdentifier("__node_key")}
|
|
78
|
+
FROM ${matchesRelation}
|
|
79
|
+
) AS ${quoteIdentifier("distinct_neighbors")}
|
|
80
|
+
ORDER BY ${quoteIdentifier("__start_key")}, ${quoteIdentifier("__node_key")}`;
|
|
81
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type SimpleTable from "../class/SimpleTable.js";
|
|
2
|
+
type Options = NonNullable<Parameters<SimpleTable["normalizeVector"]>[2]>;
|
|
3
|
+
export default function normalizeVector(table: SimpleTable, column: string, newColumn: string, options?: Options): void;
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=normalizeVector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeVector.d.ts","sourceRoot":"","sources":["../../src/methods/normalizeVector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAOvD,KAAK,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAC,OAAO,UAAU,eAAe,CACrC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,OAAY,GACpB,IAAI,CAiBN"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import foldIdentifier from "../helpers/foldIdentifier.js";
|
|
2
|
+
import prepareNumericFeatures from "../helpers/prepareNumericFeatures.js";
|
|
3
|
+
import publishPreparedColumns from "../helpers/publishPreparedColumns.js";
|
|
4
|
+
import queueOp from "../helpers/queueOp.js";
|
|
5
|
+
import quoteIdentifier from "../helpers/quoteIdentifier.js";
|
|
6
|
+
export default function normalizeVector(table, column, newColumn, options = {}) {
|
|
7
|
+
if (options.normalization !== undefined &&
|
|
8
|
+
options.normalization !== "dimensionMinMax" &&
|
|
9
|
+
options.normalization !== "rowL2") {
|
|
10
|
+
throw new Error('normalizeVector() options.normalization must be "dimensionMinMax" or "rowL2".');
|
|
11
|
+
}
|
|
12
|
+
const settings = structuredClone(options);
|
|
13
|
+
queueOp(table, {
|
|
14
|
+
kind: "barrier",
|
|
15
|
+
method: "normalizeVector()",
|
|
16
|
+
parameters: { column, newColumn, options: settings },
|
|
17
|
+
execute: () => execute(table, column, newColumn, settings),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async function execute(table, column, newColumn, options) {
|
|
21
|
+
const normalization = options.normalization ?? "dimensionMinMax";
|
|
22
|
+
const overwrite = foldIdentifier(column) === foldIdentifier(newColumn);
|
|
23
|
+
if (!overwrite) {
|
|
24
|
+
const sourceColumns = Object.keys(await table.getTypes());
|
|
25
|
+
if (sourceColumns.some((name) => foldIdentifier(name) === foldIdentifier(newColumn))) {
|
|
26
|
+
throw new Error(`normalizeVector() cannot create ${quoteIdentifier(newColumn)} because that column already exists. Remove it first or choose a different name.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const prepared = await prepareNumericFeatures(table, { kind: "vector", column }, { method: "normalizeVector()" });
|
|
30
|
+
const connection = table.connection;
|
|
31
|
+
const q = quoteIdentifier;
|
|
32
|
+
const suffix = crypto.randomUUID().replaceAll("-", "");
|
|
33
|
+
const statsName = `__sda_normalize_vector_${suffix}_stats`;
|
|
34
|
+
const resultName = `__sda_normalize_vector_${suffix}_result`;
|
|
35
|
+
const dimension = q(`__sda_dimension_${suffix}`);
|
|
36
|
+
const minimum = q(`__sda_min_${suffix}`);
|
|
37
|
+
const maximum = q(`__sda_max_${suffix}`);
|
|
38
|
+
const normalized = `__sda_normalized_${suffix}`;
|
|
39
|
+
try {
|
|
40
|
+
if (prepared.rowCount === 0) {
|
|
41
|
+
throw new Error("normalizeVector() requires at least one row; the dataset is empty.");
|
|
42
|
+
}
|
|
43
|
+
const sourceColumn = prepared.sourceColumns.find((name) => foldIdentifier(name) === foldIdentifier(column));
|
|
44
|
+
if (normalization === "rowL2") {
|
|
45
|
+
// Scale before squaring so extreme finite magnitudes do not overflow
|
|
46
|
+
// or underflow the norm. A zero vector stays zero.
|
|
47
|
+
await connection.run(`CREATE TEMP TABLE ${q(resultName)} AS
|
|
48
|
+
WITH magnitudes AS (
|
|
49
|
+
SELECT ${q(prepared.rowIdColumn)}, ${q(prepared.vectorColumn)} AS vec,
|
|
50
|
+
list_max(list_transform(${q(prepared.vectorColumn)}, value -> abs(value))) AS magnitude
|
|
51
|
+
FROM ${q(prepared.relation)}
|
|
52
|
+
), scaled AS (
|
|
53
|
+
SELECT *, list_transform(vec, value -> value / nullif(magnitude, 0)) AS unit_scale
|
|
54
|
+
FROM magnitudes
|
|
55
|
+
), norms AS (
|
|
56
|
+
SELECT *, sqrt(list_sum(list_transform(unit_scale, value -> value * value))) AS norm
|
|
57
|
+
FROM scaled
|
|
58
|
+
)
|
|
59
|
+
SELECT ${q(prepared.rowIdColumn)},
|
|
60
|
+
(CASE WHEN magnitude = 0 THEN vec::DOUBLE[]
|
|
61
|
+
ELSE list_transform(unit_scale, value -> value / norm)
|
|
62
|
+
END)::DOUBLE[${prepared.dimensions}] AS ${q(normalized)}
|
|
63
|
+
FROM norms`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
await connection.run(`CREATE TEMP TABLE ${q(statsName)} AS
|
|
67
|
+
SELECT ordinal::BIGINT AS ${dimension}, min(value)::DOUBLE AS ${minimum},
|
|
68
|
+
max(value)::DOUBLE AS ${maximum}
|
|
69
|
+
FROM ${q(prepared.relation)} p,
|
|
70
|
+
UNNEST(p.${q(prepared.vectorColumn)}::DOUBLE[]) WITH ORDINALITY AS values(value, ordinal)
|
|
71
|
+
GROUP BY ordinal`);
|
|
72
|
+
const invalidStats = Number((await connection.runAndReadAll(`SELECT count(*) FROM ${q(statsName)}
|
|
73
|
+
WHERE NOT isfinite(${minimum}) OR NOT isfinite(${maximum})`)).getRowsJS()[0][0]);
|
|
74
|
+
if (invalidStats > 0) {
|
|
75
|
+
throw new Error(`normalizeVector() found ${invalidStats} dimension${invalidStats === 1 ? "" : "s"} with non-finite aggregate values after conversion to DOUBLE.`);
|
|
76
|
+
}
|
|
77
|
+
const constantDimensions = (await connection.runAndReadAll(`SELECT ${dimension} FROM ${q(statsName)}
|
|
78
|
+
WHERE ${minimum} = ${maximum} ORDER BY ${dimension}`)).getRowsJS().map((row) => Number(row[0]));
|
|
79
|
+
if (constantDimensions.length > 0) {
|
|
80
|
+
throw new Error(`normalizeVector() cannot scale constant dimension${constantDimensions.length === 1 ? "" : "s"} ${constantDimensions.join(", ")} in column ${q(sourceColumn)} because the range is zero. Remove ${constantDimensions.length === 1
|
|
81
|
+
? "that dimension"
|
|
82
|
+
: "those dimensions"} before normalizing. Conversion to DOUBLE can also collapse distinct large integers or decimals at its precision limit.`);
|
|
83
|
+
}
|
|
84
|
+
const value = `p.${q(prepared.vectorColumn)}[s.${dimension}]`;
|
|
85
|
+
const min = `s.${minimum}`;
|
|
86
|
+
const max = `s.${maximum}`;
|
|
87
|
+
// Dividing both sides by the larger magnitude when a range crosses zero
|
|
88
|
+
// avoids overflowing max - min for extreme finite DOUBLE values.
|
|
89
|
+
const scaled = `CASE
|
|
90
|
+
WHEN ${min} < 0 AND ${max} > 0 AND -${min} >= ${max}
|
|
91
|
+
THEN ((${value} / -${min}) + 1.0) / ((${max} / -${min}) + 1.0)
|
|
92
|
+
WHEN ${min} < 0 AND ${max} > 0
|
|
93
|
+
THEN ((${value} / ${max}) + (-${min} / ${max})) /
|
|
94
|
+
(1.0 + (-${min} / ${max}))
|
|
95
|
+
ELSE (${value} - ${min}) / (${max} - ${min})
|
|
96
|
+
END`;
|
|
97
|
+
await connection.run(`CREATE TEMP TABLE ${q(resultName)} AS
|
|
98
|
+
SELECT p.${q(prepared.rowIdColumn)},
|
|
99
|
+
list(${scaled} ORDER BY s.${dimension})::DOUBLE[${prepared.dimensions}]
|
|
100
|
+
AS ${q(normalized)}
|
|
101
|
+
FROM ${q(prepared.relation)} p CROSS JOIN ${q(statsName)} s
|
|
102
|
+
GROUP BY p.${q(prepared.rowIdColumn)}`);
|
|
103
|
+
}
|
|
104
|
+
const invalidResults = Number((await connection.runAndReadAll(`SELECT count(*) FROM ${q(resultName)}
|
|
105
|
+
WHERE ${q(normalized)} IS NULL
|
|
106
|
+
OR list_count(${q(normalized)}) != ${prepared.dimensions}
|
|
107
|
+
OR NOT list_bool_and(list_transform(${q(normalized)}, value -> isfinite(value)))
|
|
108
|
+
OR list_min(${q(normalized)}) < ${normalization === "rowL2" ? -1 : 0}
|
|
109
|
+
OR list_max(${q(normalized)}) > 1`)).getRowsJS()[0][0]);
|
|
110
|
+
if (invalidResults > 0) {
|
|
111
|
+
throw new Error(`normalizeVector() produced non-finite or out-of-range values for ${invalidResults} row${invalidResults === 1 ? "" : "s"}. Rescale the source values before normalizing.`);
|
|
112
|
+
}
|
|
113
|
+
await publishPreparedColumns(table, prepared, {
|
|
114
|
+
method: "normalizeVector()",
|
|
115
|
+
parameters: { column, newColumn, options },
|
|
116
|
+
result: {
|
|
117
|
+
relation: resultName,
|
|
118
|
+
rowIdColumn: prepared.rowIdColumn,
|
|
119
|
+
},
|
|
120
|
+
outputs: [{
|
|
121
|
+
name: overwrite ? sourceColumn : newColumn,
|
|
122
|
+
expression: `r.${q(normalized)}`,
|
|
123
|
+
replace: overwrite ? sourceColumn : undefined,
|
|
124
|
+
}],
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await connection.run(`DROP TABLE IF EXISTS ${q(resultName)}`);
|
|
129
|
+
await connection.run(`DROP TABLE IF EXISTS ${q(statsName)}`);
|
|
130
|
+
await prepared.cleanup();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type SimpleTable from "../class/SimpleTable.js";
|
|
2
|
+
import type { GraphId } from "../helpers/prepareGraphStarts.js";
|
|
3
|
+
import { type GraphTemporalOptions } from "../helpers/prepareGraphTemporalSql.js";
|
|
4
|
+
import type { GraphDirection } from "../helpers/prepareGraphTraversal.js";
|
|
5
|
+
type PathsOptions = GraphTemporalOptions & {
|
|
6
|
+
direction?: GraphDirection;
|
|
7
|
+
outputTable?: string | boolean;
|
|
8
|
+
weight?: string;
|
|
9
|
+
};
|
|
10
|
+
export default function paths(simpleTable: SimpleTable, sourceColumn: string, targetColumn: string, edgeId: string, start: GraphId, end: GraphId, options?: PathsOptions): SimpleTable;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/methods/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AASvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAgC,EAC9B,KAAK,oBAAoB,EAG1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAM1E,KAAK,YAAY,GAAG,oBAAoB,GAAG;IACzC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,KAAK,CAC3B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,YAAiB,GACzB,WAAW,CA+Gb"}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { prepareGraphRouteEndpoints, prepareGraphRouteSql, validateGraphRouteInputs, } from "../helpers/prepareGraphRouteSql.js";
|
|
2
|
+
import graphRouteResultSchema from "../helpers/graphRouteResultSchema.js";
|
|
3
|
+
import graphRouteResultSelect from "../helpers/graphRouteResultSelect.js";
|
|
4
|
+
import prepareGraphTemporalSql, { prepareGraphTemporalOptions, } from "../helpers/prepareGraphTemporalSql.js";
|
|
5
|
+
import queueGraphResult from "../helpers/queueGraphResult.js";
|
|
6
|
+
import quoteIdentifier from "../helpers/quoteIdentifier.js";
|
|
7
|
+
import validateGraphTemporalEvents from "../helpers/validateGraphTemporalEvents.js";
|
|
8
|
+
export default function paths(simpleTable, sourceColumn, targetColumn, edgeId, start, end, options = {}) {
|
|
9
|
+
if (typeof sourceColumn !== "string") {
|
|
10
|
+
throw new TypeError("paths() sourceColumn must be a string.");
|
|
11
|
+
}
|
|
12
|
+
if (typeof targetColumn !== "string") {
|
|
13
|
+
throw new TypeError("paths() targetColumn must be a string.");
|
|
14
|
+
}
|
|
15
|
+
if (typeof edgeId !== "string") {
|
|
16
|
+
throw new TypeError("paths() edgeId must be a string.");
|
|
17
|
+
}
|
|
18
|
+
if (options === null || typeof options !== "object" || Array.isArray(options)) {
|
|
19
|
+
throw new TypeError("paths() options must be an object.");
|
|
20
|
+
}
|
|
21
|
+
if (options.direction !== undefined &&
|
|
22
|
+
!["outgoing", "incoming", "both"].includes(options.direction)) {
|
|
23
|
+
throw new TypeError('paths() options.direction must be "outgoing", "incoming", or "both".');
|
|
24
|
+
}
|
|
25
|
+
if (options.weight !== undefined && typeof options.weight !== "string") {
|
|
26
|
+
throw new TypeError("paths() options.weight must be a string.");
|
|
27
|
+
}
|
|
28
|
+
if (options.outputTable !== undefined &&
|
|
29
|
+
typeof options.outputTable !== "string" &&
|
|
30
|
+
typeof options.outputTable !== "boolean") {
|
|
31
|
+
throw new TypeError("paths() options.outputTable must be a string or boolean.");
|
|
32
|
+
}
|
|
33
|
+
const endpoints = prepareGraphRouteEndpoints(start, end, "paths()");
|
|
34
|
+
const direction = options.direction ?? "outgoing";
|
|
35
|
+
const temporalOptions = prepareGraphTemporalOptions(options, direction, "paths()");
|
|
36
|
+
options = structuredClone(options);
|
|
37
|
+
const parameters = {
|
|
38
|
+
sourceColumn,
|
|
39
|
+
targetColumn,
|
|
40
|
+
edgeId,
|
|
41
|
+
start,
|
|
42
|
+
end,
|
|
43
|
+
options,
|
|
44
|
+
};
|
|
45
|
+
return queueGraphResult(simpleTable, {
|
|
46
|
+
method: "paths()",
|
|
47
|
+
parameters,
|
|
48
|
+
outputTable: options.outputTable,
|
|
49
|
+
preflight: temporalOptions === undefined
|
|
50
|
+
? undefined
|
|
51
|
+
: (input) => validateGraphTemporalEvents(input, temporalOptions, "paths()", parameters),
|
|
52
|
+
values: (schema) => {
|
|
53
|
+
validateGraphRouteInputs(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "paths()");
|
|
54
|
+
const temporal = temporalOptions === undefined
|
|
55
|
+
? undefined
|
|
56
|
+
: prepareGraphTemporalSql(schema, temporalOptions, "paths()");
|
|
57
|
+
return temporal === undefined
|
|
58
|
+
? endpoints.values.values
|
|
59
|
+
: [temporal.gapParameter, ...endpoints.values.values];
|
|
60
|
+
},
|
|
61
|
+
buildSelect: (input, schema) => pathsSelect(input, schema, sourceColumn, targetColumn, edgeId, endpoints, direction, options.weight, temporalOptions),
|
|
62
|
+
outputSchema: (schema) => {
|
|
63
|
+
const validated = validateGraphRouteInputs(schema, sourceColumn, targetColumn, edgeId, endpoints, options.weight, "paths()");
|
|
64
|
+
if (temporalOptions !== undefined) {
|
|
65
|
+
prepareGraphTemporalSql(schema, temporalOptions, "paths()");
|
|
66
|
+
}
|
|
67
|
+
return graphRouteResultSchema(schema, validated.distanceType, "paths()");
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function pathsSelect(input, schema, source, target, edgeId, routeEndpoints, direction, weight, temporalOptions) {
|
|
72
|
+
const route = prepareGraphRouteSql(input, schema, source, target, edgeId, routeEndpoints, weight, "paths()");
|
|
73
|
+
const prepared = route.traversal;
|
|
74
|
+
if (temporalOptions !== undefined) {
|
|
75
|
+
const temporal = prepareGraphTemporalSql(schema, temporalOptions, "paths()");
|
|
76
|
+
return temporalPathsSelect(route, direction, temporal);
|
|
77
|
+
}
|
|
78
|
+
const distanceType = route.distanceType;
|
|
79
|
+
const q = quoteIdentifier;
|
|
80
|
+
const relations = prepared.relationNames([
|
|
81
|
+
"graph_route_endpoints",
|
|
82
|
+
"graph_edges",
|
|
83
|
+
"graph_nodes",
|
|
84
|
+
"graph_to_end",
|
|
85
|
+
"graph_routes",
|
|
86
|
+
"graph_complete_routes",
|
|
87
|
+
"graph_ranked_routes",
|
|
88
|
+
]);
|
|
89
|
+
const endpointRelation = relations.graph_route_endpoints;
|
|
90
|
+
const edgesRelation = relations.graph_edges;
|
|
91
|
+
const nodesRelation = relations.graph_nodes;
|
|
92
|
+
const toEndRelation = relations.graph_to_end;
|
|
93
|
+
const routesRelation = relations.graph_routes;
|
|
94
|
+
const completeRelation = relations.graph_complete_routes;
|
|
95
|
+
const rankedRelation = relations.graph_ranked_routes;
|
|
96
|
+
const edgeFromKey = `${q("edges")}.${q("__from_key")}`;
|
|
97
|
+
const edgeToKey = `${q("edges")}.${q("__to_key")}`;
|
|
98
|
+
const edgeTo = `${q("edges")}.${q("__to")}`;
|
|
99
|
+
const edgeCost = `${q("edges")}.${q("__weight")}`;
|
|
100
|
+
const candidateDistance = `CAST(${q("routes")}.${q("distance")} + ${edgeCost} AS ${distanceType})`;
|
|
101
|
+
return `WITH RECURSIVE ${endpointRelation}(
|
|
102
|
+
${q("start")}, ${q("end")}, ${q("__start_key")}, ${q("__end_key")}
|
|
103
|
+
) AS (
|
|
104
|
+
SELECT ${q("start")}, ${q("end")},
|
|
105
|
+
${prepared.key(q("start"))}, ${prepared.key(q("end"))}
|
|
106
|
+
FROM (SELECT ${route.endpointValue} AS ${q("start")},
|
|
107
|
+
${route.endpointValue} AS ${q("end")}) AS ${q("values")}
|
|
108
|
+
), ${edgesRelation} AS (
|
|
109
|
+
${prepared.edges(direction, [
|
|
110
|
+
`${route.typedEdgeId} AS ${q("__edge_id")}`,
|
|
111
|
+
`${route.edgeKey} AS ${q("__edge_key")}`,
|
|
112
|
+
`${route.edgeWeight} AS ${q("__weight")}`,
|
|
113
|
+
])}
|
|
114
|
+
), ${nodesRelation} AS (
|
|
115
|
+
SELECT ${q("__from_key")} AS ${q("__key")} FROM ${edgesRelation}
|
|
116
|
+
UNION
|
|
117
|
+
SELECT ${q("__to_key")} AS ${q("__key")} FROM ${edgesRelation}
|
|
118
|
+
), ${toEndRelation}(${q("__key")}) AS (
|
|
119
|
+
SELECT ${q("__end_key")}
|
|
120
|
+
FROM ${endpointRelation}
|
|
121
|
+
INNER JOIN ${nodesRelation}
|
|
122
|
+
ON ${q("__end_key")} = ${q("__key")}
|
|
123
|
+
UNION
|
|
124
|
+
SELECT ${edgeFromKey}
|
|
125
|
+
FROM ${toEndRelation} AS ${q("reached")}
|
|
126
|
+
INNER JOIN ${edgesRelation} AS ${q("edges")}
|
|
127
|
+
ON ${q("reached")}.${q("__key")} = ${edgeToKey}
|
|
128
|
+
), ${routesRelation}(
|
|
129
|
+
${q("node")}, ${q("__node_key")}, ${q("__visited")},
|
|
130
|
+
${q("__edge_keys")}, ${q("steps")}, ${q("distance")}
|
|
131
|
+
) AS (
|
|
132
|
+
SELECT ${q("start")}, ${q("__start_key")},
|
|
133
|
+
[${q("__start_key")}], CAST([] AS ${route.keyType}[]),
|
|
134
|
+
CAST([] AS ${route.stepType}[]), CAST(0 AS ${distanceType})
|
|
135
|
+
FROM ${endpointRelation}
|
|
136
|
+
INNER JOIN ${toEndRelation}
|
|
137
|
+
ON ${q("__start_key")} = ${q("__key")}
|
|
138
|
+
UNION ALL
|
|
139
|
+
SELECT ${edgeTo}, ${edgeToKey},
|
|
140
|
+
list_append(${q("routes")}.${q("__visited")}, ${edgeToKey}),
|
|
141
|
+
list_append(${q("routes")}.${q("__edge_keys")}, ${q("edges")}.${q("__edge_key")}),
|
|
142
|
+
list_append(${q("routes")}.${q("steps")}, struct_pack(
|
|
143
|
+
${q("edgeId")} := ${q("edges")}.${q("__edge_id")},
|
|
144
|
+
${q("source")} := ${q("edges")}.${q("__from")},
|
|
145
|
+
${q("target")} := ${edgeTo},
|
|
146
|
+
${q("weight")} := ${edgeCost},
|
|
147
|
+
${q("distance")} := ${candidateDistance}
|
|
148
|
+
)), ${candidateDistance}
|
|
149
|
+
FROM ${routesRelation} AS ${q("routes")}
|
|
150
|
+
INNER JOIN ${edgesRelation} AS ${q("edges")}
|
|
151
|
+
ON ${q("routes")}.${q("__node_key")} = ${edgeFromKey}
|
|
152
|
+
INNER JOIN ${toEndRelation} AS ${q("can_reach_end")}
|
|
153
|
+
ON ${edgeToKey} = ${q("can_reach_end")}.${q("__key")}
|
|
154
|
+
CROSS JOIN ${endpointRelation}
|
|
155
|
+
WHERE ${q("routes")}.${q("__node_key")} <> ${q("__end_key")}
|
|
156
|
+
AND NOT list_contains(${q("routes")}.${q("__visited")}, ${edgeToKey})
|
|
157
|
+
), ${completeRelation} AS (
|
|
158
|
+
SELECT ${q("__edge_keys")}, ${q("steps")}
|
|
159
|
+
FROM ${routesRelation}
|
|
160
|
+
CROSS JOIN ${endpointRelation}
|
|
161
|
+
WHERE ${q("__node_key")} = ${q("__end_key")}
|
|
162
|
+
), ${rankedRelation} AS (
|
|
163
|
+
SELECT CAST(row_number() OVER (ORDER BY ${q("__edge_keys")}) - 1 AS BIGINT) AS ${q("pathId")},
|
|
164
|
+
${q("steps")}
|
|
165
|
+
FROM ${completeRelation}
|
|
166
|
+
)
|
|
167
|
+
${graphRouteResultSelect(rankedRelation, route.input, route.edgeIdColumn)}`;
|
|
168
|
+
}
|
|
169
|
+
function temporalPathsSelect(route, direction, temporal) {
|
|
170
|
+
const prepared = route.traversal;
|
|
171
|
+
const distanceType = route.distanceType;
|
|
172
|
+
const q = quoteIdentifier;
|
|
173
|
+
const relations = prepared.relationNames([
|
|
174
|
+
"graph_route_endpoints",
|
|
175
|
+
"graph_temporal_settings",
|
|
176
|
+
"graph_event_rows",
|
|
177
|
+
"graph_edges",
|
|
178
|
+
"graph_nodes",
|
|
179
|
+
"graph_to_end",
|
|
180
|
+
"graph_routes",
|
|
181
|
+
"graph_complete_routes",
|
|
182
|
+
"graph_ranked_routes",
|
|
183
|
+
]);
|
|
184
|
+
const endpointRelation = relations.graph_route_endpoints;
|
|
185
|
+
const settingsRelation = relations.graph_temporal_settings;
|
|
186
|
+
const eventRowsRelation = relations.graph_event_rows;
|
|
187
|
+
const edgesRelation = relations.graph_edges;
|
|
188
|
+
const nodesRelation = relations.graph_nodes;
|
|
189
|
+
const toEndRelation = relations.graph_to_end;
|
|
190
|
+
const routesRelation = relations.graph_routes;
|
|
191
|
+
const completeRelation = relations.graph_complete_routes;
|
|
192
|
+
const rankedRelation = relations.graph_ranked_routes;
|
|
193
|
+
const edgeFromKey = `${q("edges")}.${q("__from_key")}`;
|
|
194
|
+
const edgeToKey = `${q("edges")}.${q("__to_key")}`;
|
|
195
|
+
const edgeTo = `${q("edges")}.${q("__to")}`;
|
|
196
|
+
const edgeCost = `${q("edges")}.${q("__weight")}`;
|
|
197
|
+
const edgeKey = `${q("edges")}.${q("__edge_key")}`;
|
|
198
|
+
const candidateDistance = `CAST(${q("routes")}.${q("distance")} + ${edgeCost} AS ${distanceType})`;
|
|
199
|
+
const gap = `${q("settings")}.${q("__gap")}`;
|
|
200
|
+
const step = (distance) => `struct_pack(
|
|
201
|
+
${q("edgeId")} := ${q("edges")}.${q("__edge_id")},
|
|
202
|
+
${q("source")} := ${q("edges")}.${q("__from")},
|
|
203
|
+
${q("target")} := ${edgeTo},
|
|
204
|
+
${q("weight")} := ${edgeCost},
|
|
205
|
+
${q("distance")} := ${distance}
|
|
206
|
+
)`;
|
|
207
|
+
return `WITH RECURSIVE ${settingsRelation} AS MATERIALIZED (
|
|
208
|
+
SELECT CAST(? AS HUGEINT) AS ${q("__gap")}
|
|
209
|
+
), ${endpointRelation}(
|
|
210
|
+
${q("start")}, ${q("end")}, ${q("__start_key")}, ${q("__end_key")}
|
|
211
|
+
) AS (
|
|
212
|
+
SELECT ${q("start")}, ${q("end")},
|
|
213
|
+
${prepared.key(q("start"))}, ${prepared.key(q("end"))}
|
|
214
|
+
FROM (SELECT ${route.endpointValue} AS ${q("start")},
|
|
215
|
+
${route.endpointValue} AS ${q("end")}) AS ${q("values")}
|
|
216
|
+
), ${eventRowsRelation} AS MATERIALIZED (
|
|
217
|
+
${prepared.edges(direction, [
|
|
218
|
+
`${route.typedEdgeId} AS ${q("__edge_id")}`,
|
|
219
|
+
`${route.edgeKey} AS ${q("__edge_key")}`,
|
|
220
|
+
`${route.edgeWeight} AS ${q("__weight")}`,
|
|
221
|
+
...temporal.eventSelections("edges"),
|
|
222
|
+
])}
|
|
223
|
+
), ${edgesRelation} AS MATERIALIZED (
|
|
224
|
+
SELECT *
|
|
225
|
+
FROM ${eventRowsRelation} AS ${q("events")}
|
|
226
|
+
WHERE ${temporal.eventValidity("events")}
|
|
227
|
+
), ${nodesRelation} AS (
|
|
228
|
+
SELECT ${q("__from_key")} AS ${q("__key")} FROM ${edgesRelation}
|
|
229
|
+
UNION
|
|
230
|
+
SELECT ${q("__to_key")} AS ${q("__key")} FROM ${edgesRelation}
|
|
231
|
+
), ${toEndRelation}(${q("__key")}) AS (
|
|
232
|
+
SELECT ${q("__end_key")}
|
|
233
|
+
FROM ${endpointRelation}
|
|
234
|
+
INNER JOIN ${nodesRelation}
|
|
235
|
+
ON ${q("__end_key")} = ${q("__key")}
|
|
236
|
+
UNION
|
|
237
|
+
SELECT ${edgeFromKey}
|
|
238
|
+
FROM ${toEndRelation} AS ${q("reached")}
|
|
239
|
+
INNER JOIN ${edgesRelation} AS ${q("edges")}
|
|
240
|
+
ON ${q("reached")}.${q("__key")} = ${edgeToKey}
|
|
241
|
+
), ${routesRelation}(
|
|
242
|
+
${q("node")}, ${q("__node_key")}, ${q("__visited")},
|
|
243
|
+
${q("__edge_keys")}, ${q("steps")}, ${q("distance")},
|
|
244
|
+
${q("__event_id")}, ${q("__event_start")}, ${q("__event_end")}
|
|
245
|
+
) AS (
|
|
246
|
+
SELECT ${edgeTo}, ${edgeToKey},
|
|
247
|
+
[${q("__start_key")}, ${edgeToKey}], [${edgeKey}],
|
|
248
|
+
[${step(edgeCost)}], ${edgeCost},
|
|
249
|
+
${q("edges")}.${q("__event_id")},
|
|
250
|
+
${q("edges")}.${q("__event_start")},
|
|
251
|
+
${q("edges")}.${q("__event_end")}
|
|
252
|
+
FROM ${endpointRelation}
|
|
253
|
+
INNER JOIN ${edgesRelation} AS ${q("edges")}
|
|
254
|
+
ON ${q("__start_key")} = ${edgeFromKey}
|
|
255
|
+
INNER JOIN ${toEndRelation} AS ${q("can_reach_end")}
|
|
256
|
+
ON ${edgeToKey} = ${q("can_reach_end")}.${q("__key")}
|
|
257
|
+
WHERE ${q("__start_key")} <> ${edgeToKey}
|
|
258
|
+
UNION ALL
|
|
259
|
+
SELECT ${edgeTo}, ${edgeToKey},
|
|
260
|
+
list_append(${q("routes")}.${q("__visited")}, ${edgeToKey}),
|
|
261
|
+
list_append(${q("routes")}.${q("__edge_keys")}, ${edgeKey}),
|
|
262
|
+
list_append(${q("routes")}.${q("steps")}, ${step(candidateDistance)}),
|
|
263
|
+
${candidateDistance}, ${q("edges")}.${q("__event_id")},
|
|
264
|
+
${q("edges")}.${q("__event_start")},
|
|
265
|
+
${q("edges")}.${q("__event_end")}
|
|
266
|
+
FROM ${routesRelation} AS ${q("routes")}
|
|
267
|
+
INNER JOIN ${edgesRelation} AS ${q("edges")}
|
|
268
|
+
ON ${q("routes")}.${q("__node_key")} = ${edgeFromKey}
|
|
269
|
+
INNER JOIN ${toEndRelation} AS ${q("can_reach_end")}
|
|
270
|
+
ON ${edgeToKey} = ${q("can_reach_end")}.${q("__key")}
|
|
271
|
+
CROSS JOIN ${endpointRelation}
|
|
272
|
+
CROSS JOIN ${settingsRelation} AS ${q("settings")}
|
|
273
|
+
WHERE ${q("routes")}.${q("__node_key")} <> ${q("__end_key")}
|
|
274
|
+
AND NOT list_contains(${q("routes")}.${q("__visited")}, ${edgeToKey})
|
|
275
|
+
AND ${temporal.transition("routes", "edges", direction, gap)}
|
|
276
|
+
), ${completeRelation} AS (
|
|
277
|
+
SELECT ${q("__edge_keys")}, ${q("steps")}
|
|
278
|
+
FROM ${routesRelation}
|
|
279
|
+
CROSS JOIN ${endpointRelation}
|
|
280
|
+
WHERE ${q("__node_key")} = ${q("__end_key")}
|
|
281
|
+
), ${rankedRelation} AS (
|
|
282
|
+
SELECT CAST(row_number() OVER (ORDER BY ${q("__edge_keys")}) - 1 AS BIGINT)
|
|
283
|
+
AS ${q("pathId")}, ${q("steps")}
|
|
284
|
+
FROM ${completeRelation}
|
|
285
|
+
)
|
|
286
|
+
${graphRouteResultSelect(rankedRelation, route.input, route.edgeIdColumn)}`;
|
|
287
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type SimpleTable from "../class/SimpleTable.js";
|
|
2
|
+
import { type GraphTemporalOptions } from "../helpers/prepareGraphTemporalSql.js";
|
|
3
|
+
import { type GraphId } from "../helpers/prepareGraphStarts.js";
|
|
4
|
+
import { type GraphDirection } from "../helpers/prepareGraphTraversal.js";
|
|
5
|
+
type ReachableOptions = GraphTemporalOptions & {
|
|
6
|
+
direction?: GraphDirection;
|
|
7
|
+
outputTable?: string | boolean;
|
|
8
|
+
};
|
|
9
|
+
export default function reachable(simpleTable: SimpleTable, sourceColumn: string, targetColumn: string, startNodes: GraphId | GraphId[], options?: ReachableOptions): SimpleTable;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=reachable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reachable.d.ts","sourceRoot":"","sources":["../../src/methods/reachable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAGvD,OAAgC,EAC9B,KAAK,oBAAoB,EAG1B,MAAM,uCAAuC,CAAC;AAC/C,OAA2B,EACzB,KAAK,OAAO,EAEb,MAAM,kCAAkC,CAAC;AAC1C,OAA8B,EAC5B,KAAK,cAAc,EAEpB,MAAM,qCAAqC,CAAC;AAK7C,KAAK,gBAAgB,GAAG,oBAAoB,GAAG;IAC7C,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,OAAO,GAAG,OAAO,EAAE,EAC/B,OAAO,GAAE,gBAAqB,GAC7B,WAAW,CAkGb"}
|