@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.
- package/dist/core/graph-engine.d.ts +63 -21
- package/dist/core/graph-engine.d.ts.map +1 -1
- package/dist/core/graph-engine.js +155 -75
- package/dist/core/graph-engine.js.map +1 -1
- package/dist/core/graph-layout.d.ts +22 -18
- package/dist/core/graph-layout.d.ts.map +1 -1
- package/dist/core/graph-layout.js +33 -18
- package/dist/core/graph-layout.js.map +1 -1
- package/dist/core/interaction-manager.d.ts +2 -2
- package/dist/core/interaction-manager.d.ts.map +1 -1
- package/dist/core/interaction-manager.js +7 -5
- package/dist/core/interaction-manager.js.map +1 -1
- package/dist/graph/arrow-graph.d.ts +69 -0
- package/dist/graph/arrow-graph.d.ts.map +1 -0
- package/dist/graph/arrow-graph.js +513 -0
- package/dist/graph/arrow-graph.js.map +1 -0
- package/dist/graph/classic-graph.d.ts +169 -0
- package/dist/graph/classic-graph.d.ts.map +1 -0
- package/dist/graph/classic-graph.js +390 -0
- package/dist/graph/classic-graph.js.map +1 -0
- package/dist/graph/edge.d.ts +6 -6
- package/dist/graph/edge.d.ts.map +1 -1
- package/dist/graph/edge.js.map +1 -1
- package/dist/graph/functions/arrow-utils.d.ts +6 -0
- package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
- package/dist/graph/functions/arrow-utils.js +67 -0
- package/dist/graph/functions/arrow-utils.js.map +1 -0
- package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
- package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
- package/dist/graph/functions/create-graph-from-data.js +12 -0
- package/dist/graph/functions/create-graph-from-data.js.map +1 -0
- package/dist/graph/graph-normalization.d.ts +10 -0
- package/dist/graph/graph-normalization.d.ts.map +1 -0
- package/dist/graph/graph-normalization.js +65 -0
- package/dist/graph/graph-normalization.js.map +1 -0
- package/dist/graph/graph.d.ts +62 -155
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +11 -300
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/node.d.ts +6 -6
- package/dist/graph/node.d.ts.map +1 -1
- package/dist/graph/node.js +2 -2
- package/dist/graph/node.js.map +1 -1
- package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
- package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/arrow-graph-data-builder.js +105 -0
- package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data-builder.d.ts +6 -0
- package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/graph-data-builder.js +1 -0
- package/dist/graph-data/graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data.d.ts +40 -0
- package/dist/graph-data/graph-data.d.ts.map +1 -0
- package/dist/graph-data/graph-data.js +11 -0
- package/dist/graph-data/graph-data.js.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.js +105 -0
- package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
- package/dist/graph-style-schema.cdn.js +1 -1
- package/dist/graph-style-schema.json +1 -1
- package/dist/index.cjs +6905 -4576
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +14 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -11
- package/dist/index.js.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -2
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
- package/dist/layers/edge-attachment-helper.d.ts.map +1 -1
- package/dist/layers/edge-attachment-helper.js +1 -2
- package/dist/layers/edge-attachment-helper.js.map +1 -1
- package/dist/layers/graph-layer.d.ts +68 -11
- package/dist/layers/graph-layer.d.ts.map +1 -1
- package/dist/layers/graph-layer.js +435 -50
- package/dist/layers/graph-layer.js.map +1 -1
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts +46 -61
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -1
- package/dist/layouts/d3-dag/d3-dag-layout.js +85 -270
- package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.d.ts +20 -8
- package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.js +39 -20
- package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts +19 -15
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.js +47 -38
- package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.d.ts +18 -15
- package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.js +33 -34
- package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
- package/dist/layouts/experimental/radial-layout.d.ts +12 -7
- package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/radial-layout.js +31 -14
- package/dist/layouts/experimental/radial-layout.js.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts +11 -8
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.js +59 -56
- package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
- package/dist/layouts/simple-layout.d.ts +8 -25
- package/dist/layouts/simple-layout.d.ts.map +1 -1
- package/dist/layouts/simple-layout.js +13 -17
- package/dist/layouts/simple-layout.js.map +1 -1
- package/dist/loaders/dot-graph-loader.d.ts +25 -0
- package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
- package/dist/loaders/dot-graph-loader.js +668 -0
- package/dist/loaders/dot-graph-loader.js.map +1 -0
- package/dist/loaders/json-graph-loader.d.ts +6 -0
- package/dist/loaders/json-graph-loader.d.ts.map +1 -0
- package/dist/loaders/json-graph-loader.js +31 -0
- package/dist/loaders/json-graph-loader.js.map +1 -0
- package/dist/loaders/{edge-parsers.d.ts → parsers/edge-parsers.d.ts} +1 -1
- package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
- package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +1 -1
- package/dist/loaders/parsers/edge-parsers.js.map +1 -0
- package/dist/loaders/{node-parsers.d.ts → parsers/node-parsers.d.ts} +1 -1
- package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
- package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +1 -1
- package/dist/loaders/parsers/node-parsers.js.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.js +78 -0
- package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
- package/dist/style/graph-style-engine.d.ts +4 -2
- package/dist/style/graph-style-engine.d.ts.map +1 -1
- package/dist/style/graph-style-engine.js +3 -2
- package/dist/style/graph-style-engine.js.map +1 -1
- package/dist/style/{style-engine.d.ts → stylesheet-engine.d.ts} +3 -3
- package/dist/style/stylesheet-engine.d.ts.map +1 -0
- package/dist/style/{style-engine.js → stylesheet-engine.js} +1 -1
- package/dist/style/stylesheet-engine.js.map +1 -0
- package/dist/utils/collapsed-chains.d.ts +8 -8
- package/dist/utils/collapsed-chains.d.ts.map +1 -1
- package/dist/utils/collapsed-chains.js +1 -6
- package/dist/utils/collapsed-chains.js.map +1 -1
- package/dist/utils/rank-grid.d.ts +30 -0
- package/dist/utils/rank-grid.d.ts.map +1 -0
- package/dist/utils/rank-grid.js +306 -0
- package/dist/utils/rank-grid.js.map +1 -0
- package/package.json +4 -8
- package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
- package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
- package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
- package/src/core/graph-engine.ts +201 -84
- package/src/core/graph-layout.ts +52 -29
- package/src/core/interaction-manager.ts +20 -20
- package/src/graph/arrow-graph.ts +648 -0
- package/src/graph/classic-graph.ts +447 -0
- package/src/graph/edge.ts +7 -7
- package/src/graph/functions/arrow-utils.ts +72 -0
- package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
- package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
- package/src/graph/functions/create-graph-from-data.ts +16 -0
- package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
- package/src/graph/graph-normalization.ts +87 -0
- package/src/graph/graph.ts +68 -339
- package/src/graph/node.ts +9 -9
- package/src/graph/tabular-graph.ts.disabled +761 -0
- package/src/graph-data/arrow-graph-data-builder.ts +165 -0
- package/src/graph-data/graph-data-builder.ts +7 -0
- package/src/graph-data/graph-data.ts +57 -0
- package/src/graph-data/plain-graph-data-builder.ts +132 -0
- package/src/index.ts +53 -13
- package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
- package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
- package/src/layers/edge-attachment-helper.ts +22 -16
- package/src/layers/graph-layer.ts +642 -62
- package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
- package/src/layouts/d3-dag/d3-dag-layout.ts +166 -396
- package/src/layouts/d3-force/d3-force-layout.ts +52 -30
- package/src/layouts/experimental/force-multi-graph-layout.ts +55 -49
- package/src/layouts/experimental/hive-plot-layout.ts +41 -42
- package/src/layouts/experimental/radial-layout.ts +39 -20
- package/src/layouts/gpu-force/gpu-force-layout.ts +72 -70
- package/src/layouts/simple-layout.ts +20 -44
- package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
- package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
- package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +3 -3
- package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +8 -8
- package/src/loaders/dot-graph-loader.ts +860 -0
- package/src/loaders/json-graph-loader.ts +48 -0
- package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
- package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +2 -2
- package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +2 -2
- package/src/loaders/parsers/parse-json-graph.ts +134 -0
- package/src/style/graph-style-engine.ts +5 -2
- package/src/style/{style-engine.ts → stylesheet-engine.ts} +3 -3
- package/src/utils/collapsed-chains.ts +11 -17
- package/src/utils/rank-grid.ts +426 -0
- package/dist/loaders/create-graph.d.ts +0 -12
- package/dist/loaders/create-graph.d.ts.map +0 -1
- package/dist/loaders/create-graph.js +0 -38
- package/dist/loaders/create-graph.js.map +0 -1
- package/dist/loaders/edge-parsers.d.ts.map +0 -1
- package/dist/loaders/edge-parsers.js.map +0 -1
- package/dist/loaders/json-loader.d.ts +0 -7
- package/dist/loaders/json-loader.d.ts.map +0 -1
- package/dist/loaders/json-loader.js +0 -16
- package/dist/loaders/json-loader.js.map +0 -1
- package/dist/loaders/node-parsers.d.ts.map +0 -1
- package/dist/loaders/node-parsers.js.map +0 -1
- package/dist/loaders/simple-json-graph-loader.d.ts +0 -11
- package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
- package/dist/loaders/simple-json-graph-loader.js +0 -20
- package/dist/loaders/simple-json-graph-loader.js.map +0 -1
- package/dist/loaders/table-graph-loader.d.ts +0 -16
- package/dist/loaders/table-graph-loader.d.ts.map +0 -1
- package/dist/loaders/table-graph-loader.js +0 -91
- package/dist/loaders/table-graph-loader.js.map +0 -1
- package/dist/style/style-engine.d.ts.map +0 -1
- package/dist/style/style-engine.js.map +0 -1
- package/dist/widgets/long-press-button.d.ts +0 -12
- package/dist/widgets/long-press-button.d.ts.map +0 -1
- package/dist/widgets/long-press-button.js +0 -31
- package/dist/widgets/long-press-button.js.map +0 -1
- package/dist/widgets/view-control-widget.d.ts +0 -77
- package/dist/widgets/view-control-widget.d.ts.map +0 -1
- package/dist/widgets/view-control-widget.js +0 -197
- package/dist/widgets/view-control-widget.js.map +0 -1
- package/src/loaders/json-loader.ts +0 -19
- package/src/widgets/long-press-button.tsx +0 -50
- package/src/widgets/view-control-widget.tsx +0 -339
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line import/no-unresolved
|
|
6
|
+
import * as arrow from 'apache-arrow';
|
|
7
|
+
|
|
8
|
+
import type {EdgeState, NodeState} from '../core/constants';
|
|
9
|
+
import type {GraphEdgeData, GraphNodeData,ArrowGraphData} from './graph-data';
|
|
10
|
+
import {
|
|
11
|
+
cloneRecord,
|
|
12
|
+
normalizeEdgeState,
|
|
13
|
+
normalizeNodeState,
|
|
14
|
+
normalizeVersion
|
|
15
|
+
} from '../graph/graph-normalization';
|
|
16
|
+
|
|
17
|
+
type Builder = ReturnType<typeof arrow.makeBuilder>;
|
|
18
|
+
type ArrowVector = ReturnType<Builder['toVector']>;
|
|
19
|
+
type ColumnArray = ReturnType<ArrowVector['toArray']>;
|
|
20
|
+
type ColumnBuilderMap = Map<string, Builder>;
|
|
21
|
+
|
|
22
|
+
export type ArrowGraphDataBuilderOptions = {
|
|
23
|
+
version?: number;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export class ArrowGraphDataBuilder {
|
|
27
|
+
private readonly nodeBuilders: ColumnBuilderMap = new Map();
|
|
28
|
+
private readonly edgeBuilders: ColumnBuilderMap = new Map();
|
|
29
|
+
|
|
30
|
+
private nodeLength = 0;
|
|
31
|
+
private edgeLength = 0;
|
|
32
|
+
|
|
33
|
+
private _version: number;
|
|
34
|
+
|
|
35
|
+
constructor(options: ArrowGraphDataBuilderOptions = {}) {
|
|
36
|
+
this._version = normalizeVersion(options.version);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
get version(): number {
|
|
40
|
+
return this._version;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
setVersion(version: unknown): void {
|
|
44
|
+
this._version = normalizeVersion(version);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
addNode(node: GraphNodeData): number {
|
|
48
|
+
if (typeof node?.id === 'undefined') {
|
|
49
|
+
throw new Error('Graph node requires an "id" field.');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const index = this.nodeLength++;
|
|
53
|
+
const attributes = cloneRecord(node.attributes);
|
|
54
|
+
|
|
55
|
+
if (typeof node.label !== 'undefined') {
|
|
56
|
+
attributes.label = node.label;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (typeof node.weight !== 'undefined') {
|
|
60
|
+
attributes.weight = node.weight;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const stateCandidate = node.state ?? (attributes.state as NodeState | undefined);
|
|
64
|
+
const selectableCandidate = node.selectable ?? (attributes.selectable as boolean | undefined);
|
|
65
|
+
const highlightCandidate =
|
|
66
|
+
node.highlightConnectedEdges ?? (attributes.highlightConnectedEdges as boolean | undefined);
|
|
67
|
+
|
|
68
|
+
this.appendUtf8(this.nodeBuilders, 'id', node.id);
|
|
69
|
+
this.appendUtf8(this.nodeBuilders, 'state', normalizeNodeState(stateCandidate));
|
|
70
|
+
this.appendBoolean(this.nodeBuilders, 'selectable', Boolean(selectableCandidate));
|
|
71
|
+
this.appendBoolean(this.nodeBuilders, 'highlightConnectedEdges', Boolean(highlightCandidate));
|
|
72
|
+
this.appendJson(this.nodeBuilders, 'data', attributes);
|
|
73
|
+
|
|
74
|
+
return index;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
addEdge(edge: GraphEdgeData): number {
|
|
78
|
+
if (
|
|
79
|
+
typeof edge?.id === 'undefined' ||
|
|
80
|
+
typeof edge?.sourceId === 'undefined' ||
|
|
81
|
+
typeof edge?.targetId === 'undefined'
|
|
82
|
+
) {
|
|
83
|
+
throw new Error('Graph edge requires "id", "sourceId", and "targetId" fields.');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const index = this.edgeLength++;
|
|
87
|
+
const attributes = cloneRecord(edge.attributes);
|
|
88
|
+
|
|
89
|
+
if (typeof edge.label !== 'undefined') {
|
|
90
|
+
attributes.label = edge.label;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (typeof edge.weight !== 'undefined') {
|
|
94
|
+
attributes.weight = edge.weight;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const stateCandidate = edge.state ?? (attributes.state as EdgeState | undefined);
|
|
98
|
+
const directedCandidate = edge.directed ?? (attributes.directed as boolean | undefined);
|
|
99
|
+
|
|
100
|
+
this.appendUtf8(this.edgeBuilders, 'id', edge.id);
|
|
101
|
+
this.appendUtf8(this.edgeBuilders, 'sourceId', edge.sourceId);
|
|
102
|
+
this.appendUtf8(this.edgeBuilders, 'targetId', edge.targetId);
|
|
103
|
+
this.appendBoolean(this.edgeBuilders, 'directed', Boolean(directedCandidate));
|
|
104
|
+
this.appendUtf8(this.edgeBuilders, 'state', normalizeEdgeState(stateCandidate));
|
|
105
|
+
this.appendJson(this.edgeBuilders, 'data', attributes);
|
|
106
|
+
|
|
107
|
+
return index;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
finish(): ArrowGraphData {
|
|
111
|
+
return {
|
|
112
|
+
shape: 'arrow-graph-data',
|
|
113
|
+
version: this._version,
|
|
114
|
+
nodes: tableFromBuilders(this.nodeBuilders),
|
|
115
|
+
edges: tableFromBuilders(this.edgeBuilders)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private appendUtf8(builders: ColumnBuilderMap, columnName: string, value: string | number): void {
|
|
120
|
+
const builder = this.getOrCreateBuilder(builders, columnName, () =>
|
|
121
|
+
arrow.makeBuilder({type: new arrow.Utf8(), nullValues: [null, undefined]})
|
|
122
|
+
);
|
|
123
|
+
builder.append(typeof value === 'number' ? String(value) : value);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private appendBoolean(builders: ColumnBuilderMap, columnName: string, value: boolean): void {
|
|
127
|
+
const builder = this.getOrCreateBuilder(builders, columnName, () =>
|
|
128
|
+
arrow.makeBuilder({type: new arrow.Bool(), nullValues: [null, undefined]})
|
|
129
|
+
);
|
|
130
|
+
builder.append(value);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private appendJson(builders: ColumnBuilderMap, columnName: string, value: Record<string, unknown>): void {
|
|
134
|
+
const builder = this.getOrCreateBuilder(builders, columnName, () =>
|
|
135
|
+
arrow.makeBuilder({type: new arrow.Utf8(), nullValues: [null, undefined]})
|
|
136
|
+
);
|
|
137
|
+
builder.append(JSON.stringify(value));
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private getOrCreateBuilder(
|
|
141
|
+
builders: ColumnBuilderMap,
|
|
142
|
+
columnName: string,
|
|
143
|
+
factory: () => Builder
|
|
144
|
+
): Builder {
|
|
145
|
+
let builder = builders.get(columnName);
|
|
146
|
+
if (!builder) {
|
|
147
|
+
builder = factory();
|
|
148
|
+
builders.set(columnName, builder);
|
|
149
|
+
}
|
|
150
|
+
return builder;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function tableFromBuilders(builders: ColumnBuilderMap): arrow.Table {
|
|
155
|
+
const columns: Record<string, ColumnArray> = {};
|
|
156
|
+
|
|
157
|
+
for (const [columnName, builder] of builders.entries()) {
|
|
158
|
+
builder.finish();
|
|
159
|
+
const vector = builder.toVector();
|
|
160
|
+
columns[columnName] = vector.toArray();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return arrow.tableFromArrays(columns);
|
|
164
|
+
}
|
|
165
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
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 * as arrow from 'apache-arrow';
|
|
7
|
+
|
|
8
|
+
/** Graph data types supported by this library */
|
|
9
|
+
export type GraphData = PlainGraphData | ArrowGraphData;
|
|
10
|
+
|
|
11
|
+
/** Graph data stored in Apache Arrow binary columnar tables */
|
|
12
|
+
export type ArrowGraphData = {
|
|
13
|
+
shape: 'arrow-graph-data';
|
|
14
|
+
version: number;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
nodes: arrow.Table;
|
|
17
|
+
edges: arrow.Table;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type PlainGraphData = {
|
|
21
|
+
shape: 'plain-graph-data';
|
|
22
|
+
version?: number;
|
|
23
|
+
metadata?: Record<string, unknown>;
|
|
24
|
+
nodes?: GraphNodeData[] | null;
|
|
25
|
+
edges?: GraphEdgeData[] | null;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type GraphNodeData = {
|
|
29
|
+
id: string | number;
|
|
30
|
+
label?: string;
|
|
31
|
+
state?: NodeState;
|
|
32
|
+
selectable?: boolean;
|
|
33
|
+
highlightConnectedEdges?: boolean;
|
|
34
|
+
weight?: number;
|
|
35
|
+
attributes?: Record<string, unknown> | null | undefined;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type GraphEdgeData = {
|
|
39
|
+
id: string | number;
|
|
40
|
+
sourceId: string | number;
|
|
41
|
+
targetId: string | number;
|
|
42
|
+
label?: string;
|
|
43
|
+
state?: EdgeState;
|
|
44
|
+
directed?: boolean;
|
|
45
|
+
weight?: number;
|
|
46
|
+
attributes?: Record<string, unknown> | null | undefined;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export function isArrowGraphData(value: unknown): value is ArrowGraphData {
|
|
50
|
+
const candidate = value as ArrowGraphData;
|
|
51
|
+
return typeof value === 'object' && candidate?.shape === 'arrow-graph-data';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isPlainGraphData(value: unknown): value is PlainGraphData {
|
|
55
|
+
const candidate = value as PlainGraphData;
|
|
56
|
+
return typeof value === 'object' && candidate?.shape === 'plain-graph-data';
|
|
57
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// deck.gl-community
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {PlainGraphData, GraphEdgeData, GraphNodeData} from './graph-data';
|
|
6
|
+
import { GraphDataBuilder } from './graph-data-builder';
|
|
7
|
+
import {cloneRecord, normalizeVersion} from '../graph/graph-normalization';
|
|
8
|
+
|
|
9
|
+
export type PlainGraphDataBuilderOptions = {
|
|
10
|
+
version?: number;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export class PlainGraphDataBuilder implements GraphDataBuilder {
|
|
14
|
+
private readonly nodes: GraphNodeData[] = [];
|
|
15
|
+
private readonly edges: GraphEdgeData[] = [];
|
|
16
|
+
|
|
17
|
+
private _version: number;
|
|
18
|
+
|
|
19
|
+
constructor(options: PlainGraphDataBuilderOptions = {}) {
|
|
20
|
+
this._version = normalizeVersion(options.version);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get version(): number {
|
|
24
|
+
return this._version;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
setVersion(version: unknown): void {
|
|
28
|
+
this._version = normalizeVersion(version);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
get nodeCount(): number {
|
|
32
|
+
return this.nodes.length;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get edgeCount(): number {
|
|
36
|
+
return this.edges.length;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
addNode(node: GraphNodeData): number {
|
|
40
|
+
if (typeof node?.id === 'undefined') {
|
|
41
|
+
throw new Error('Graph node requires an "id" field.');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const attributes = cloneRecord(node.attributes);
|
|
45
|
+
this._assignNodeAttributes(attributes, node);
|
|
46
|
+
const record: GraphNodeData = {
|
|
47
|
+
...node,
|
|
48
|
+
attributes
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
this.nodes.push(record);
|
|
52
|
+
return this.nodes.length - 1;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
addEdge(edge: GraphEdgeData): number {
|
|
56
|
+
if (
|
|
57
|
+
typeof edge?.id === 'undefined' ||
|
|
58
|
+
typeof edge?.sourceId === 'undefined' ||
|
|
59
|
+
typeof edge?.targetId === 'undefined'
|
|
60
|
+
) {
|
|
61
|
+
throw new Error('Graph edge requires "id", "sourceId", and "targetId" fields.');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const attributes = cloneRecord(edge.attributes);
|
|
65
|
+
this._assignEdgeAttributes(attributes, edge);
|
|
66
|
+
const record: GraphEdgeData = {
|
|
67
|
+
...edge,
|
|
68
|
+
attributes
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
this.edges.push(record);
|
|
72
|
+
return this.edges.length - 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
private _assignNodeAttributes(target: Record<string, unknown>, node: GraphNodeData): void {
|
|
76
|
+
if (typeof node.label !== 'undefined') {
|
|
77
|
+
target.label = node.label;
|
|
78
|
+
}
|
|
79
|
+
if (typeof node.weight !== 'undefined') {
|
|
80
|
+
target.weight = node.weight;
|
|
81
|
+
}
|
|
82
|
+
if (typeof node.state !== 'undefined') {
|
|
83
|
+
target.state = node.state;
|
|
84
|
+
}
|
|
85
|
+
if (typeof node.selectable !== 'undefined') {
|
|
86
|
+
target.selectable = node.selectable;
|
|
87
|
+
}
|
|
88
|
+
if (typeof node.highlightConnectedEdges !== 'undefined') {
|
|
89
|
+
target.highlightConnectedEdges = node.highlightConnectedEdges;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private _assignEdgeAttributes(target: Record<string, unknown>, edge: GraphEdgeData): void {
|
|
94
|
+
if (typeof edge.label !== 'undefined') {
|
|
95
|
+
target.label = edge.label;
|
|
96
|
+
}
|
|
97
|
+
if (typeof edge.weight !== 'undefined') {
|
|
98
|
+
target.weight = edge.weight;
|
|
99
|
+
}
|
|
100
|
+
if (typeof edge.state !== 'undefined') {
|
|
101
|
+
target.state = edge.state;
|
|
102
|
+
}
|
|
103
|
+
if (typeof edge.directed !== 'undefined') {
|
|
104
|
+
target.directed = edge.directed;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
build(): PlainGraphData {
|
|
109
|
+
return {
|
|
110
|
+
shape: 'plain-graph-data',
|
|
111
|
+
version: this._version,
|
|
112
|
+
nodes: this.nodes.map(cloneNodeData),
|
|
113
|
+
edges: this.edges.map(cloneEdgeData)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function cloneNodeData(node: GraphNodeData): GraphNodeData {
|
|
119
|
+
const attributes = cloneRecord(node.attributes);
|
|
120
|
+
return {
|
|
121
|
+
...node,
|
|
122
|
+
attributes
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function cloneEdgeData(edge: GraphEdgeData): GraphEdgeData {
|
|
127
|
+
const attributes = cloneRecord(edge.attributes);
|
|
128
|
+
return {
|
|
129
|
+
...edge,
|
|
130
|
+
attributes
|
|
131
|
+
};
|
|
132
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -2,11 +2,37 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
+
// Graph Data - output from loaders, input to writers
|
|
6
|
+
|
|
7
|
+
export type {GraphData, PlainGraphData, ArrowGraphData /* , GraphNodeData, GraphEdgeData */} from './graph-data/graph-data';
|
|
8
|
+
export type {GraphDataBuilder /* , GraphDataBuilderOptions */} from './graph-data/graph-data-builder';
|
|
9
|
+
export {
|
|
10
|
+
ArrowGraphDataBuilder,
|
|
11
|
+
type ArrowGraphDataBuilderOptions
|
|
12
|
+
} from './graph-data/arrow-graph-data-builder';
|
|
13
|
+
|
|
14
|
+
|
|
5
15
|
// core - Graph representation and layout
|
|
6
|
-
export {Graph} from './graph/graph';
|
|
16
|
+
export type {Graph, NodeInterface, EdgeInterface} from './graph/graph';
|
|
7
17
|
export {Node} from './graph/node';
|
|
8
18
|
export {Edge} from './graph/edge';
|
|
9
19
|
|
|
20
|
+
export {ClassicGraph} from './graph/classic-graph';
|
|
21
|
+
export {ArrowGraph} from './graph/arrow-graph';
|
|
22
|
+
// export {
|
|
23
|
+
// TabularGraph,
|
|
24
|
+
// TabularNode,
|
|
25
|
+
// TabularEdge,
|
|
26
|
+
// type NodeIndex,
|
|
27
|
+
// type EdgeIndex,
|
|
28
|
+
// type TabularGraphSource,
|
|
29
|
+
// type TabularGraphAccessors,
|
|
30
|
+
// type TabularNodeAccessors,
|
|
31
|
+
// type TabularEdgeAccessors
|
|
32
|
+
// } from './graph/tabular-graph';
|
|
33
|
+
|
|
34
|
+
// Graph Engine
|
|
35
|
+
|
|
10
36
|
export {GraphEngine} from './core/graph-engine';
|
|
11
37
|
|
|
12
38
|
// graph-layers layouts
|
|
@@ -20,6 +46,7 @@ export {GraphLayout} from './core/graph-layout';
|
|
|
20
46
|
export {SimpleLayout} from './layouts/simple-layout';
|
|
21
47
|
export {D3ForceLayout} from './layouts/d3-force/d3-force-layout';
|
|
22
48
|
export {D3DagLayout} from './layouts/d3-dag/d3-dag-layout';
|
|
49
|
+
export {CollapsableD3DagLayout} from './layouts/d3-dag/collapsable-d3-dag-layout';
|
|
23
50
|
export {GPUForceLayout} from './layouts/gpu-force/gpu-force-layout';
|
|
24
51
|
export {RadialLayout} from './layouts/experimental/radial-layout';
|
|
25
52
|
export {ForceMultiGraphLayout} from './layouts/experimental/force-multi-graph-layout';
|
|
@@ -29,9 +56,11 @@ export type {Marker, NodeState, NodeType, EdgeType, EdgeDecoratorType, LayoutSta
|
|
|
29
56
|
|
|
30
57
|
// deck.gl components
|
|
31
58
|
export {GraphLayer} from './layers/graph-layer';
|
|
59
|
+
export type {RankGridConfig} from './layers/graph-layer';
|
|
32
60
|
export {EdgeLayer} from './layers/edge-layer';
|
|
33
|
-
export {
|
|
34
|
-
export {
|
|
61
|
+
export {GridLayer, type GridLayerProps, type GridLineDatum} from './layers/common-layers/grid-layer/grid-layer';
|
|
62
|
+
export {StylesheetEngine} from './style/stylesheet-engine';
|
|
63
|
+
export {GraphStylesheetEngine, GraphStyleEngine} from './style/graph-style-engine';
|
|
35
64
|
export type {
|
|
36
65
|
GraphStylesheet,
|
|
37
66
|
GraphStylesheetInput,
|
|
@@ -49,19 +78,30 @@ export {
|
|
|
49
78
|
type GraphLayerNodeStyle
|
|
50
79
|
} from './style/graph-layer-stylesheet';
|
|
51
80
|
|
|
52
|
-
// Widgets
|
|
53
|
-
|
|
54
|
-
export {ViewControlWidget} from './widgets/view-control-widget';
|
|
55
|
-
|
|
56
|
-
// graph format loaders
|
|
57
|
-
export {loadSimpleJSONGraph} from './loaders/simple-json-graph-loader';
|
|
58
|
-
|
|
59
81
|
// utils
|
|
60
82
|
export {mixedGetPosition} from './utils/layer-utils';
|
|
61
83
|
export {log} from './utils/log';
|
|
84
|
+
export {
|
|
85
|
+
mapRanksToYPositions,
|
|
86
|
+
selectRankLines,
|
|
87
|
+
type RankAccessor,
|
|
88
|
+
type LabelAccessor,
|
|
89
|
+
type RankPosition,
|
|
90
|
+
type MapRanksToYPositionsOptions,
|
|
91
|
+
type SelectRankLinesOptions
|
|
92
|
+
} from './utils/rank-grid';
|
|
62
93
|
|
|
63
|
-
//
|
|
64
|
-
export {
|
|
65
|
-
|
|
94
|
+
// graph format loaders
|
|
95
|
+
export {
|
|
96
|
+
JSONGraphLoader,
|
|
97
|
+
type JSONGraphLoaderOptions,
|
|
98
|
+
} from './loaders/json-graph-loader';
|
|
99
|
+
|
|
100
|
+
export {
|
|
101
|
+
DOTGraphLoader,
|
|
102
|
+
type DOTGraphLoaderOptions,
|
|
103
|
+
type DOTGraphLoaderMetadata,
|
|
104
|
+
} from './loaders/dot-graph-loader';
|
|
66
105
|
|
|
106
|
+
// Deprecated exports
|
|
67
107
|
export {MARKER_TYPE, NODE_STATE,EDGE_STATE,NODE_TYPE,EDGE_TYPE,EDGE_DECORATOR_TYPE,LAYOUT_STATE} from './_deprecated/old-constants';
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
|
|
5
5
|
// import {Buffer, Transform} from '@luma.gl/core';
|
|
6
6
|
import {LineLayer} from '@deck.gl/layers';
|
|
7
|
-
import {window} from 'global';
|
|
8
7
|
|
|
9
8
|
import {vs} from './flow-path-layer-vertex.glsl';
|
|
10
9
|
import {fs} from './flow-path-layer-fragment.glsl';
|
|
@@ -42,7 +41,7 @@ export class FlowPathLayer extends LineLayer {
|
|
|
42
41
|
this.setupTransformFeedback();
|
|
43
42
|
this.setState({
|
|
44
43
|
...this.state,
|
|
45
|
-
animation: window.requestAnimationFrame(this.animate.bind(this))
|
|
44
|
+
animation: globalThis.window.requestAnimationFrame(this.animate.bind(this))
|
|
46
45
|
});
|
|
47
46
|
}
|
|
48
47
|
|