Skip to content

Commit 7f42860

Browse files
committed
fix: prevent the addition of duplicate data.
1 parent c644ae1 commit 7f42860

File tree

7 files changed

+79
-10
lines changed

7 files changed

+79
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 1.0.4+2
2+
- fix: prevent the addition of duplicate data.
3+
14
## 1.0.4+1
25
- fix: vertex text style `background` not working.
36

example/lib/demos/decorator_demo.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ class DecoratorDemo extends StatelessWidget {
2727
},
2828
);
2929
}
30+
for (var i = 0; i < 50; i++) {
31+
vertexes.add(
32+
{
33+
'id': 'node$i',
34+
'tag': 'tag${r.nextInt(9)}',
35+
'tags': [
36+
'tag${r.nextInt(9)}',
37+
if (r.nextBool()) 'tag${r.nextInt(4)}',
38+
if (r.nextBool()) 'tag${r.nextInt(8)}'
39+
],
40+
},
41+
);
42+
}
3043
var edges = <Map>{};
3144

3245
for (var i = 0; i < 50; i++) {

lib/core/convertor/map_convertor.dart

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ class MapConvertor extends DataConvertor<Map, Map> {
2323
vertex.id = v['id'];
2424
vertex.tag = v['tag'];
2525
vertex.tags = v['tags'];
26-
vertexAsGraphComponse(v, g, vertex);
2726
return vertex;
2827
}
2928

@@ -45,8 +44,6 @@ class MapConvertor extends DataConvertor<Map, Map> {
4544
result.start = g.keyCache[e['srcId']]!;
4645
result.end = g.keyCache[e['dstId']];
4746

48-
edgeAsGraphComponse(e, g, result);
49-
5047
return result;
5148
}
5249

@@ -66,12 +63,10 @@ class MapConvertor extends DataConvertor<Map, Map> {
6663
var edgeDataList = data['edges'] as Iterable;
6764
var vertexDataList = data['vertexes'] as Iterable;
6865
for (var v in vertexDataList) {
69-
Vertex vertex = convertVertex(v, result);
70-
result.vertexes.add(vertex);
66+
addVertex(v, result);
7167
}
7268
for (var e in edgeDataList) {
73-
Edge edge = convertEdge(e, result);
74-
result.edges.add(edge);
69+
addEdge(e, result);
7570
}
7671
}
7772
return result;

lib/core/data_convertor.dart

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,52 @@ abstract class DataConvertor<V, E> {
7777
};
7878
} else {
7979
if (g.edgesBetween[start] != null) {
80-
if (g.edgesBetween[start]![end] != null) {
80+
if (g.edgesBetween[start]![end] != null &&
81+
!g.edgesBetween[start]![end]!.contains(result)) {
8182
g.edgesBetween[start]![end]!.add(result);
8283
} else {
8384
g.edgesBetween[start]![end] = [result];
8485
}
8586
} else if (g.edgesBetween[end] != null) {
86-
if (g.edgesBetween[end]![start] != null) {
87+
if (g.edgesBetween[end]![start] != null &&
88+
!g.edgesBetween[end]![start]!.contains(result)) {
8789
g.edgesBetween[end]![start]!.add(result);
8890
} else {
8991
g.edgesBetween[end]![start] = [result];
9092
}
9193
}
9294
}
9395
}
96+
97+
/// Add data and component when absent.
98+
///
99+
/// 提供边的去重方法,当不存在时添加
100+
Edge addEdge(E e, Graph graph) {
101+
var sameEdge = graph.edges.where((edgeIn) => edgeIn == e).toList();
102+
Edge edge;
103+
if (sameEdge.isEmpty) {
104+
edge = convertEdge(e, graph);
105+
edgeAsGraphComponse(e, graph, edge);
106+
graph.edges.add(edge);
107+
} else {
108+
edge = sameEdge.first;
109+
}
110+
return edge;
111+
}
112+
113+
/// Add data and component when absent.
114+
///
115+
/// 提供边的去重方法,当不存在时添加
116+
Vertex addVertex(V v, Graph graph) {
117+
Vertex vertex = convertVertex(v, graph);
118+
var sameVertex =
119+
graph.vertexes.where((edgeIn) => edgeIn == vertex).toList();
120+
if (sameVertex.isEmpty) {
121+
vertexAsGraphComponse(v, graph, vertex);
122+
graph.vertexes.add(vertex);
123+
} else {
124+
vertex = sameVertex.first;
125+
}
126+
return vertex;
127+
}
94128
}

lib/model/edge.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,18 @@ class Edge {
9797
var idx = edgeList.indexOf(this);
9898
return idx;
9999
}
100+
101+
/// Uniqueness based on primary key of triple.
102+
///
103+
/// 只取三元组主键作为唯一性的依据
104+
@override
105+
int get hashCode => Object.hash(start, ranking, end);
106+
107+
@override
108+
bool operator ==(Object other) =>
109+
identical(this, other) ||
110+
(other is Edge &&
111+
other.ranking == ranking &&
112+
other.start == start &&
113+
other.end == end);
100114
}

lib/model/vertex.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,14 @@ class Vertex<I> {
118118
String toString() {
119119
return '$position';
120120
}
121+
122+
/// Uniqueness based on primary key
123+
///
124+
/// 只取主键作为唯一性的依据
125+
@override
126+
int get hashCode => id.hashCode;
127+
128+
@override
129+
bool operator ==(Object other) =>
130+
identical(this, other) || (other is Vertex && other.id == id);
121131
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_graph_view
22
description: Widgets for beautiful graphic data structures, such as force-oriented diagrams.
3-
version: 1.0.4+1
3+
version: 1.0.4+2
44
repository: https://github.com/dudu-ltd/flutter_graph_view
55
homepage: https://graph-cn.github.io/flutter_graph_view
66

0 commit comments

Comments
 (0)