@deck.gl-community/graph-layers 9.2.0-beta.2 → 9.2.0-beta.3

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.
Files changed (232) hide show
  1. package/dist/core/graph-engine.d.ts +63 -21
  2. package/dist/core/graph-engine.d.ts.map +1 -1
  3. package/dist/core/graph-engine.js +155 -75
  4. package/dist/core/graph-engine.js.map +1 -1
  5. package/dist/core/graph-layout.d.ts +22 -18
  6. package/dist/core/graph-layout.d.ts.map +1 -1
  7. package/dist/core/graph-layout.js +33 -18
  8. package/dist/core/graph-layout.js.map +1 -1
  9. package/dist/core/interaction-manager.d.ts +2 -2
  10. package/dist/core/interaction-manager.d.ts.map +1 -1
  11. package/dist/core/interaction-manager.js +7 -5
  12. package/dist/core/interaction-manager.js.map +1 -1
  13. package/dist/graph/arrow-graph.d.ts +69 -0
  14. package/dist/graph/arrow-graph.d.ts.map +1 -0
  15. package/dist/graph/arrow-graph.js +513 -0
  16. package/dist/graph/arrow-graph.js.map +1 -0
  17. package/dist/graph/classic-graph.d.ts +169 -0
  18. package/dist/graph/classic-graph.d.ts.map +1 -0
  19. package/dist/graph/classic-graph.js +390 -0
  20. package/dist/graph/classic-graph.js.map +1 -0
  21. package/dist/graph/edge.d.ts +6 -6
  22. package/dist/graph/edge.d.ts.map +1 -1
  23. package/dist/graph/edge.js.map +1 -1
  24. package/dist/graph/functions/arrow-utils.d.ts +6 -0
  25. package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
  26. package/dist/graph/functions/arrow-utils.js +67 -0
  27. package/dist/graph/functions/arrow-utils.js.map +1 -0
  28. package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
  29. package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
  30. package/dist/graph/functions/create-graph-from-data.js +12 -0
  31. package/dist/graph/functions/create-graph-from-data.js.map +1 -0
  32. package/dist/graph/graph-normalization.d.ts +10 -0
  33. package/dist/graph/graph-normalization.d.ts.map +1 -0
  34. package/dist/graph/graph-normalization.js +65 -0
  35. package/dist/graph/graph-normalization.js.map +1 -0
  36. package/dist/graph/graph.d.ts +62 -155
  37. package/dist/graph/graph.d.ts.map +1 -1
  38. package/dist/graph/graph.js +11 -300
  39. package/dist/graph/graph.js.map +1 -1
  40. package/dist/graph/node.d.ts +6 -6
  41. package/dist/graph/node.d.ts.map +1 -1
  42. package/dist/graph/node.js +2 -2
  43. package/dist/graph/node.js.map +1 -1
  44. package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
  45. package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
  46. package/dist/graph-data/arrow-graph-data-builder.js +105 -0
  47. package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
  48. package/dist/graph-data/graph-data-builder.d.ts +6 -0
  49. package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
  50. package/dist/graph-data/graph-data-builder.js +1 -0
  51. package/dist/graph-data/graph-data-builder.js.map +1 -0
  52. package/dist/graph-data/graph-data.d.ts +40 -0
  53. package/dist/graph-data/graph-data.d.ts.map +1 -0
  54. package/dist/graph-data/graph-data.js +11 -0
  55. package/dist/graph-data/graph-data.js.map +1 -0
  56. package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
  57. package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
  58. package/dist/graph-data/plain-graph-data-builder.js +105 -0
  59. package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
  60. package/dist/graph-style-schema.cdn.js +1 -1
  61. package/dist/graph-style-schema.json +1 -1
  62. package/dist/index.cjs +6905 -4576
  63. package/dist/index.cjs.map +4 -4
  64. package/dist/index.d.ts +14 -7
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +24 -11
  67. package/dist/index.js.map +1 -1
  68. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
  69. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -2
  70. package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
  71. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
  72. package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
  73. package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
  74. package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
  75. package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
  76. package/dist/layers/edge-attachment-helper.js +1 -2
  77. package/dist/layers/edge-attachment-helper.js.map +1 -1
  78. package/dist/layers/graph-layer.d.ts +68 -11
  79. package/dist/layers/graph-layer.d.ts.map +1 -1
  80. package/dist/layers/graph-layer.js +435 -50
  81. package/dist/layers/graph-layer.js.map +1 -1
  82. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
  83. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
  84. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
  85. package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
  86. package/dist/layouts/d3-dag/d3-dag-layout.d.ts +46 -61
  87. package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
  88. package/dist/layouts/d3-dag/d3-dag-layout.js +85 -270
  89. package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
  90. package/dist/layouts/d3-force/d3-force-layout.d.ts +20 -8
  91. package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
  92. package/dist/layouts/d3-force/d3-force-layout.js +39 -20
  93. package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
  94. package/dist/layouts/experimental/force-multi-graph-layout.d.ts +19 -15
  95. package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
  96. package/dist/layouts/experimental/force-multi-graph-layout.js +47 -38
  97. package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
  98. package/dist/layouts/experimental/hive-plot-layout.d.ts +18 -15
  99. package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
  100. package/dist/layouts/experimental/hive-plot-layout.js +33 -34
  101. package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
  102. package/dist/layouts/experimental/radial-layout.d.ts +12 -7
  103. package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
  104. package/dist/layouts/experimental/radial-layout.js +31 -14
  105. package/dist/layouts/experimental/radial-layout.js.map +1 -1
  106. package/dist/layouts/gpu-force/gpu-force-layout.d.ts +11 -8
  107. package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
  108. package/dist/layouts/gpu-force/gpu-force-layout.js +59 -56
  109. package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
  110. package/dist/layouts/simple-layout.d.ts +8 -25
  111. package/dist/layouts/simple-layout.d.ts.map +1 -1
  112. package/dist/layouts/simple-layout.js +13 -17
  113. package/dist/layouts/simple-layout.js.map +1 -1
  114. package/dist/loaders/dot-graph-loader.d.ts +25 -0
  115. package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
  116. package/dist/loaders/dot-graph-loader.js +668 -0
  117. package/dist/loaders/dot-graph-loader.js.map +1 -0
  118. package/dist/loaders/json-graph-loader.d.ts +6 -0
  119. package/dist/loaders/json-graph-loader.d.ts.map +1 -0
  120. package/dist/loaders/json-graph-loader.js +31 -0
  121. package/dist/loaders/json-graph-loader.js.map +1 -0
  122. package/dist/loaders/{edge-parsers.d.ts → parsers/edge-parsers.d.ts} +1 -1
  123. package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
  124. package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +1 -1
  125. package/dist/loaders/parsers/edge-parsers.js.map +1 -0
  126. package/dist/loaders/{node-parsers.d.ts → parsers/node-parsers.d.ts} +1 -1
  127. package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
  128. package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +1 -1
  129. package/dist/loaders/parsers/node-parsers.js.map +1 -0
  130. package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
  131. package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
  132. package/dist/loaders/parsers/parse-json-graph.js +78 -0
  133. package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
  134. package/dist/style/graph-style-engine.d.ts +4 -2
  135. package/dist/style/graph-style-engine.d.ts.map +1 -1
  136. package/dist/style/graph-style-engine.js +3 -2
  137. package/dist/style/graph-style-engine.js.map +1 -1
  138. package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +3 -3
  139. package/dist/style/stylesheet-engine.d.ts.map +1 -0
  140. package/dist/style/{style-engine.js → stylesheet-engine.js} +1 -1
  141. package/dist/style/stylesheet-engine.js.map +1 -0
  142. package/dist/utils/collapsed-chains.d.ts +8 -8
  143. package/dist/utils/collapsed-chains.d.ts.map +1 -1
  144. package/dist/utils/collapsed-chains.js +1 -6
  145. package/dist/utils/collapsed-chains.js.map +1 -1
  146. package/dist/utils/rank-grid.d.ts +30 -0
  147. package/dist/utils/rank-grid.d.ts.map +1 -0
  148. package/dist/utils/rank-grid.js +306 -0
  149. package/dist/utils/rank-grid.js.map +1 -0
  150. package/package.json +4 -8
  151. package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
  152. package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
  153. package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
  154. package/src/core/graph-engine.ts +201 -84
  155. package/src/core/graph-layout.ts +52 -29
  156. package/src/core/interaction-manager.ts +20 -20
  157. package/src/graph/arrow-graph.ts +648 -0
  158. package/src/graph/classic-graph.ts +447 -0
  159. package/src/graph/edge.ts +7 -7
  160. package/src/graph/functions/arrow-utils.ts +72 -0
  161. package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
  162. package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
  163. package/src/graph/functions/create-graph-from-data.ts +16 -0
  164. package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
  165. package/src/graph/graph-normalization.ts +87 -0
  166. package/src/graph/graph.ts +68 -339
  167. package/src/graph/node.ts +9 -9
  168. package/src/graph/tabular-graph.ts.disabled +761 -0
  169. package/src/graph-data/arrow-graph-data-builder.ts +165 -0
  170. package/src/graph-data/graph-data-builder.ts +7 -0
  171. package/src/graph-data/graph-data.ts +57 -0
  172. package/src/graph-data/plain-graph-data-builder.ts +132 -0
  173. package/src/index.ts +53 -13
  174. package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
  175. package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
  176. package/src/layers/edge-attachment-helper.ts +22 -16
  177. package/src/layers/graph-layer.ts +642 -62
  178. package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
  179. package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
  180. package/src/layouts/d3-force/d3-force-layout.ts +52 -30
  181. package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
  182. package/src/layouts/experimental/hive-plot-layout.ts +41 -42
  183. package/src/layouts/experimental/radial-layout.ts +39 -20
  184. package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
  185. package/src/layouts/simple-layout.ts +20 -44
  186. package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
  187. package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
  188. package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
  189. package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
  190. package/src/loaders/dot-graph-loader.ts +860 -0
  191. package/src/loaders/json-graph-loader.ts +48 -0
  192. package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
  193. package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
  194. package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
  195. package/src/loaders/parsers/parse-json-graph.ts +134 -0
  196. package/src/style/graph-style-engine.ts +5 -2
  197. package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
  198. package/src/utils/collapsed-chains.ts +11 -17
  199. package/src/utils/rank-grid.ts +426 -0
  200. package/dist/loaders/create-graph.d.ts +0 -12
  201. package/dist/loaders/create-graph.d.ts.map +0 -1
  202. package/dist/loaders/create-graph.js +0 -38
  203. package/dist/loaders/create-graph.js.map +0 -1
  204. package/dist/loaders/edge-parsers.d.ts.map +0 -1
  205. package/dist/loaders/edge-parsers.js.map +0 -1
  206. package/dist/loaders/json-loader.d.ts +0 -7
  207. package/dist/loaders/json-loader.d.ts.map +0 -1
  208. package/dist/loaders/json-loader.js +0 -16
  209. package/dist/loaders/json-loader.js.map +0 -1
  210. package/dist/loaders/node-parsers.d.ts.map +0 -1
  211. package/dist/loaders/node-parsers.js.map +0 -1
  212. package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
  213. package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
  214. package/dist/loaders/simple-json-graph-loader.js +0 -20
  215. package/dist/loaders/simple-json-graph-loader.js.map +0 -1
  216. package/dist/loaders/table-graph-loader.d.ts +0 -16
  217. package/dist/loaders/table-graph-loader.d.ts.map +0 -1
  218. package/dist/loaders/table-graph-loader.js +0 -91
  219. package/dist/loaders/table-graph-loader.js.map +0 -1
  220. package/dist/style/style-engine.d.ts.map +0 -1
  221. package/dist/style/style-engine.js.map +0 -1
  222. package/dist/widgets/long-press-button.d.ts +0 -12
  223. package/dist/widgets/long-press-button.d.ts.map +0 -1
  224. package/dist/widgets/long-press-button.js +0 -31
  225. package/dist/widgets/long-press-button.js.map +0 -1
  226. package/dist/widgets/view-control-widget.d.ts +0 -77
  227. package/dist/widgets/view-control-widget.d.ts.map +0 -1
  228. package/dist/widgets/view-control-widget.js +0 -197
  229. package/dist/widgets/view-control-widget.js.map +0 -1
  230. package/src/loaders/json-loader.ts +0 -19
  231. package/src/widgets/long-press-button.tsx +0 -50
  232. package/src/widgets/view-control-widget.tsx +0 -339
@@ -0,0 +1,119 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {ArrowGraph} from '../arrow-graph';
6
+ import type {ArrowGraphDataBuilderOptions} from '../../graph-data/arrow-graph-data-builder';
7
+ import {ArrowGraphDataBuilder} from '../../graph-data/arrow-graph-data-builder';
8
+ import type {TabularGraph, TabularNode, TabularEdge} from '../tabular-graph';
9
+
10
+ const NODE_ATTRIBUTE_KEYS_TO_REMOVE = [
11
+ 'id',
12
+ 'state',
13
+ 'selectable',
14
+ 'highlightConnectedEdges',
15
+ 'label',
16
+ 'weight'
17
+ ] as const;
18
+
19
+ const EDGE_ATTRIBUTE_KEYS_TO_REMOVE = [
20
+ 'id',
21
+ 'sourceId',
22
+ 'targetId',
23
+ 'directed',
24
+ 'state',
25
+ 'label',
26
+ 'weight'
27
+ ] as const;
28
+
29
+ type SanitizedNodeData = {
30
+ label?: string;
31
+ weight?: number;
32
+ attributes: Record<string, unknown>;
33
+ };
34
+
35
+ type SanitizedEdgeData = {
36
+ label?: string;
37
+ weight?: number;
38
+ attributes: Record<string, unknown>;
39
+ };
40
+
41
+ export type ConvertTabularGraphToArrowGraphOptions = ArrowGraphDataBuilderOptions;
42
+
43
+ export function convertTabularGraphToArrowGraph(
44
+ tabularGraph: TabularGraph,
45
+ options?: ConvertTabularGraphToArrowGraphOptions
46
+ ): ArrowGraph {
47
+ const builder = new ArrowGraphDataBuilder({
48
+ ...options,
49
+ version: options?.version ?? tabularGraph.version
50
+ });
51
+
52
+ for (const node of tabularGraph.getNodes() as Iterable<TabularNode>) {
53
+ const {label, weight, attributes} = sanitizeNodeData(
54
+ tabularGraph.getNodeDataByIndex(node.index)
55
+ );
56
+
57
+ builder.addNode({
58
+ id: node.getId(),
59
+ state: node.getState(),
60
+ selectable: node.isSelectable(),
61
+ highlightConnectedEdges: node.shouldHighlightConnectedEdges(),
62
+ label,
63
+ weight,
64
+ attributes
65
+ });
66
+ }
67
+
68
+ for (const edge of tabularGraph.getEdges() as Iterable<TabularEdge>) {
69
+ const {label, weight, attributes} = sanitizeEdgeData(
70
+ tabularGraph.getEdgeDataByIndex(edge.index)
71
+ );
72
+
73
+ builder.addEdge({
74
+ id: edge.getId(),
75
+ sourceId: edge.getSourceNodeId(),
76
+ targetId: edge.getTargetNodeId(),
77
+ directed: edge.isDirected(),
78
+ state: edge.getState(),
79
+ label,
80
+ weight,
81
+ attributes
82
+ });
83
+ }
84
+
85
+ return new ArrowGraph({...tabularGraph.props, data: builder.finish()});
86
+ }
87
+
88
+ function sanitizeNodeData(data: Record<string, unknown>): SanitizedNodeData {
89
+ const rawLabel = data.label;
90
+ const label = typeof rawLabel === 'string' ? rawLabel : undefined;
91
+ const rawWeight = data.weight;
92
+ const weight = typeof rawWeight === 'number' ? rawWeight : undefined;
93
+ const attributes = pruneAttributes(data, NODE_ATTRIBUTE_KEYS_TO_REMOVE);
94
+
95
+ return {label, weight, attributes};
96
+ }
97
+
98
+ function sanitizeEdgeData(data: Record<string, unknown>): SanitizedEdgeData {
99
+ const rawLabel = data.label;
100
+ const label = typeof rawLabel === 'string' ? rawLabel : undefined;
101
+ const rawWeight = data.weight;
102
+ const weight = typeof rawWeight === 'number' ? rawWeight : undefined;
103
+ const attributes = pruneAttributes(data, EDGE_ATTRIBUTE_KEYS_TO_REMOVE);
104
+
105
+ return {label, weight, attributes};
106
+ }
107
+
108
+ function pruneAttributes(
109
+ source: Record<string, unknown>,
110
+ keysToRemove: readonly string[]
111
+ ): Record<string, unknown> {
112
+ const attributes = {...source};
113
+ for (const key of keysToRemove) {
114
+ if (key in attributes) {
115
+ delete attributes[key];
116
+ }
117
+ }
118
+ return attributes;
119
+ }
@@ -0,0 +1,16 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {Graph, GraphProps} from '../graph';
6
+ import {type GraphData, isArrowGraphData} from '../../graph-data/graph-data';
7
+ import {ArrowGraph} from '../arrow-graph';
8
+ import {ClassicGraph} from '../classic-graph';
9
+
10
+ export function createGraphFromData(data: GraphData, props: GraphProps = {}): Graph {
11
+ if (isArrowGraphData(data)) {
12
+ return new ArrowGraph({...props, data});
13
+ }
14
+
15
+ return new ClassicGraph({...props, data});
16
+ }
@@ -0,0 +1,176 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {NodeState, EdgeState} from '../core/constants';
6
+ import type {PlainGraphData} from '../graph-data/graph-data';
7
+ import {PlainGraphDataBuilder} from '../graph-data/plain-graph-data-builder';
8
+ import {
9
+ normalizeBooleanColumn,
10
+ normalizeDataColumn,
11
+ normalizeEdgeStateColumn,
12
+ normalizeNodeStateColumn,
13
+ normalizeVersion
14
+ } from './graph-normalization';
15
+ import type {
16
+ TabularGraphSource,
17
+ TabularNodeAccessors,
18
+ TabularEdgeAccessors
19
+ } from './tabular-graph';
20
+ import {TabularGraph} from './tabular-graph';
21
+
22
+ export function createTabularGraphFromData(data: PlainGraphData): TabularGraph {
23
+ const builder = new PlainGraphDataBuilder({
24
+ // @ts-expect-error TODO: fixme
25
+ nodeCapacity: Array.isArray(data.nodes) ? data.nodes.length : 0,
26
+ edgeCapacity: Array.isArray(data.edges) ? data.edges.length : 0,
27
+ version: data.version
28
+ });
29
+
30
+ if (Array.isArray(data.nodes)) {
31
+ for (const node of data.nodes) {
32
+ builder.addNode(node);
33
+ }
34
+ }
35
+
36
+ if (Array.isArray(data.edges)) {
37
+ for (const edge of data.edges) {
38
+ builder.addEdge(edge);
39
+ }
40
+ }
41
+
42
+ return createTabularGraphFromColumnarData(builder.build());
43
+ }
44
+
45
+ type NodeHandle = number;
46
+ type EdgeHandle = number;
47
+
48
+ type NormalizedNodeColumns = {
49
+ id: (string | number)[];
50
+ state: NodeState[];
51
+ selectable: boolean[];
52
+ highlightConnectedEdges: boolean[];
53
+ data: Record<string, unknown>[];
54
+ };
55
+
56
+ type NormalizedEdgeColumns = {
57
+ id: (string | number)[];
58
+ sourceId: (string | number)[];
59
+ targetId: (string | number)[];
60
+ directed: boolean[];
61
+ state: EdgeState[];
62
+ data: Record<string, unknown>[];
63
+ };
64
+
65
+ function createTabularGraphFromColumnarData(data: ColumnarGraphColumns): TabularGraph {
66
+ const version = normalizeVersion(data.version);
67
+ const nodes = normalizeNodeColumns(data.nodes);
68
+ const edges = normalizeEdgeColumns(data.edges);
69
+
70
+ const nodeCount = nodes.id.length;
71
+ const edgeCount = edges.id.length;
72
+
73
+ const nodeHandles = createIndexArray(nodeCount);
74
+ const edgeHandles = createIndexArray(edgeCount);
75
+
76
+ const nodeIndexById = new Map<string | number, NodeHandle>();
77
+ for (let i = 0; i < nodeCount; i++) {
78
+ nodeIndexById.set(nodes.id[i], i);
79
+ }
80
+
81
+ const nodeAccessors: TabularNodeAccessors<NodeHandle> = {
82
+ getId: (handle) => nodes.id[handle],
83
+ getState: (handle) => nodes.state[handle],
84
+ setState: (handle, state) => {
85
+ nodes.state[handle] = state;
86
+ },
87
+ isSelectable: (handle) => nodes.selectable[handle],
88
+ shouldHighlightConnectedEdges: (handle) => nodes.highlightConnectedEdges[handle],
89
+ getPropertyValue: (handle, key) => nodes.data[handle]?.[key],
90
+ setData: (handle, value) => {
91
+ nodes.data[handle] = {...value};
92
+ },
93
+ setDataProperty: (handle, key, value) => {
94
+ const record = nodes.data[handle] ?? {};
95
+ record[key] = value;
96
+ nodes.data[handle] = record;
97
+ },
98
+ getData: (handle) => nodes.data[handle]
99
+ };
100
+
101
+ const edgeAccessors: TabularEdgeAccessors<EdgeHandle> = {
102
+ getId: (handle) => edges.id[handle],
103
+ getSourceId: (handle) => edges.sourceId[handle],
104
+ getTargetId: (handle) => edges.targetId[handle],
105
+ isDirected: (handle) => edges.directed[handle],
106
+ getState: (handle) => edges.state[handle],
107
+ setState: (handle, state) => {
108
+ edges.state[handle] = state;
109
+ },
110
+ getPropertyValue: (handle, key) => edges.data[handle]?.[key],
111
+ setData: (handle, value) => {
112
+ edges.data[handle] = {...value};
113
+ },
114
+ setDataProperty: (handle, key, value) => {
115
+ const record = edges.data[handle] ?? {};
116
+ record[key] = value;
117
+ edges.data[handle] = record;
118
+ },
119
+ getData: (handle) => edges.data[handle]
120
+ };
121
+
122
+ const accessors = {node: nodeAccessors, edge: edgeAccessors};
123
+
124
+ const source: TabularGraphSource<NodeHandle, EdgeHandle> = {
125
+ version,
126
+ getNodes: () => nodeHandles,
127
+ getEdges: () => edgeHandles,
128
+ getAccessors: () => accessors,
129
+ findNodeById: (id) => nodeIndexById.get(id)
130
+ };
131
+
132
+ return new TabularGraph(source);
133
+ }
134
+
135
+ function normalizeNodeColumns(columns: ColumnarGraphNodeColumns): NormalizedNodeColumns {
136
+ const id = Array.isArray(columns.id) ? columns.id.slice() : [];
137
+ const length = id.length;
138
+
139
+ return {
140
+ id,
141
+ state: normalizeNodeStateColumn(columns.state, length),
142
+ selectable: normalizeBooleanColumn(columns.selectable, length, false),
143
+ highlightConnectedEdges: normalizeBooleanColumn(columns.highlightConnectedEdges, length, false),
144
+ data: normalizeDataColumn(columns.data, length)
145
+ };
146
+ }
147
+
148
+ function normalizeEdgeColumns(columns: ColumnarGraphEdgeColumns): NormalizedEdgeColumns {
149
+ const id = Array.isArray(columns.id) ? columns.id.slice() : [];
150
+ const length = id.length;
151
+
152
+ if (!Array.isArray(columns.sourceId) || columns.sourceId.length !== length) {
153
+ throw new Error('Columnar graph edge data requires a sourceId column matching the id column length.');
154
+ }
155
+
156
+ if (!Array.isArray(columns.targetId) || columns.targetId.length !== length) {
157
+ throw new Error('Columnar graph edge data requires a targetId column matching the id column length.');
158
+ }
159
+
160
+ return {
161
+ id,
162
+ sourceId: columns.sourceId.slice(0, length),
163
+ targetId: columns.targetId.slice(0, length),
164
+ directed: normalizeBooleanColumn(columns.directed, length, false),
165
+ state: normalizeEdgeStateColumn(columns.state, length),
166
+ data: normalizeDataColumn(columns.data, length)
167
+ };
168
+ }
169
+
170
+ function createIndexArray(length: number): number[] {
171
+ const handles: number[] = new Array(length);
172
+ for (let i = 0; i < length; i++) {
173
+ handles[i] = i;
174
+ }
175
+ return handles;
176
+ }
@@ -0,0 +1,87 @@
1
+ // deck.gl-community
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {NodeState, EdgeState} from '../core/constants';
6
+
7
+ const NODE_STATES: ReadonlySet<NodeState> = new Set(['default', 'hover', 'dragging', 'selected']);
8
+ const EDGE_STATES: ReadonlySet<EdgeState> = new Set(['default', 'hover', 'dragging', 'selected']);
9
+
10
+ export function normalizeNodeState(state: NodeState | undefined): NodeState {
11
+ if (state && NODE_STATES.has(state)) {
12
+ return state;
13
+ }
14
+ return 'default';
15
+ }
16
+
17
+ export function normalizeEdgeState(state: EdgeState | undefined): EdgeState {
18
+ if (state && EDGE_STATES.has(state)) {
19
+ return state;
20
+ }
21
+ return 'default';
22
+ }
23
+
24
+ export function normalizeNodeStateColumn(source: NodeState[] | undefined, length: number): NodeState[] {
25
+ const result: NodeState[] = new Array(length);
26
+ for (let i = 0; i < length; i++) {
27
+ result[i] = normalizeNodeState(source?.[i]);
28
+ }
29
+ return result;
30
+ }
31
+
32
+ export function normalizeEdgeStateColumn(source: EdgeState[] | undefined, length: number): EdgeState[] {
33
+ const result: EdgeState[] = new Array(length);
34
+ for (let i = 0; i < length; i++) {
35
+ result[i] = normalizeEdgeState(source?.[i]);
36
+ }
37
+ return result;
38
+ }
39
+
40
+ export function normalizeBooleanColumn(
41
+ source: boolean[] | undefined,
42
+ length: number,
43
+ fallback: boolean
44
+ ): boolean[] {
45
+ const result: boolean[] = new Array(length);
46
+ for (let i = 0; i < length; i++) {
47
+ const candidate = source?.[i];
48
+ result[i] = typeof candidate === 'boolean' ? candidate : fallback;
49
+ }
50
+ return result;
51
+ }
52
+
53
+ export function normalizeDataColumn(
54
+ source: Record<string, unknown>[] | undefined,
55
+ length: number
56
+ ): Record<string, unknown>[] {
57
+ const result: Record<string, unknown>[] = new Array(length);
58
+ for (let i = 0; i < length; i++) {
59
+ result[i] = cloneRecord(source?.[i]);
60
+ }
61
+ return result;
62
+ }
63
+
64
+ export function normalizeVersion(version: unknown): number {
65
+ if (typeof version === 'number' && Number.isFinite(version)) {
66
+ return version;
67
+ }
68
+ return 0;
69
+ }
70
+
71
+ export function cloneRecord(value: unknown): Record<string, unknown> {
72
+ if (value && typeof value === 'object') {
73
+ return {...(value as Record<string, unknown>)};
74
+ }
75
+ return {};
76
+ }
77
+
78
+ export function cloneDataColumn(
79
+ source: Record<string, unknown>[],
80
+ length: number
81
+ ): Record<string, unknown>[] {
82
+ const result: Record<string, unknown>[] = new Array(length);
83
+ for (let i = 0; i < length; i++) {
84
+ result[i] = cloneRecord(source[i]);
85
+ }
86
+ return result;
87
+ }