Skip to content

Commit bde4aa8

Browse files
committed
Move constructing a NodeLabelTokenSet behind compat API
There is not test-case for this change as our test setup would not cover this kind of issue. We could add another green test, but it's won't be a test that is red without this change. The problem is that we build and ship something compiled against 4.4 and then run it on 5.x where x >= 14 and we don't have a setup to verify that all our tests also run on that configuration. Using the incompatability detection script: ``` $ cargo run --quiet --release -- --diff="git diff --no-ext-diff --no-index --word-diff" --base '=5.11' --compare '=5.16' ``` Before this change it flagged ```diff diff --git var/folders/pv/j3pyfc7932j5lh16zk8w3v9m0000gp/T/gds/incompat_detector/api_usage_5.11.0.yml var/folders/pv/j3pyfc7932j5lh16zk8w3v9m0000gp/T/gds/incompat_detector/api_usage_5.16.0.yml index 4540337cbb..99366feb62 100644 --- var/folders/pv/j3pyfc7932j5lh16zk8w3v9m0000gp/T/gds/incompat_detector/api_usage_5.11.0.yml +++ var/folders/pv/j3pyfc7932j5lh16zk8w3v9m0000gp/T/gds/incompat_detector/api_usage_5.16.0.yml @@ -5,6 +5,6 @@ usages: TokenSet: all: - method: "public static final synchronized [-long[]-]{+int[]+} org.neo4j.internal.kernel.api.TokenSet#all()" caller: public org.neo4j.gds.core.loading.NodeLabelTokenSet org.neo4j.gds.projection.NodeCursorReference#labels() location: NodeCursorReference.java Error: ``` After this change: ```sh ```
1 parent 1fcaa09 commit bde4aa8

File tree

11 files changed

+105
-1
lines changed

11 files changed

+105
-1
lines changed

compatibility/4.4/neo4j-kernel-adapter/src/main/java/org/neo4j/gds/compat/_44/Neo4jProxyImpl.java

+10
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
import java.util.Optional;
137137
import java.util.Set;
138138
import java.util.concurrent.TimeUnit;
139+
import java.util.function.Function;
139140
import java.util.stream.Collectors;
140141
import java.util.stream.Stream;
141142

@@ -871,4 +872,13 @@ public String neo4jArrowServerAddressHeader() {
871872
public String metricsManagerClass() {
872873
return "com.neo4j.metrics.global.MetricsManager";
873874
}
875+
876+
@Override
877+
public <T> T nodeLabelTokenSet(
878+
NodeCursor nodeCursor,
879+
Function<int[], T> intsConstructor,
880+
Function<long[], T> longsConstructor
881+
) {
882+
return longsConstructor.apply(nodeCursor.labels().all());
883+
}
874884
}

compatibility/5.11/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_511/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.neo4j.gds.compat._5x.CommonNeo4jProxyImpl;
2828
import org.neo4j.graphdb.GraphDatabaseService;
2929
import org.neo4j.internal.kernel.api.Cursor;
30+
import org.neo4j.internal.kernel.api.NodeCursor;
3031
import org.neo4j.internal.kernel.api.PartitionedScan;
3132
import org.neo4j.internal.kernel.api.Read;
3233
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
@@ -51,6 +52,7 @@
5152
import java.util.List;
5253
import java.util.Optional;
5354
import java.util.Set;
55+
import java.util.function.Function;
5456
import java.util.stream.Stream;
5557

5658
public final class Neo4jProxyImpl extends CommonNeo4jProxyImpl {
@@ -206,4 +208,13 @@ public long estimateNodeCount(Read read, int label) {
206208
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
207209
return read.countsForRelationshipWithoutTxState(sourceLabel, type, targetLabel);
208210
}
211+
212+
@Override
213+
public <T> T nodeLabelTokenSet(
214+
NodeCursor nodeCursor,
215+
Function<int[], T> intsConstructor,
216+
Function<long[], T> longsConstructor
217+
) {
218+
return longsConstructor.apply(nodeCursor.labels().all());
219+
}
209220
}

compatibility/5.12/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_512/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.neo4j.gds.compat._5x.CommonNeo4jProxyImpl;
2828
import org.neo4j.graphdb.GraphDatabaseService;
2929
import org.neo4j.internal.kernel.api.Cursor;
30+
import org.neo4j.internal.kernel.api.NodeCursor;
3031
import org.neo4j.internal.kernel.api.PartitionedScan;
3132
import org.neo4j.internal.kernel.api.Read;
3233
import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
@@ -51,6 +52,7 @@
5152
import java.util.List;
5253
import java.util.Optional;
5354
import java.util.Set;
55+
import java.util.function.Function;
5456
import java.util.stream.Stream;
5557

5658
public final class Neo4jProxyImpl extends CommonNeo4jProxyImpl {
@@ -206,4 +208,13 @@ public long estimateNodeCount(Read read, int label) {
206208
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
207209
return read.countsForRelationshipWithoutTxState(sourceLabel, type, targetLabel);
208210
}
211+
212+
@Override
213+
public <T> T nodeLabelTokenSet(
214+
NodeCursor nodeCursor,
215+
Function<int[], T> intsConstructor,
216+
Function<long[], T> longsConstructor
217+
) {
218+
return longsConstructor.apply(nodeCursor.labels().all());
219+
}
209220
}

compatibility/5.13/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_513/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.gds.compat._5x.CompatAccessModeImpl;
3030
import org.neo4j.graphdb.GraphDatabaseService;
3131
import org.neo4j.internal.kernel.api.Cursor;
32+
import org.neo4j.internal.kernel.api.NodeCursor;
3233
import org.neo4j.internal.kernel.api.PartitionedScan;
3334
import org.neo4j.internal.kernel.api.Read;
3435
import org.neo4j.internal.kernel.api.TokenSet;
@@ -55,6 +56,7 @@
5556
import java.util.List;
5657
import java.util.Optional;
5758
import java.util.Set;
59+
import java.util.function.Function;
5860
import java.util.function.Supplier;
5961
import java.util.stream.Stream;
6062

@@ -225,4 +227,13 @@ public long estimateNodeCount(Read read, int label) {
225227
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
226228
return read.countsForRelationshipWithoutTxState(sourceLabel, type, targetLabel);
227229
}
230+
231+
@Override
232+
public <T> T nodeLabelTokenSet(
233+
NodeCursor nodeCursor,
234+
Function<int[], T> intsConstructor,
235+
Function<long[], T> longsConstructor
236+
) {
237+
return longsConstructor.apply(nodeCursor.labels().all());
238+
}
228239
}

compatibility/5.14/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_514/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.gds.compat._5x.CompatAccessModeImpl;
3030
import org.neo4j.graphdb.GraphDatabaseService;
3131
import org.neo4j.internal.kernel.api.Cursor;
32+
import org.neo4j.internal.kernel.api.NodeCursor;
3233
import org.neo4j.internal.kernel.api.PartitionedScan;
3334
import org.neo4j.internal.kernel.api.Read;
3435
import org.neo4j.internal.kernel.api.TokenSet;
@@ -55,6 +56,7 @@
5556
import java.util.List;
5657
import java.util.Optional;
5758
import java.util.Set;
59+
import java.util.function.Function;
5860
import java.util.function.Supplier;
5961
import java.util.stream.Stream;
6062

@@ -226,4 +228,13 @@ public long estimateNodeCount(Read read, int label) {
226228
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
227229
return read.countsForRelationshipWithoutTxState(sourceLabel, type, targetLabel);
228230
}
231+
232+
@Override
233+
public <T> T nodeLabelTokenSet(
234+
NodeCursor nodeCursor,
235+
Function<int[], T> intsConstructor,
236+
Function<long[], T> longsConstructor
237+
) {
238+
return intsConstructor.apply(nodeCursor.labels().all());
239+
}
229240
}

compatibility/5.15/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_515/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.gds.compat._5x.CompatAccessModeImpl;
3030
import org.neo4j.graphdb.GraphDatabaseService;
3131
import org.neo4j.internal.kernel.api.Cursor;
32+
import org.neo4j.internal.kernel.api.NodeCursor;
3233
import org.neo4j.internal.kernel.api.PartitionedScan;
3334
import org.neo4j.internal.kernel.api.Read;
3435
import org.neo4j.internal.kernel.api.TokenSet;
@@ -55,6 +56,7 @@
5556
import java.util.List;
5657
import java.util.Optional;
5758
import java.util.Set;
59+
import java.util.function.Function;
5860
import java.util.function.Supplier;
5961
import java.util.stream.Stream;
6062

@@ -231,4 +233,13 @@ public long estimateNodeCount(Read read, int label) {
231233
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
232234
return read.estimateCountsForRelationships(sourceLabel, type, targetLabel);
233235
}
236+
237+
@Override
238+
public <T> T nodeLabelTokenSet(
239+
NodeCursor nodeCursor,
240+
Function<int[], T> intsConstructor,
241+
Function<long[], T> longsConstructor
242+
) {
243+
return intsConstructor.apply(nodeCursor.labels().all());
244+
}
234245
}

compatibility/5.16/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_516/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.gds.compat._5x.CompatAccessModeImpl;
3030
import org.neo4j.graphdb.GraphDatabaseService;
3131
import org.neo4j.internal.kernel.api.Cursor;
32+
import org.neo4j.internal.kernel.api.NodeCursor;
3233
import org.neo4j.internal.kernel.api.PartitionedScan;
3334
import org.neo4j.internal.kernel.api.Read;
3435
import org.neo4j.internal.kernel.api.TokenSet;
@@ -55,6 +56,7 @@
5556
import java.util.List;
5657
import java.util.Optional;
5758
import java.util.Set;
59+
import java.util.function.Function;
5860
import java.util.function.Supplier;
5961
import java.util.stream.Stream;
6062

@@ -231,4 +233,13 @@ public long estimateNodeCount(Read read, int label) {
231233
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
232234
return read.estimateCountsForRelationships(sourceLabel, type, targetLabel);
233235
}
236+
237+
@Override
238+
public <T> T nodeLabelTokenSet(
239+
NodeCursor nodeCursor,
240+
Function<int[], T> intsConstructor,
241+
Function<long[], T> longsConstructor
242+
) {
243+
return intsConstructor.apply(nodeCursor.labels().all());
244+
}
234245
}

compatibility/5.17/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_517/Neo4jProxyImpl.java

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.neo4j.gds.compat._5x.CompatAccessModeImpl;
3030
import org.neo4j.graphdb.GraphDatabaseService;
3131
import org.neo4j.internal.kernel.api.Cursor;
32+
import org.neo4j.internal.kernel.api.NodeCursor;
3233
import org.neo4j.internal.kernel.api.PartitionedScan;
3334
import org.neo4j.internal.kernel.api.Read;
3435
import org.neo4j.internal.kernel.api.TokenSet;
@@ -55,6 +56,7 @@
5556
import java.util.List;
5657
import java.util.Optional;
5758
import java.util.Set;
59+
import java.util.function.Function;
5860
import java.util.function.Supplier;
5961
import java.util.stream.Stream;
6062

@@ -231,4 +233,13 @@ public long estimateNodeCount(Read read, int label) {
231233
public long estimateRelationshipCount(Read read, int sourceLabel, int targetLabel, int type) {
232234
return read.estimateCountsForRelationships(sourceLabel, type, targetLabel);
233235
}
236+
237+
@Override
238+
public <T> T nodeLabelTokenSet(
239+
NodeCursor nodeCursor,
240+
Function<int[], T> intsConstructor,
241+
Function<long[], T> longsConstructor
242+
) {
243+
return intsConstructor.apply(nodeCursor.labels().all());
244+
}
234245
}

compatibility/api/neo4j-kernel-adapter/src/main/java/org/neo4j/gds/compat/Neo4jProxyApi.java

+8
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
import java.nio.file.Path;
8989
import java.util.List;
9090
import java.util.Optional;
91+
import java.util.function.Function;
9192

9293
public interface Neo4jProxyApi {
9394

@@ -322,4 +323,11 @@ TransactionalContext newQueryContext(
322323
String neo4jArrowServerAddressHeader();
323324

324325
String metricsManagerClass();
326+
327+
<T> T nodeLabelTokenSet(
328+
NodeCursor nodeCursor,
329+
Function<int[], T> intsConstructor,
330+
Function<long[], T> longsConstructor
331+
);
332+
325333
}

compatibility/common/neo4j-kernel-adapter/src/main/java/org/neo4j/gds/compat/Neo4jProxy.java

+9
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
import java.nio.file.Path;
8787
import java.util.List;
8888
import java.util.Optional;
89+
import java.util.function.Function;
8990

9091
public final class Neo4jProxy {
9192

@@ -492,4 +493,12 @@ private Neo4jProxy() {
492493
public static String metricsManagerClass() {
493494
return IMPL.metricsManagerClass();
494495
}
496+
497+
public static <T> T nodeLabelTokenSet(
498+
NodeCursor nodeCursor,
499+
Function<int[], T> intsConstructor,
500+
Function<long[], T> longsConstructor
501+
) {
502+
return IMPL.nodeLabelTokenSet(nodeCursor, intsConstructor, longsConstructor);
503+
}
495504
}

native-projection/src/main/java/org/neo4j/gds/projection/NodeCursorReference.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public long nodeId() {
3939

4040
@Override
4141
public NodeLabelTokenSet labels() {
42-
return NodeLabelTokenSet.from(nodeCursor.labels().all());
42+
return Neo4jProxy.nodeLabelTokenSet(nodeCursor, NodeLabelTokenSet::from, NodeLabelTokenSet::from);
4343
}
4444

4545
@Override

0 commit comments

Comments
 (0)