@aloudata/ink-lineage 0.0.1-beta.1

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 (50) hide show
  1. package/package.json +27 -0
  2. package/src/assets/big/dataSourceTypeIcon.ts +65 -0
  3. package/src/assets/big/entityType.ts +1 -0
  4. package/src/assets/big/index.ts +5 -0
  5. package/src/assets/big/lineageIcon.ts +35 -0
  6. package/src/assets/big/tableTypeIcon.ts +17 -0
  7. package/src/assets/big/tipIcon.ts +1 -0
  8. package/src/assets/index.ts +14 -0
  9. package/src/components/Edges/DefaultEdge.ts +196 -0
  10. package/src/components/Edges/FoldEdge.ts +97 -0
  11. package/src/components/Edges/LineageEdge.ts +24 -0
  12. package/src/components/Edges/index.ts +3 -0
  13. package/src/components/Nodes/AssetNode.ts +438 -0
  14. package/src/components/Nodes/ColumnNode.ts +491 -0
  15. package/src/components/Nodes/CustomNode.ts +63 -0
  16. package/src/components/Nodes/DefaultNode.ts +74 -0
  17. package/src/components/Nodes/DowngradeNode.ts +115 -0
  18. package/src/components/Nodes/TableNode.ts +534 -0
  19. package/src/components/Nodes/index.ts +4 -0
  20. package/src/components/index.ts +2 -0
  21. package/src/constant/index.ts +1 -0
  22. package/src/constant/nodeStyle.ts +141 -0
  23. package/src/index.ts +6 -0
  24. package/src/manager/BaseManager.ts +20 -0
  25. package/src/manager/DataProcessor.ts +782 -0
  26. package/src/manager/ExpandManager.ts +93 -0
  27. package/src/manager/FoldLineageManager.ts +196 -0
  28. package/src/manager/GraphEventManager.ts +90 -0
  29. package/src/manager/LineageManager.ts +680 -0
  30. package/src/manager/RightKeyMenuManager.ts +114 -0
  31. package/src/manager/SearchNodeManager.ts +188 -0
  32. package/src/manager/ToolbarManager.ts +42 -0
  33. package/src/manager/index.ts +8 -0
  34. package/src/manager/nodeManager/AssetEventManager.ts +442 -0
  35. package/src/manager/nodeManager/BaseEventManager.ts +68 -0
  36. package/src/manager/nodeManager/ColumnEventManager.ts +467 -0
  37. package/src/manager/nodeManager/CustomEventManager.ts +11 -0
  38. package/src/manager/nodeManager/TableEventManager.ts +87 -0
  39. package/src/manager/nodeManager/index.ts +3 -0
  40. package/src/types/NodeConfig.ts +69 -0
  41. package/src/types/eventEnum.ts +58 -0
  42. package/src/types/index.ts +3 -0
  43. package/src/types/manager.ts +75 -0
  44. package/src/types/node.ts +246 -0
  45. package/src/utils/downgradeNode.ts +22 -0
  46. package/src/utils/foldNode.ts +345 -0
  47. package/src/utils/getIconByType.ts +104 -0
  48. package/src/utils/index.ts +3 -0
  49. package/src/utils/node.ts +294 -0
  50. package/tsconfig.json +30 -0
@@ -0,0 +1,104 @@
1
+ import {
2
+ column24,
3
+ custom24,
4
+ table24,
5
+ tableTemporary,
6
+ taskSql,
7
+ view24,
8
+ mySql,
9
+ oracle,
10
+ postgre,
11
+ snowflake,
12
+ spark,
13
+ teradata,
14
+ kafka,
15
+ impala,
16
+ hive,
17
+ gauss,
18
+ flink,
19
+ greenplum,
20
+ SQLServer,
21
+ clickhouse,
22
+ byteHouse,
23
+ TiDB,
24
+ goldenDb,
25
+ oceanBase,
26
+ polarDb,
27
+ dm,
28
+ tdSQL,
29
+ sequoiaDb,
30
+ } from '../assets';
31
+ import { EDataSourceType, ETableType } from '../types';
32
+
33
+ export function getEntityTypeIcon(typeCode: string, type?: string) {
34
+ switch (typeCode) {
35
+ case 'Table':
36
+ if (type === ETableType.TEMP_TABLE) {
37
+ return tableTemporary;
38
+ }
39
+
40
+ if (type === ETableType.VIEW) {
41
+ return view24;
42
+ }
43
+
44
+ return table24;
45
+ case 'Task':
46
+ return taskSql;
47
+ case 'Column':
48
+ return column24;
49
+ default:
50
+ return custom24;
51
+ }
52
+ }
53
+
54
+ export const getDataSourceTypeIcon = (datasourceType: EDataSourceType) => {
55
+ switch (datasourceType) {
56
+ case EDataSourceType.HIVE:
57
+ return hive;
58
+ case EDataSourceType.MYSQL:
59
+ return mySql;
60
+ case EDataSourceType.GAUSS:
61
+ return gauss;
62
+ case EDataSourceType.KAFKA:
63
+ return kafka;
64
+ case EDataSourceType.SNOWFLAKE:
65
+ return snowflake;
66
+ case EDataSourceType.POSTGRE:
67
+ case EDataSourceType.POSTGRESQL:
68
+ return postgre;
69
+ case EDataSourceType.IMPALA:
70
+ return impala;
71
+ case EDataSourceType.SPARK:
72
+ return spark;
73
+ case EDataSourceType.ORACLE:
74
+ return oracle;
75
+ case EDataSourceType.TERADATA:
76
+ return teradata;
77
+ case EDataSourceType.FLINK:
78
+ return flink;
79
+ case EDataSourceType.GREEN_PLUM:
80
+ return greenplum;
81
+ case EDataSourceType.SQLSERVER:
82
+ return SQLServer;
83
+ case EDataSourceType.CLICK_HOUSE:
84
+ return clickhouse;
85
+ case EDataSourceType.BYTE_HOUSE:
86
+ return byteHouse;
87
+ case EDataSourceType.TIDB:
88
+ return TiDB;
89
+ case EDataSourceType.GOLDENDB:
90
+ return goldenDb;
91
+ case EDataSourceType.OCEAN_BASE:
92
+ return oceanBase;
93
+ case EDataSourceType.POLAR_DB:
94
+ return polarDb;
95
+ case EDataSourceType.DM:
96
+ return dm;
97
+ case EDataSourceType.TDSQL:
98
+ return tdSQL;
99
+ case EDataSourceType.SEQUOIA_DB:
100
+ return sequoiaDb;
101
+ default:
102
+ return '';
103
+ }
104
+ };
@@ -0,0 +1,3 @@
1
+ export * from './node';
2
+ export * from './getIconByType';
3
+ export * from './foldNode';
@@ -0,0 +1,294 @@
1
+ import {
2
+ EColumnEvents,
3
+ ECustomEvents,
4
+ EventEnumType,
5
+ ETableEvents,
6
+ } from '../types';
7
+ import _ from 'lodash';
8
+ import {
9
+ EElementType,
10
+ EOverviewType,
11
+ EDirection,
12
+ IColumnConfig,
13
+ IEdgeConfig,
14
+ INodeConfig,
15
+ IColResBase,
16
+ TDataBase,
17
+ } from '../types';
18
+
19
+ export function getEventTypeByNodeType(elementType: EElementType): EventEnumType {
20
+ if (elementType === EElementType.TABLE) {
21
+ return ETableEvents;
22
+ }
23
+
24
+ if (elementType === EElementType.CUSTOM) {
25
+ return ECustomEvents;
26
+ }
27
+
28
+ if (elementType === EElementType.COLUMN) {
29
+ return EColumnEvents;
30
+ }
31
+
32
+ return ETableEvents;
33
+ }
34
+
35
+ export function getOverviewType(type: string) {
36
+ switch (type) {
37
+ case 'VIEW':
38
+ return EOverviewType.TABLE;
39
+ case 'TABLE':
40
+ return EOverviewType.TABLE;
41
+ case 'TEMP_TABLE':
42
+ return EOverviewType.TEMP_TABLE;
43
+ case 'CUSTOM':
44
+ return EOverviewType.CUSTOM;
45
+ }
46
+ return EOverviewType.TABLE;
47
+ }
48
+
49
+ export function getRelatedData<TTableData extends TDataBase<TColumnData>, TColumnData extends IColResBase>(
50
+ startNodeCfg: INodeConfig<TTableData, TColumnData> | IColumnConfig<TColumnData>,
51
+ nodesConfig: INodeConfig<TTableData, TColumnData>[],
52
+ edgesConfig: IEdgeConfig[],
53
+ direction: EDirection,
54
+ // edgeDashVisible: EDashType,
55
+ ) {
56
+ const nodesConfigMap = new Map<string, INodeConfig<TTableData, TColumnData>>();
57
+ const columnsConfigMap = new Map<string, IColumnConfig<TColumnData>>();
58
+
59
+ nodesConfig.forEach((n) => {
60
+ nodesConfigMap.set(n.id, n);
61
+ n.relatedColumns?.forEach((c) => columnsConfigMap.set(c.id, c));
62
+ });
63
+
64
+ // related nodes
65
+ const relatedNodes: (INodeConfig<TTableData, TColumnData> | IColumnConfig<TColumnData>)[] = [startNodeCfg];
66
+
67
+ // related edges
68
+ const relatedEdges: IEdgeConfig[] = [];
69
+
70
+ // loop list
71
+ const todoList: (INodeConfig<TTableData, TColumnData> | IColumnConfig<TColumnData>)[] = [startNodeCfg];
72
+
73
+ while (todoList.length > 0) {
74
+ const curr = todoList.shift();
75
+ // check exist
76
+ if (_.isNil(curr)) return;
77
+
78
+ let validEdges = [];
79
+
80
+ validEdges = edgesConfig;
81
+
82
+ validEdges.forEach((edge) => {
83
+ // find input list
84
+ if (direction === EDirection.BOTH || direction === EDirection.INPUT) {
85
+ if (edge.target === curr.id) {
86
+ relatedEdges.push(edge);
87
+
88
+ // find target from tables & related columns
89
+ const srcNode =
90
+ nodesConfigMap.get(edge.source) ||
91
+ columnsConfigMap.get(edge.source);
92
+
93
+ if (!srcNode) return;
94
+
95
+ if (!_.some(relatedNodes, { id: srcNode.id })) {
96
+ todoList.push(srcNode);
97
+ relatedNodes.push(srcNode);
98
+ }
99
+ }
100
+ }
101
+
102
+ // find output list
103
+ if (direction === EDirection.BOTH || direction === EDirection.OUTPUT) {
104
+ if (edge.source === curr.id) {
105
+ relatedEdges.push(edge);
106
+
107
+ // find target from tables & related columns
108
+ const tgtNode =
109
+ nodesConfigMap.get(edge.target) ||
110
+ columnsConfigMap.get(edge.target);
111
+
112
+ if (!tgtNode) return;
113
+
114
+ if (!_.some(relatedNodes, { id: tgtNode.id })) {
115
+ todoList.push(tgtNode);
116
+ relatedNodes.push(tgtNode);
117
+ }
118
+ }
119
+ }
120
+ });
121
+ }
122
+
123
+ return {
124
+ relatedNodes,
125
+ relatedEdges,
126
+ };
127
+ }
128
+
129
+ export function groupNodesByEdgesAndDirection<TTableData extends TDataBase<TColumnData>, TColumnData extends IColResBase>(
130
+ startNodeCfg: INodeConfig<TTableData, TColumnData>,
131
+ nodesConfig: INodeConfig<TTableData, TColumnData>[],
132
+ edgesConfig: IEdgeConfig[],
133
+ direction: EDirection,
134
+ filterFoldNodes: boolean = false,
135
+ skipCircle: boolean = false,
136
+ ) {
137
+ const nodesConfigMap = new Map<string, INodeConfig<TTableData, TColumnData>>();
138
+ nodesConfig.forEach((n) => nodesConfigMap.set(n.id, n));
139
+
140
+ const existMap = new Map<string, number>();
141
+ existMap.set(startNodeCfg.id, 0);
142
+
143
+ const todoList: INodeConfig<TTableData, TColumnData>[] = [startNodeCfg];
144
+
145
+ const relatedEdges: IEdgeConfig[] = [];
146
+
147
+ while (todoList.length > 0) {
148
+ const curr = todoList.shift();
149
+ // check exist
150
+ if (_.isNil(curr)) return;
151
+
152
+ // get curr position
153
+ const currPosition = existMap.get(curr.id);
154
+ if (_.isNil(currPosition)) return;
155
+
156
+ edgesConfig.forEach((edge) => {
157
+ // find input list
158
+ if (direction === EDirection.BOTH || direction === EDirection.INPUT) {
159
+ if (edge.target === curr.id) {
160
+ relatedEdges.push(edge);
161
+
162
+ const srcNode =
163
+ nodesConfigMap.get(edge.source) ||
164
+ Array.from(nodesConfigMap.values()).find((item) =>
165
+ item.children.some((col) => col?.id === edge.source),
166
+ );
167
+
168
+ if (!srcNode) return;
169
+
170
+ if (skipCircle && srcNode.position.x >= curr.position.x) {
171
+ return;
172
+ }
173
+
174
+ if (!existMap.has(srcNode.id)) {
175
+ existMap.set(srcNode.id, currPosition - 1);
176
+
177
+ if (filterFoldNodes && srcNode.isFoldInput) {
178
+ return;
179
+ } else {
180
+ todoList.push(srcNode);
181
+ }
182
+ }
183
+ }
184
+ }
185
+
186
+ if (direction === EDirection.BOTH || direction === EDirection.OUTPUT) {
187
+ // find output list
188
+ if (edge.source === curr.id) {
189
+ relatedEdges.push(edge);
190
+
191
+ const tgtNode =
192
+ nodesConfigMap.get(edge.target) ||
193
+ Array.from(nodesConfigMap.values()).find((item) =>
194
+ item.children.some((col) => col?.id === edge.target),
195
+ );
196
+
197
+ if (!tgtNode) return;
198
+
199
+ if (skipCircle && tgtNode.position.x <= curr.position.x) {
200
+ return;
201
+ }
202
+
203
+ if (!existMap.has(tgtNode.id)) {
204
+ existMap.set(tgtNode.id, currPosition + 1);
205
+
206
+ if (filterFoldNodes && tgtNode.isFoldOutput) {
207
+ return;
208
+ } else {
209
+ todoList.push(tgtNode);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ });
215
+ }
216
+
217
+ return {
218
+ groupedNodes: existMap,
219
+ relatedEdges,
220
+ };
221
+ }
222
+
223
+ export function isAllDirectEdges<TTableData extends TDataBase<TColumnData>, TColumnData extends IColResBase>(
224
+ currNode: INodeConfig<TTableData, TColumnData>
225
+ | IColumnConfig<TColumnData>,
226
+ nodes: (INodeConfig<TTableData, TColumnData>
227
+ | IColumnConfig<TColumnData>)[],
228
+ edges: IEdgeConfig[],
229
+ ) {
230
+ const nodeId = currNode.id;
231
+ const startNode = nodes.find((node) => node.isStartNode);
232
+
233
+ if (!startNode) {
234
+ return false;
235
+ }
236
+
237
+ const visited = new Set();
238
+
239
+ function dfsUpstream(currentNodeId: string) {
240
+ if (
241
+ currentNodeId === startNode.id ||
242
+ currentNodeId.includes(`${startNode.id}.`)
243
+ ) {
244
+ return true;
245
+ }
246
+
247
+ visited.add(currentNodeId);
248
+
249
+ const incomingEdges = edges.filter((edge) => edge.target === currentNodeId);
250
+
251
+ for (const edge of incomingEdges) {
252
+ if (edge.relationType === 'INDIRECT') {
253
+ return false;
254
+ }
255
+
256
+ if (!visited.has(edge.source)) {
257
+ if (dfsUpstream(edge.source)) {
258
+ return true;
259
+ }
260
+ }
261
+ }
262
+
263
+ return false;
264
+ }
265
+
266
+ function dfsDownstream(currentNodeId: string) {
267
+ if (
268
+ currentNodeId === startNode.id ||
269
+ currentNodeId.includes(`${startNode.id}.`)
270
+ ) {
271
+ return true;
272
+ }
273
+
274
+ visited.add(currentNodeId);
275
+
276
+ const outgoingEdges = edges.filter((edge) => edge.source === currentNodeId);
277
+
278
+ for (const edge of outgoingEdges) {
279
+ if (edge.relationType === 'INDIRECT') {
280
+ return false;
281
+ }
282
+
283
+ if (!visited.has(edge.target)) {
284
+ if (dfsDownstream(edge.target)) {
285
+ return true;
286
+ }
287
+ }
288
+ }
289
+
290
+ return false;
291
+ }
292
+
293
+ return dfsUpstream(nodeId) || dfsDownstream(nodeId);
294
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "composite": true,
6
+ "module": "esnext",
7
+ "declaration": true /* 生成相关的 '.d.ts' 文件。 */,
8
+ "declarationDir": "./dist" /* '.d.ts' 文件输出目录 */,
9
+ // "emitDeclarationOnly": true /* 只生成声明文件,不生成 js 文件*/,
10
+ "sourceMap": true,
11
+ "target": "es5",
12
+ "outDir": "dist",
13
+ "jsx": "react",
14
+ // "watch": true,
15
+ "importHelpers": true,
16
+ "moduleResolution": "node",
17
+ "allowSyntheticDefaultImports": true,
18
+ "resolveJsonModule": true,
19
+ "esModuleInterop": true,
20
+ "lib": ["esnext", "dom"],
21
+ "types": ["jest"],
22
+ "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */,
23
+ "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */,
24
+ "downlevelIteration": true
25
+ },
26
+ // "include": ["src/**/*", "rollup.config.js"],
27
+ "include": ["src/**/*"],
28
+ "exclude": ["src/**/*.spec.ts"],
29
+ "references": []
30
+ }