From 9e9482bd443e18789e31b440c339903de642c74d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=B1=AAboy?= <504595380@qq.com> Date: Wed, 4 May 2022 20:03:39 +0800 Subject: [PATCH 1/2] fix: getNodeIdsConnectedTo and getNodeIdsConnectedFrom should remove duplicate values --- packages/core/graph/src/AdjacencyList.js | 12 ++++++------ packages/core/graph/test/AdjacencyList.test.js | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/core/graph/src/AdjacencyList.js b/packages/core/graph/src/AdjacencyList.js index 5db0b5a320a..a20bb7e3025 100644 --- a/packages/core/graph/src/AdjacencyList.js +++ b/packages/core/graph/src/AdjacencyList.js @@ -440,19 +440,19 @@ export default class AdjacencyList { ? type.includes(this.#nodes.typeOf(node)) : type === this.#nodes.typeOf(node)); - let nodes = []; + let nodes = new Set(); let node = this.#nodes.head(from); while (node !== null) { if (matches(node)) { let edge = this.#nodes.firstOut(node); while (edge !== null) { - nodes.push(this.#edges.to(edge)); + nodes.add(this.#edges.to(edge)); edge = this.#edges.nextOut(edge); } } node = this.#nodes.next(node); } - return nodes; + return [...nodes]; } /** @@ -472,19 +472,19 @@ export default class AdjacencyList { ? type.includes(this.#nodes.typeOf(node)) : type === this.#nodes.typeOf(node)); - let nodes = []; + let nodes = new Set(); let node = this.#nodes.head(to); while (node !== null) { if (matches(node)) { let edge = this.#nodes.firstIn(node); while (edge !== null) { - nodes.push(this.#edges.from(edge)); + nodes.add(this.#edges.from(edge)); edge = this.#edges.nextIn(edge); } } node = this.#nodes.next(node); } - return nodes; + return [...nodes]; } inspect(): any { diff --git a/packages/core/graph/test/AdjacencyList.test.js b/packages/core/graph/test/AdjacencyList.test.js index 4814422083e..32108771f98 100644 --- a/packages/core/graph/test/AdjacencyList.test.js +++ b/packages/core/graph/test/AdjacencyList.test.js @@ -57,6 +57,18 @@ describe('AdjacencyList', () => { assert.deepEqual(graph.getNodeIdsConnectedTo(node1), [0, 2, 4, 5, 6]); }); + it('getNodeIdsConnectedTo and getNodeIdsConnectedFrom should remove duplicate values', () => { + let graph = new AdjacencyList(); + let a = graph.addNode(); + let b = graph.addNode(); + let c = graph.addNode(); + graph.addEdge(a, b); + graph.addEdge(a, c); + graph.addEdge(a, b, 2); + assert.deepEqual(graph.getNodeIdsConnectedFrom(a, -1), [b, c]); + assert.deepEqual(graph.getNodeIdsConnectedTo(b, -1), [a]); + }); + it('removeEdge should remove an edge of a specific type from the graph', () => { let graph = new AdjacencyList(); let a = graph.addNode(); From e7fe603bd222860af2a8f29ddf05c9728923d426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=B1=AAboy?= <504595380@qq.com> Date: Fri, 6 May 2022 14:12:05 +0800 Subject: [PATCH 2/2] feat: use seen set --- packages/core/graph/src/AdjacencyList.js | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/packages/core/graph/src/AdjacencyList.js b/packages/core/graph/src/AdjacencyList.js index a20bb7e3025..bef85095782 100644 --- a/packages/core/graph/src/AdjacencyList.js +++ b/packages/core/graph/src/AdjacencyList.js @@ -439,20 +439,24 @@ export default class AdjacencyList { (Array.isArray(type) ? type.includes(this.#nodes.typeOf(node)) : type === this.#nodes.typeOf(node)); - - let nodes = new Set(); + let nodes = []; + let seen = new Set(); let node = this.#nodes.head(from); while (node !== null) { if (matches(node)) { let edge = this.#nodes.firstOut(node); while (edge !== null) { - nodes.add(this.#edges.to(edge)); + let to = this.#edges.to(edge); + if (!seen.has(to)) { + nodes.push(to); + seen.add(to); + } edge = this.#edges.nextOut(edge); } } node = this.#nodes.next(node); } - return [...nodes]; + return nodes; } /** @@ -472,19 +476,24 @@ export default class AdjacencyList { ? type.includes(this.#nodes.typeOf(node)) : type === this.#nodes.typeOf(node)); - let nodes = new Set(); + let nodes = []; + let seen = new Set(); let node = this.#nodes.head(to); while (node !== null) { if (matches(node)) { let edge = this.#nodes.firstIn(node); while (edge !== null) { - nodes.add(this.#edges.from(edge)); + let from = this.#edges.from(edge); + if (!seen.has(from)) { + nodes.push(from); + seen.add(from); + } edge = this.#edges.nextIn(edge); } } node = this.#nodes.next(node); } - return [...nodes]; + return nodes; } inspect(): any {