Skip to content

Commit cb4ddd1

Browse files
Do for KSpanning
1 parent d712ee2 commit cb4ddd1

File tree

4 files changed

+185
-10
lines changed

4 files changed

+185
-10
lines changed

procedures/pushback-procedures-facade/src/main/java/org/neo4j/gds/procedures/algorithms/pathfinding/write/KSpanningTreeWriteResultTransformer.java

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,71 @@
1919
*/
2020
package org.neo4j.gds.procedures.algorithms.pathfinding.write;
2121

22-
import org.neo4j.gds.core.loading.GraphResources;
23-
import org.neo4j.gds.kspanningtree.KSpanningTreeWriteConfig;
22+
import org.neo4j.gds.api.Graph;
23+
import org.neo4j.gds.api.GraphStore;
24+
import org.neo4j.gds.api.ResultStore;
25+
import org.neo4j.gds.core.utils.ProgressTimer;
26+
import org.neo4j.gds.core.utils.progress.JobId;
2427
import org.neo4j.gds.pathfinding.KSpanningTreeWriteStep;
2528
import org.neo4j.gds.procedures.algorithms.pathfinding.KSpanningTreeWriteResult;
2629
import org.neo4j.gds.result.TimedAlgorithmResult;
2730
import org.neo4j.gds.results.ResultTransformer;
28-
import org.neo4j.gds.results.ResultTransformerBuilder;
2931
import org.neo4j.gds.spanningtree.SpanningTree;
3032

33+
import java.util.Map;
34+
import java.util.concurrent.atomic.AtomicLong;
3135
import java.util.stream.Stream;
3236

33-
class KSpanningTreeWriteResultTransformer implements ResultTransformerBuilder<TimedAlgorithmResult<SpanningTree>, Stream<KSpanningTreeWriteResult>> {
37+
class KSpanningTreeWriteResultTransformer implements ResultTransformer<TimedAlgorithmResult<SpanningTree>, Stream<KSpanningTreeWriteResult>> {
3438

35-
KSpanningTreeWriteResultTransformer(KSpanningTreeWriteStep writeStep, KSpanningTreeWriteConfig config) {}
39+
private final KSpanningTreeWriteStep writeStep;
40+
private final Graph graph;
41+
private final GraphStore graphStore;
42+
@Deprecated(forRemoval = true)
43+
private final ResultStore resultStore;
44+
private final JobId jobId;
45+
private final Map<String, Object> configuration;
3646

37-
@Override
38-
public ResultTransformer<TimedAlgorithmResult<SpanningTree>, Stream<KSpanningTreeWriteResult>> build(GraphResources graphResources) {
39-
return ar -> Stream.empty();
47+
KSpanningTreeWriteResultTransformer(
48+
KSpanningTreeWriteStep writeStep,
49+
Graph graph,
50+
GraphStore graphStore,
51+
ResultStore resultStore,
52+
JobId jobId,
53+
Map<String, Object> configuration
54+
) {
55+
this.writeStep = writeStep;
56+
this.graph = graph;
57+
this.graphStore = graphStore;
58+
this.resultStore = resultStore;
59+
this.jobId = jobId;
60+
this.configuration = configuration;
61+
}
62+
63+
@Override
64+
public Stream<KSpanningTreeWriteResult> apply(TimedAlgorithmResult<SpanningTree> algorithmResult) {
65+
var writeMillis = new AtomicLong();
66+
var result = algorithmResult.result();
67+
try (var ignored = ProgressTimer.start(writeMillis::set)) {
68+
writeStep.execute(
69+
graph,
70+
graphStore,
71+
resultStore,
72+
result,
73+
jobId
74+
);
75+
}
76+
77+
return Stream.of(
78+
new KSpanningTreeWriteResult(
79+
0,
80+
algorithmResult.computeMillis(),
81+
writeMillis.get(),
82+
0,
83+
result.effectiveNodeCount(),
84+
configuration
85+
)
86+
);
87+
}
4088
}
41-
}
89+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.procedures.algorithms.pathfinding.write;
21+
22+
import org.neo4j.gds.core.loading.GraphResources;
23+
import org.neo4j.gds.kspanningtree.KSpanningTreeWriteConfig;
24+
import org.neo4j.gds.pathfinding.KSpanningTreeWriteStep;
25+
import org.neo4j.gds.procedures.algorithms.pathfinding.KSpanningTreeWriteResult;
26+
import org.neo4j.gds.result.TimedAlgorithmResult;
27+
import org.neo4j.gds.results.ResultTransformer;
28+
import org.neo4j.gds.results.ResultTransformerBuilder;
29+
import org.neo4j.gds.spanningtree.SpanningTree;
30+
31+
import java.util.stream.Stream;
32+
33+
public class KSpanningTreeWriteResultTransformerBuilder implements ResultTransformerBuilder<TimedAlgorithmResult<SpanningTree>, Stream<KSpanningTreeWriteResult>> {
34+
35+
private final KSpanningTreeWriteStep writeStep;
36+
private final KSpanningTreeWriteConfig config;
37+
38+
KSpanningTreeWriteResultTransformerBuilder(KSpanningTreeWriteStep writeStep, KSpanningTreeWriteConfig config) {
39+
this.writeStep = writeStep;
40+
this.config = config;
41+
}
42+
43+
@Override
44+
public ResultTransformer<TimedAlgorithmResult<SpanningTree>, Stream<KSpanningTreeWriteResult>> build(GraphResources graphResources) {
45+
return new KSpanningTreeWriteResultTransformer(
46+
writeStep,
47+
graphResources.graph(),
48+
graphResources.graphStore(),
49+
graphResources.resultStore(),
50+
config.jobId(),
51+
config.toMap()
52+
);
53+
}
54+
55+
}

procedures/pushback-procedures-facade/src/main/java/org/neo4j/gds/procedures/algorithms/pathfinding/write/PushbackPathFindingWriteProcedureFacade.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public Stream<KSpanningTreeWriteResult> kSpanningTree(
162162
config.toKSpanningTreeParameters(),
163163
config.jobId(),
164164
config.logProgress(),
165-
new KSpanningTreeWriteResultTransformer(writeStep, config)
165+
new KSpanningTreeWriteResultTransformerBuilder(writeStep, config)
166166
).join();
167167
}
168168

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Copyright (c) "Neo4j"
3+
* Neo4j Sweden AB [http://neo4j.com]
4+
*
5+
* This file is part of Neo4j.
6+
*
7+
* Neo4j is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
package org.neo4j.gds.procedures.algorithms.pathfinding.write;
21+
22+
import org.junit.jupiter.api.Test;
23+
import org.neo4j.gds.api.Graph;
24+
import org.neo4j.gds.api.GraphStore;
25+
import org.neo4j.gds.api.ResultStore;
26+
import org.neo4j.gds.core.utils.progress.JobId;
27+
import org.neo4j.gds.pathfinding.KSpanningTreeWriteStep;
28+
import org.neo4j.gds.result.TimedAlgorithmResult;
29+
import org.neo4j.gds.spanningtree.SpanningTree;
30+
31+
import java.util.Map;
32+
33+
import static org.assertj.core.api.Assertions.assertThat;
34+
import static org.mockito.Mockito.mock;
35+
import static org.mockito.Mockito.times;
36+
import static org.mockito.Mockito.verify;
37+
import static org.mockito.Mockito.verifyNoMoreInteractions;
38+
import static org.mockito.Mockito.when;
39+
40+
class KSpanningTreeWriteResultTransformerTest {
41+
42+
@Test
43+
void shouldTransformToWriteResult() {
44+
var config = Map.<String, Object>of("foo", "bar");
45+
var graph = mock(Graph.class);
46+
var graphStore = mock(GraphStore.class);
47+
var resultStore = mock(ResultStore.class);
48+
var jobId = new JobId();
49+
var writeStep = mock(KSpanningTreeWriteStep.class);
50+
51+
var algoResult = mock(SpanningTree.class);
52+
when(algoResult.effectiveNodeCount()).thenReturn(1L);
53+
when(algoResult.totalWeight()).thenReturn(3d);
54+
55+
var timedResult = new TimedAlgorithmResult<>(algoResult, 123L);
56+
57+
var transformer = new KSpanningTreeWriteResultTransformer(writeStep, graph, graphStore, resultStore, jobId, config);
58+
59+
var resultStream = transformer.apply(timedResult);
60+
var result = resultStream.findFirst().orElseThrow();
61+
62+
assertThat(result.preProcessingMillis()).isZero();
63+
assertThat(result.computeMillis()).isEqualTo(123L);
64+
assertThat(result.writeMillis()).isNotNegative();
65+
assertThat(result.configuration()).isEqualTo(config);
66+
assertThat(result.effectiveNodeCount()).isEqualTo(1L);
67+
68+
verify(writeStep, times(1)).execute(graph, graphStore, resultStore, algoResult, jobId);
69+
verifyNoMoreInteractions(writeStep);
70+
}
71+
72+
}

0 commit comments

Comments
 (0)