Skip to content

Commit 6866721

Browse files
authored
Merge pull request #8855 from knutwalker/2.6-native-block
Try record and block formats when trying to find the highest node count
2 parents 2d1463a + ca7e8c0 commit 6866721

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,14 +537,14 @@ public ProcedureSignature procedureSignature(
537537
public long getHighestPossibleNodeCount(
538538
Read read, IdGeneratorFactory idGeneratorFactory
539539
) {
540-
return countByIdGenerator(idGeneratorFactory, RecordIdType.NODE).orElseGet(read::nodesGetCount);
540+
return countByIdGenerator(idGeneratorFactory, RecordIdType.NODE, RecordIdType.NODE);
541541
}
542542

543543
@Override
544544
public long getHighestPossibleRelationshipCount(
545545
Read read, IdGeneratorFactory idGeneratorFactory
546546
) {
547-
return countByIdGenerator(idGeneratorFactory, RecordIdType.RELATIONSHIP).orElseGet(read::relationshipsGetCount);
547+
return countByIdGenerator(idGeneratorFactory, RecordIdType.RELATIONSHIP, RecordIdType.RELATIONSHIP);
548548
}
549549

550550
@Override

compatibility/5-common/neo4j-kernel-adapter/src/main/java17/org/neo4j/gds/compat/_5x/CommonNeo4jProxyImpl.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
import java.nio.file.Path;
125125
import java.util.List;
126126
import java.util.Locale;
127+
import java.util.Objects;
127128
import java.util.Optional;
128129
import java.util.concurrent.TimeUnit;
129130

@@ -452,14 +453,45 @@ public Long pageCacheMemoryValue(String value) {
452453
public long getHighestPossibleNodeCount(
453454
Read read, IdGeneratorFactory idGeneratorFactory
454455
) {
455-
return countByIdGenerator(idGeneratorFactory, RecordIdType.NODE).orElseGet(read::nodesGetCount);
456+
return countByIdGenerator(idGeneratorFactory, RecordIdType.NODE, BlockFormat.INSTANCE.nodeType);
456457
}
457458

458459
@Override
459460
public long getHighestPossibleRelationshipCount(
460461
Read read, IdGeneratorFactory idGeneratorFactory
461462
) {
462-
return countByIdGenerator(idGeneratorFactory, RecordIdType.RELATIONSHIP).orElseGet(read::relationshipsGetCount);
463+
return countByIdGenerator(idGeneratorFactory, RecordIdType.RELATIONSHIP, BlockFormat.INSTANCE.relationshipType);
464+
}
465+
466+
private static final class BlockFormat {
467+
private static final BlockFormat INSTANCE = new BlockFormat();
468+
469+
private final org.neo4j.internal.id.IdType nodeType;
470+
private final org.neo4j.internal.id.IdType relationshipType;
471+
472+
BlockFormat() {
473+
org.neo4j.internal.id.IdType nodeType = null;
474+
org.neo4j.internal.id.IdType relationshipType = null;
475+
476+
try {
477+
var blockIdType = Class.forName("com.neo4j.internal.blockformat.BlockIdType");
478+
var blockTypes = Objects.requireNonNull(blockIdType.getEnumConstants());
479+
for (Object blockType : blockTypes) {
480+
var type = (Enum<?>) blockType;
481+
if (type.name().equals("NODE")) {
482+
nodeType = (org.neo4j.internal.id.IdType) type;
483+
} else if (type.name().equals("RELATIONSHIP")) {
484+
relationshipType = (org.neo4j.internal.id.IdType) type;
485+
}
486+
}
487+
} catch (ClassNotFoundException | NullPointerException | ClassCastException e) {
488+
nodeType = null;
489+
relationshipType = null;
490+
}
491+
492+
this.nodeType = Objects.requireNonNullElse(nodeType, RecordIdType.NODE);
493+
this.relationshipType = Objects.requireNonNullElse(relationshipType, RecordIdType.RELATIONSHIP);
494+
}
463495
}
464496

465497
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import java.util.Optional;
3333

3434
import static org.neo4j.gds.utils.GdsFeatureToggles.SKIP_ORPHANS;
35-
import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;
35+
import static org.neo4j.internal.kernel.api.Read.NO_ID;
3636

3737
public final class BufferedNodeConsumer implements StoreScanner.RecordConsumer<NodeReference> {
3838

neo4j-adapter/src/main/java/org/neo4j/gds/compat/InternalReadOps.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,19 @@
2828

2929
public final class InternalReadOps {
3030

31-
public static OptionalLong countByIdGenerator(@Nullable IdGeneratorFactory idGeneratorFactory, IdType idType) {
31+
public static long countByIdGenerator(
32+
@Nullable IdGeneratorFactory idGeneratorFactory,
33+
IdType idType,
34+
IdType idType2
35+
) {
36+
return countByIdGenerator(idGeneratorFactory, idType)
37+
.orElseGet(() -> countByIdGenerator(idGeneratorFactory, idType2)
38+
.orElseThrow(() -> new IllegalStateException(
39+
"Unsupported store format for GDS; GDS cannot read data from this database. " +
40+
"Please try to use Cypher projection instead.")));
41+
}
42+
43+
private static OptionalLong countByIdGenerator(@Nullable IdGeneratorFactory idGeneratorFactory, IdType idType) {
3244
if (idGeneratorFactory != null) {
3345
try {
3446
final IdGenerator idGenerator = idGeneratorFactory.get(idType);

0 commit comments

Comments
 (0)