Skip to content

Commit ac6a8a4

Browse files
committed
Move KSpanningTreeWriteStep to dedicated module
1 parent 7701956 commit ac6a8a4

File tree

5 files changed

+61
-30
lines changed

5 files changed

+61
-30
lines changed

applications/algorithms/path-finding/src/main/java/org/neo4j/gds/applications/algorithms/pathfinding/PathFindingAlgorithmsWriteModeBusinessFacade.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.neo4j.gds.logging.Log;
3838
import org.neo4j.gds.mem.MemoryEstimation;
3939
import org.neo4j.gds.pathfinding.BellmanFordWriteStep;
40+
import org.neo4j.gds.pathfinding.KSpanningTreeWriteStep;
4041
import org.neo4j.gds.paths.WritePathOptionsConfig;
4142
import org.neo4j.gds.paths.astar.config.ShortestPathAStarWriteConfig;
4243
import org.neo4j.gds.paths.bellmanford.AllShortestPathsBellmanFordWriteConfig;
@@ -144,10 +145,14 @@ public <RESULT> RESULT kSpanningTree(
144145
ResultBuilder<KSpanningTreeWriteConfig, SpanningTree, RESULT, Void> resultBuilder
145146
) {
146147
var writeStep = new KSpanningTreeWriteStep(
147-
log,
148-
requestScopedDependencies,
148+
configuration.writeProperty(),
149149
writeContext,
150-
configuration
150+
configuration::resolveResultStore,
151+
configuration.jobId(),
152+
configuration.writeConcurrency(),
153+
log,
154+
requestScopedDependencies.taskRegistryFactory(),
155+
requestScopedDependencies.terminationFlag()
151156
);
152157

153158
return runAlgorithmAndWrite(

procedures/path-finding-write-steps/build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ dependencies {
1515
// extract them in a separate project and bring it instead
1616
implementation project(':algo')
1717

18+
// FIXME: AlgorithmLabel 🙄
19+
implementation project(':algo-common')
20+
1821
implementation project(':algorithms-machinery')
1922

2023
// FIXME: Massively annoying we need to bring this in because services use configs;
@@ -25,4 +28,9 @@ dependencies {
2528
implementation project(':core-api')
2629
implementation project(':logging')
2730
implementation project(':string-formatting')
31+
32+
// FIXME: These don't belong here, the write should be abstracted via service.
33+
implementation project(':core-write')
34+
implementation project(':progress-tracking')
35+
implementation project(':termination')
2836
}

applications/algorithms/path-finding/src/main/java/org/neo4j/gds/applications/algorithms/pathfinding/KSpanningTreeBackedNodePropertyValues.java renamed to procedures/path-finding-write-steps/src/main/java/org/neo4j/gds/pathfinding/KSpanningTreeBackedNodePropertyValues.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@
1717
* You should have received a copy of the GNU General Public License
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
20-
package org.neo4j.gds.applications.algorithms.pathfinding;
20+
package org.neo4j.gds.pathfinding;
2121

2222
import org.neo4j.gds.api.properties.nodes.LongNodePropertyValues;
2323
import org.neo4j.gds.spanningtree.SpanningTree;
2424

25-
public class KSpanningTreeBackedNodePropertyValues implements LongNodePropertyValues {
25+
class KSpanningTreeBackedNodePropertyValues implements LongNodePropertyValues {
2626
private final SpanningTree spanningTree;
2727
private final long nodeCount;
2828

29-
public KSpanningTreeBackedNodePropertyValues(
29+
KSpanningTreeBackedNodePropertyValues(
3030
SpanningTree spanningTree,
3131
long nodeCount
3232
) {

applications/algorithms/path-finding/src/main/java/org/neo4j/gds/applications/algorithms/pathfinding/KSpanningTreeWriteStep.java renamed to procedures/path-finding-write-steps/src/main/java/org/neo4j/gds/pathfinding/KSpanningTreeWriteStep.java

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -17,40 +17,58 @@
1717
* You should have received a copy of the GNU General Public License
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
20-
package org.neo4j.gds.applications.algorithms.pathfinding;
20+
package org.neo4j.gds.pathfinding;
2121

2222
import org.neo4j.gds.api.Graph;
2323
import org.neo4j.gds.api.GraphStore;
2424
import org.neo4j.gds.api.ResultStore;
2525
import org.neo4j.gds.applications.algorithms.machinery.AlgorithmLabel;
26-
import org.neo4j.gds.applications.algorithms.machinery.RequestScopedDependencies;
2726
import org.neo4j.gds.applications.algorithms.machinery.WriteContext;
2827
import org.neo4j.gds.applications.algorithms.machinery.WriteStep;
28+
import org.neo4j.gds.core.concurrency.Concurrency;
2929
import org.neo4j.gds.core.utils.logging.LoggerForProgressTrackingAdapter;
3030
import org.neo4j.gds.core.utils.progress.JobId;
31+
import org.neo4j.gds.core.utils.progress.TaskRegistryFactory;
3132
import org.neo4j.gds.core.utils.progress.tasks.TaskProgressTracker;
3233
import org.neo4j.gds.core.write.NodePropertyExporter;
33-
import org.neo4j.gds.kspanningtree.KSpanningTreeWriteConfig;
3434
import org.neo4j.gds.logging.Log;
3535
import org.neo4j.gds.spanningtree.SpanningTree;
36+
import org.neo4j.gds.termination.TerminationFlag;
3637

37-
class KSpanningTreeWriteStep implements WriteStep<SpanningTree, Void> {
38+
import java.util.Optional;
39+
import java.util.function.Function;
40+
41+
// FIXME: This implementation is not what we would like it to be.
42+
// We need to abstract the write operation to a write service and not create the individual exporters here.
43+
public class KSpanningTreeWriteStep implements WriteStep<SpanningTree, Void> {
44+
45+
private final String writeProperty;
3846
private final Log log;
39-
private final RequestScopedDependencies requestScopedDependencies;
4047
private final WriteContext writeContext;
41-
private final KSpanningTreeWriteConfig configuration;
42-
48+
private final Function<ResultStore, Optional<ResultStore>> resultStoreResolver;
49+
private final JobId jobId;
50+
private final Concurrency writeConcurrency;
51+
private final TaskRegistryFactory taskRegistryFactory;
52+
private final TerminationFlag terminationFlag;
4353

44-
KSpanningTreeWriteStep(
45-
Log log,
46-
RequestScopedDependencies requestScopedDependencies,
54+
public KSpanningTreeWriteStep(
55+
String writeProperty,
4756
WriteContext writeContext,
48-
KSpanningTreeWriteConfig configuration
57+
Function<ResultStore, Optional<ResultStore>> resultStoreResolver,
58+
JobId jobId,
59+
Concurrency writeConcurrency,
60+
Log log,
61+
TaskRegistryFactory taskRegistryFactory,
62+
TerminationFlag terminationFlag
4963
) {
64+
this.writeProperty = writeProperty;
5065
this.log = log;
51-
this.requestScopedDependencies = requestScopedDependencies;
5266
this.writeContext = writeContext;
53-
this.configuration = configuration;
67+
this.resultStoreResolver = resultStoreResolver;
68+
this.jobId = jobId;
69+
this.writeConcurrency = writeConcurrency;
70+
this.taskRegistryFactory = taskRegistryFactory;
71+
this.terminationFlag = terminationFlag;
5472
}
5573

5674
@Override
@@ -66,20 +84,20 @@ public Void execute(
6684
var progressTracker = new TaskProgressTracker(
6785
NodePropertyExporter.baseTask(AlgorithmLabel.KSpanningTree.asString(), graph.nodeCount()),
6886
new LoggerForProgressTrackingAdapter(log),
69-
configuration.writeConcurrency(),
70-
requestScopedDependencies.taskRegistryFactory()
87+
writeConcurrency,
88+
taskRegistryFactory
7189
);
7290

7391
var nodePropertyExporter = writeContext.nodePropertyExporterBuilder()
7492
.withIdMap(graph)
75-
.withTerminationFlag(requestScopedDependencies.terminationFlag())
93+
.withTerminationFlag(terminationFlag)
7694
.withProgressTracker(progressTracker)
77-
.withResultStore(configuration.resolveResultStore(resultStore))
78-
.withJobId(configuration.jobId())
95+
.withResultStore(resultStoreResolver.apply(resultStore))
96+
.withJobId(this.jobId)
7997
.build();
8098

8199
// effect
82-
nodePropertyExporter.write(configuration.writeProperty(), properties);
100+
nodePropertyExporter.write(writeProperty, properties);
83101

84102
// reporting
85103
// countsBuilder.withNodePropertiesWritten(...);

procedures/path-finding-write-steps/src/main/java/org/neo4j/gds/pathfinding/PathFindingWriteRelationshipSpecification.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
import java.util.List;
3030

31-
final class PathFindingWriteRelationshipSpecification {
31+
public final class PathFindingWriteRelationshipSpecification {
3232

3333
private static final String TOTAL_COST_KEY = "totalCost";
3434
private static final String NODE_IDS_KEY = "nodeIds";
@@ -39,13 +39,13 @@ final class PathFindingWriteRelationshipSpecification {
3939
private final boolean writeNodeIds;
4040
private final boolean writeCosts;
4141

42-
PathFindingWriteRelationshipSpecification(IdMap idMap, boolean writeNodeIds, boolean writeCosts) {
42+
public PathFindingWriteRelationshipSpecification(IdMap idMap, boolean writeNodeIds, boolean writeCosts) {
4343
this.idMap = idMap;
4444
this.writeNodeIds = writeNodeIds;
4545
this.writeCosts = writeCosts;
4646
}
4747

48-
List<String> createKeys() {
48+
public List<String> createKeys() {
4949
if (writeNodeIds && writeCosts) {
5050
return List.of(
5151
TOTAL_COST_KEY,
@@ -68,7 +68,7 @@ List<String> createKeys() {
6868
return List.of(TOTAL_COST_KEY);
6969
}
7070

71-
List<ValueType> createTypes() {
71+
public List<ValueType> createTypes() {
7272
if (writeNodeIds && writeCosts) {
7373
return List.of(
7474
ValueType.DOUBLE,
@@ -124,7 +124,7 @@ private long[] toOriginalIds( long[] internalIds) {
124124
return internalIds;
125125
}
126126

127-
ExportedRelationship createRelationship(PathResult pathResult){
127+
public ExportedRelationship createRelationship(PathResult pathResult){
128128
return new ExportedRelationship(
129129
pathResult.sourceNode(),
130130
pathResult.targetNode(),

0 commit comments

Comments
 (0)