Skip to content

Commit eccd398

Browse files
committed
Extend the test for individual nodes, and fix bug that arose
1 parent 998e07f commit eccd398

File tree

4 files changed

+33
-15
lines changed

4 files changed

+33
-15
lines changed

dnainator-core/src/main/java/nl/tudelft/dnainator/graph/impl/query/AllClustersQuery.java

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
import org.neo4j.graphdb.Node;
1919
import org.neo4j.graphdb.Path;
2020
import org.neo4j.graphdb.PathExpanders;
21+
import org.neo4j.graphdb.ResourceIterable;
2122
import org.neo4j.graphdb.traversal.Evaluation;
22-
import org.neo4j.graphdb.traversal.TraversalDescription;
2323
import org.neo4j.helpers.collection.IteratorUtil;
2424

2525
import java.util.ArrayList;
@@ -63,7 +63,9 @@ public AllClustersQuery(int minRank, int maxRank, int threshold,
6363
this.is = is;
6464
}
6565

66-
private TraversalDescription untilMaxRank(GraphDatabaseService service) {
66+
private ResourceIterable<Node> untilMaxRank(GraphDatabaseService service) {
67+
Iterable<Node> start = IteratorUtil.loop(service.findNodes(NodeLabels.NODE,
68+
SequenceProperties.RANK.name(), minRank));
6769
return service.traversalDescription()
6870
.breadthFirst()
6971
.evaluator(path -> {
@@ -74,23 +76,28 @@ private TraversalDescription untilMaxRank(GraphDatabaseService service) {
7476
return Evaluation.EXCLUDE_AND_PRUNE;
7577
}
7678
})
77-
.relationships(RelTypes.NEXT, Direction.OUTGOING);
79+
.relationships(RelTypes.NEXT, Direction.OUTGOING)
80+
.traverse(start).nodes();
7881
}
7982

8083
@Override
8184
public Map<Integer, List<Cluster>> execute(GraphDatabaseService service) {
85+
Map<Integer, List<Cluster>> individualNodes = new HashMap<>();
8286
Set<Long> bubbleSourcesNested = new HashSet<>();
8387
Set<Long> bubbleSourcesToCluster = new HashSet<>();
8488
Set<Long> bubbleSourcesToKeepIntact = new HashSet<>();
85-
Iterable<Node> start = IteratorUtil.loop(service.findNodes(NodeLabels.NODE,
86-
SequenceProperties.RANK.name(), minRank));
87-
for (Node n : untilMaxRank(service).traverse(start).nodes()) {
89+
for (Node n : untilMaxRank(service)) {
8890
if (n.hasLabel(NodeLabels.BUBBLE_SOURCE)) {
8991
bubbleSourcesToCluster.add(n.getId());
90-
if (((long[]) n.getProperty(BubbleProperties.BUBBLE_SOURCE_IDS.name()))
91-
.length > 0) {
92+
if (getBubbleIDs(n).length > 0) {
9293
bubbleSourcesNested.add(n.getId());
9394
}
95+
} else {
96+
if (getBubbleIDs(n).length == 0) {
97+
Cluster individualNode = createSingletonCluster(service, n);
98+
individualNodes.put(individualNode.getStartRank(),
99+
Collections.singletonList(individualNode));
100+
}
94101
}
95102
int interestingness = is.compute(new Neo4jScoreContainer(n));
96103
n.setProperty(SequenceProperties.INTERESTINGNESS.name(), interestingness);
@@ -103,7 +110,12 @@ public Map<Integer, List<Cluster>> execute(GraphDatabaseService service) {
103110
}
104111
}
105112
bubbleSourcesToCluster.removeAll(bubbleSourcesNested);
106-
return cluster(service, bubbleSourcesToCluster, bubbleSourcesToKeepIntact);
113+
return mergeMaps(Stream.of(individualNodes,
114+
cluster(service, bubbleSourcesToCluster, bubbleSourcesToKeepIntact)));
115+
}
116+
117+
private long[] getBubbleIDs(Node n) {
118+
return (long[]) n.getProperty(BubbleProperties.BUBBLE_SOURCE_IDS.name());
107119
}
108120

109121
private Map<Integer, List<Cluster>> cluster(GraphDatabaseService service,

dnainator-core/src/test/java/nl/tudelft/dnainator/graph/impl/Neo4jClusterTest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,24 @@ public void test() {
6363
// CHECKSTYLE.OFF: MagicNumber
6464
Map<Integer, List<Cluster>> clusters = db.getAllClusters(0, Integer.MAX_VALUE, 11);
6565

66+
// The root node is not associated with a bubble, so it should be a singleton cluster.
67+
assertUnorderedIDEquals(Sets.newSet("0"), clusters.get(0).get(0).getNodes());
68+
6669
// first bubble is not clustered because one node has length greater than 11.
67-
assertUnorderedIDEquals(Sets.newSet("1"), clusters.get(0).get(0).getNodes());
70+
assertUnorderedIDEquals(Sets.newSet("1"), clusters.get(1).get(0).getNodes());
6871

6972
// 2 and 3 Expected on rank 1
70-
assertUnorderedIDEquals(Sets.newSet("2"), clusters.get(1).get(1).getNodes());
71-
assertUnorderedIDEquals(Sets.newSet("3"), clusters.get(1).get(0).getNodes());
73+
assertUnorderedIDEquals(Sets.newSet("2"), clusters.get(2).get(1).getNodes());
74+
assertUnorderedIDEquals(Sets.newSet("3"), clusters.get(2).get(0).getNodes());
7275

7376
// Source node is not collapsed.
74-
assertUnorderedIDEquals(Sets.newSet("4"), clusters.get(2).get(0).getNodes());
77+
assertUnorderedIDEquals(Sets.newSet("4"), clusters.get(3).get(0).getNodes());
7578

7679
// Collapsed bubble.
77-
assertUnorderedIDEquals(Sets.newSet("5", "6", "7"), clusters.get(3).get(0).getNodes());
80+
assertUnorderedIDEquals(Sets.newSet("5", "6", "7"), clusters.get(4).get(0).getNodes());
7881

7982
// Sink node is not collapsed.
80-
assertUnorderedIDEquals(Sets.newSet("8"), clusters.get(5).get(0).getNodes());
83+
assertUnorderedIDEquals(Sets.newSet("8"), clusters.get(6).get(0).getNodes());
8184
// CHECKSTYLE.ON: MagicNumber
8285
}
8386

dnainator-core/src/test/resources/strains/cluster.edge.graph

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
0 1
12
1 2
23
1 3
34
2 4

dnainator-core/src/test/resources/strains/cluster.node.graph

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
> 0 | LENGTH 20 | 0 | 0
2+
TATATATATATATATATATA
13
> 1 | LENGTH 10 | 0 | 0
24
TATATATATA
35
> 2 | LENGTH 12 | 0 | 0

0 commit comments

Comments
 (0)