From a2d28ae0adc9121f24394a699a87137b6a871279 Mon Sep 17 00:00:00 2001 From: imbajin Date: Wed, 19 May 2021 20:02:50 +0800 Subject: [PATCH 1/4] refactor: let kout degree applied to all labels also remove LimitIterator (moved to common) --- .../backend/tx/GraphTransaction.java | 44 +------------------ .../traversal/algorithm/HugeTraverser.java | 14 +++++- 2 files changed, 13 insertions(+), 45 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java index 6d3f8de109..a2af8b0d3d 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/tx/GraphTransaction.java @@ -72,6 +72,7 @@ import com.baidu.hugegraph.iterator.ExtendableIterator; import com.baidu.hugegraph.iterator.FilterIterator; import com.baidu.hugegraph.iterator.FlatMapperIterator; +import com.baidu.hugegraph.iterator.LimitIterator; import com.baidu.hugegraph.iterator.ListIterator; import com.baidu.hugegraph.iterator.MapperIterator; import com.baidu.hugegraph.iterator.WrappedIterator; @@ -1995,47 +1996,4 @@ private void traverseByLabel(SchemaLabel label, } while (page != null); } } - - // TODO: move to common module - public static class LimitIterator extends WrappedIterator { - - private final Iterator originIterator; - private final Function filterCallback; - - public LimitIterator(Iterator origin, Function filter) { - this.originIterator = origin; - this.filterCallback = filter; - } - - @Override - protected Iterator originIterator() { - return this.originIterator; - } - - @Override - protected final boolean fetch() { - while (this.originIterator.hasNext()) { - T next = this.originIterator.next(); - // Do filter - boolean reachLimit = this.filterCallback.apply(next); - if (reachLimit) { - this.closeOriginIterator(); - return false; - } - if (next != null) { - assert this.current == none(); - this.current = next; - return true; - } - } - return false; - } - - protected final void closeOriginIterator() { - if (this.originIterator == null) { - return; - } - close(this.originIterator); - } - } } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java index ef7f569523..b132f05dd3 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java @@ -48,6 +48,7 @@ import com.baidu.hugegraph.exception.NotFoundException; import com.baidu.hugegraph.iterator.ExtendableIterator; import com.baidu.hugegraph.iterator.FilterIterator; +import com.baidu.hugegraph.iterator.LimitIterator; import com.baidu.hugegraph.iterator.MapperIterator; import com.baidu.hugegraph.schema.SchemaLabel; import com.baidu.hugegraph.structure.HugeEdge; @@ -182,10 +183,19 @@ protected Iterator edgesOfVertex(Id source, Directions dir, ExtendableIterator results = new ExtendableIterator<>(); for (Id label : labels.keySet()) { E.checkNotNull(label, "edge label"); - // TODO: limit should be applied to all labels results.extend(this.edgesOfVertex(source, dir, label, limit)); } - return results; + + if (limit == NO_LIMIT) { + return results; + } + + Query query = new Query(HugeType.EDGE); + query.limit(limit); + return new LimitIterator<>(results, e -> { + long count = query.goOffset(1L); + return query.reachLimit(count - 1L); + }); } protected Iterator edgesOfVertex(Id source, EdgeStep edgeStep) { From d137cb8a115a22c51288ec12dfe9118b7f5cdc78 Mon Sep 17 00:00:00 2001 From: imbajin Date: Wed, 19 May 2021 21:01:28 +0800 Subject: [PATCH 2/4] replace Query by array --- .../baidu/hugegraph/traversal/algorithm/HugeTraverser.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java index b132f05dd3..6242c4bb0e 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java @@ -190,11 +190,9 @@ protected Iterator edgesOfVertex(Id source, Directions dir, return results; } - Query query = new Query(HugeType.EDGE); - query.limit(limit); + long[] count = new long[1]; return new LimitIterator<>(results, e -> { - long count = query.goOffset(1L); - return query.reachLimit(count - 1L); + return count[0]++ >= limit; }); } From ddc0f479afc258c4a6516c07981da980272864c6 Mon Sep 17 00:00:00 2001 From: imbajin Date: Wed, 19 May 2021 21:10:17 +0800 Subject: [PATCH 3/4] refact: remove sourceV from Kneighbor default results also need change relative test (carefully) --- .../baidu/hugegraph/traversal/algorithm/KneighborTraverser.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/KneighborTraverser.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/KneighborTraverser.java index 1fadd50147..bd306bf4df 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/KneighborTraverser.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/KneighborTraverser.java @@ -86,7 +86,6 @@ public Set customizedKneighbor(Id source, EdgeStep step, int maxDepth, Node sourceV = new KNode(source, null); latest.add(sourceV); - all.add(sourceV); while (maxDepth-- > 0) { long remaining = limit == NO_LIMIT ? NO_LIMIT : limit - all.size(); From 1a174db2babac7e8f4e82f7f5cadf98c5037d432 Mon Sep 17 00:00:00 2001 From: imbajin Date: Fri, 21 May 2021 15:52:52 +0800 Subject: [PATCH 4/4] fix: kneighbor may loss data with limit if current layer have same edges --- .../com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java index 6242c4bb0e..ec1fb3ad1b 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/traversal/algorithm/HugeTraverser.java @@ -149,7 +149,8 @@ protected Set adjacentVertices(Set vertices, EdgeStep step, while (edges.hasNext()) { Id target = ((HugeEdge) edges.next()).id().otherVertexId(); KNode kNode = new KNode(target, (KNode) source); - if (excluded != null && excluded.contains(kNode)) { + if ((excluded != null && excluded.contains(kNode)) || + neighbors.contains(kNode)) { continue; } neighbors.add(kNode);