Skip to content

Commit 740dd63

Browse files
authored
Merge pull request #9906 from neo-technology/empty-project-values
Move usages of Neo4j Values from nodes builder to native projection
2 parents 4d4bd00 + 28d94b9 commit 740dd63

File tree

8 files changed

+28
-87
lines changed

8 files changed

+28
-87
lines changed

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/DoubleArrayNodePropertiesBuilder.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import org.neo4j.gds.core.concurrency.DefaultPool;
2929
import org.neo4j.gds.core.concurrency.ParallelUtil;
3030
import org.neo4j.gds.utils.GdsNeo4jValueConversion;
31-
import org.neo4j.gds.utils.Neo4jValueConversion;
3231
import org.neo4j.gds.values.GdsValue;
33-
import org.neo4j.values.storable.Value;
3432

3533
import java.util.Arrays;
3634
import java.util.stream.Collectors;
@@ -57,11 +55,6 @@ public void set(long neoNodeId, double[] value) {
5755
builder.set(neoNodeId, value);
5856
}
5957

60-
@Override
61-
public void setValue(long neoNodeId, Value value) {
62-
set(neoNodeId, Neo4jValueConversion.getDoubleArray(value));
63-
}
64-
6558
@Override
6659
public void setValue(long neoNodeId, GdsValue value) {
6760
set(neoNodeId, GdsNeo4jValueConversion.getDoubleArray(value));

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/DoubleNodePropertiesBuilder.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import org.neo4j.gds.core.concurrency.DefaultPool;
2929
import org.neo4j.gds.core.concurrency.ParallelUtil;
3030
import org.neo4j.gds.utils.GdsNeo4jValueConversion;
31-
import org.neo4j.gds.utils.Neo4jValueConversion;
3231
import org.neo4j.gds.values.GdsValue;
33-
import org.neo4j.values.storable.Value;
3432

3533
import java.lang.invoke.MethodHandles;
3634
import java.lang.invoke.VarHandle;
@@ -80,12 +78,6 @@ public void set(long neoNodeId, double value) {
8078
updateMaxValue(value);
8179
}
8280

83-
@Override
84-
public void setValue(long neoNodeId, Value value) {
85-
double doubleValue = Neo4jValueConversion.getDoubleValue(value);
86-
set(neoNodeId, doubleValue);
87-
}
88-
8981
@Override
9082
public void setValue(long neoNodeId, GdsValue value) {
9183
double doubleValue = GdsNeo4jValueConversion.getDoubleValue(value);

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/FloatArrayNodePropertiesBuilder.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import org.neo4j.gds.core.concurrency.DefaultPool;
2929
import org.neo4j.gds.core.concurrency.ParallelUtil;
3030
import org.neo4j.gds.utils.GdsNeo4jValueConversion;
31-
import org.neo4j.gds.utils.Neo4jValueConversion;
3231
import org.neo4j.gds.values.GdsValue;
33-
import org.neo4j.values.storable.Value;
3432

3533
import java.util.Arrays;
3634
import java.util.stream.Collectors;
@@ -55,11 +53,6 @@ public void set(long neoNodeId, float[] value) {
5553
builder.set(neoNodeId, value);
5654
}
5755

58-
@Override
59-
public void setValue(long neoNodeId, Value value) {
60-
set(neoNodeId, Neo4jValueConversion.getFloatArray(value));
61-
}
62-
6356
@Override
6457
public void setValue(long neoNodeId, GdsValue value) {
6558
set(neoNodeId, GdsNeo4jValueConversion.getFloatArray(value));

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/InnerNodePropertiesBuilder.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,9 @@
2222
import org.neo4j.gds.api.PartialIdMap;
2323
import org.neo4j.gds.api.properties.nodes.NodePropertyValues;
2424
import org.neo4j.gds.values.GdsValue;
25-
import org.neo4j.values.storable.Value;
2625

2726
public interface InnerNodePropertiesBuilder {
2827

29-
void setValue(long neoNodeId, Value value);
30-
3128
void setValue(long neoNodeId, GdsValue value);
3229

3330
/**

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/LongArrayNodePropertiesBuilder.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import org.neo4j.gds.core.concurrency.DefaultPool;
2929
import org.neo4j.gds.core.concurrency.ParallelUtil;
3030
import org.neo4j.gds.utils.GdsNeo4jValueConversion;
31-
import org.neo4j.gds.utils.Neo4jValueConversion;
3231
import org.neo4j.gds.values.GdsValue;
33-
import org.neo4j.values.storable.Value;
3432

3533
import java.util.Arrays;
3634
import java.util.stream.Collectors;
@@ -55,11 +53,6 @@ public void set(long neoNodeId, long[] value) {
5553
builder.set(neoNodeId, value);
5654
}
5755

58-
@Override
59-
public void setValue(long neoNodeId, Value value) {
60-
set(neoNodeId, Neo4jValueConversion.getLongArray(value));
61-
}
62-
6356
@Override
6457
public void setValue(long neoNodeId, GdsValue value) {
6558
set(neoNodeId, GdsNeo4jValueConversion.getLongArray(value));

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/LongNodePropertiesBuilder.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@
2929
import org.neo4j.gds.core.concurrency.DefaultPool;
3030
import org.neo4j.gds.core.concurrency.ParallelUtil;
3131
import org.neo4j.gds.utils.GdsNeo4jValueConversion;
32-
import org.neo4j.gds.utils.Neo4jValueConversion;
3332
import org.neo4j.gds.values.GdsValue;
34-
import org.neo4j.values.storable.Value;
3533

3634
import java.lang.invoke.MethodHandles;
3735
import java.lang.invoke.VarHandle;
@@ -88,12 +86,6 @@ public void set(long neoNodeId, long value) {
8886
updateMaxValue(value);
8987
}
9088

91-
@Override
92-
public void setValue(long neoNodeId, Value value) {
93-
var longValue = Neo4jValueConversion.getLongValue(value);
94-
set(neoNodeId, longValue);
95-
}
96-
9789
@Override
9890
public void setValue(long neoNodeId, GdsValue value) {
9991
var longValue = GdsNeo4jValueConversion.getLongValue(value);

core/src/main/java/org/neo4j/gds/core/loading/nodeproperties/NodePropertiesFromStoreBuilder.java

Lines changed: 3 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,11 @@
3030
import org.neo4j.gds.mem.MemoryEstimations;
3131
import org.neo4j.gds.values.GdsNoValue;
3232
import org.neo4j.gds.values.GdsValue;
33-
import org.neo4j.values.storable.DoubleArray;
34-
import org.neo4j.values.storable.FloatArray;
35-
import org.neo4j.values.storable.FloatingPointValue;
36-
import org.neo4j.values.storable.IntegralValue;
37-
import org.neo4j.values.storable.LongArray;
38-
import org.neo4j.values.storable.Value;
39-
import org.neo4j.values.storable.Values;
33+
import org.neo4j.gds.values.primitive.PrimitiveValues;
4034

4135
import java.util.concurrent.atomic.AtomicReference;
4236

4337
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
44-
import static org.neo4j.values.storable.Values.NO_VALUE;
4538

4639
public final class NodePropertiesFromStoreBuilder {
4740

@@ -80,15 +73,6 @@ private NodePropertiesFromStoreBuilder(
8073
this.innerBuilder = new AtomicReference<>();
8174
}
8275

83-
public void set(long neoNodeId, Value value) {
84-
if (value != null && value != NO_VALUE) {
85-
if (innerBuilder.get() == null) {
86-
initializeWithType(value);
87-
}
88-
innerBuilder.get().setValue(neoNodeId, value);
89-
}
90-
}
91-
9276
public void set(long neoNodeId, GdsValue value) {
9377
if (value != null && value != GdsNoValue.NO_VALUE) {
9478
if (innerBuilder.get() == null) {
@@ -101,7 +85,8 @@ public void set(long neoNodeId, GdsValue value) {
10185
public NodePropertyValues build(IdMap idMap) {
10286
if (innerBuilder.get() == null) {
10387
if (defaultValue.getObject() != null) {
104-
initializeWithType(Values.of(defaultValue.getObject()));
88+
var gdsValue = PrimitiveValues.create(defaultValue.getObject());
89+
initializeWithType(gdsValue);
10590
} else {
10691
throw new IllegalStateException("Cannot infer type of property");
10792
}
@@ -116,15 +101,6 @@ public NodePropertyValues build(IdMap idMap) {
116101
return innerBuilder.get().build(idMap.nodeCount(), actualIdMap, idMap.highestOriginalId());
117102
}
118103

119-
// This is synchronized as we want to prevent the creation of multiple InnerNodePropertiesBuilders of which only once survives.
120-
private synchronized void initializeWithType(Value value) {
121-
if (innerBuilder.get() == null) {
122-
var valueType = valueType(value);
123-
var newBuilder = newInnerBuilder(valueType);
124-
innerBuilder.compareAndSet(null, newBuilder);
125-
}
126-
}
127-
128104
// This is synchronized as we want to prevent the creation of multiple InnerNodePropertiesBuilders of which only once survives.
129105
private synchronized void initializeWithType(GdsValue value) {
130106
if (innerBuilder.get() == null) {
@@ -152,23 +128,4 @@ private InnerNodePropertiesBuilder newInnerBuilder(ValueType valueType) {
152128
));
153129
}
154130
}
155-
156-
private ValueType valueType(Value value) {
157-
if (value instanceof IntegralValue) {
158-
return ValueType.LONG;
159-
} else if (value instanceof FloatingPointValue) {
160-
return ValueType.DOUBLE;
161-
} else if (value instanceof LongArray) {
162-
return ValueType.LONG_ARRAY;
163-
} else if (value instanceof DoubleArray) {
164-
return ValueType.DOUBLE_ARRAY;
165-
} else if (value instanceof FloatArray) {
166-
return ValueType.FLOAT_ARRAY;
167-
} else {
168-
throw new UnsupportedOperationException(formatWithLocale(
169-
"Loading of values of type %s is currently not supported",
170-
value.getTypeName()
171-
));
172-
}
173-
}
174131
}

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,18 @@
3232
import org.neo4j.gds.config.ConcurrencyConfig;
3333
import org.neo4j.gds.core.GraphDimensions;
3434
import org.neo4j.gds.core.concurrency.Concurrency;
35+
import org.neo4j.gds.core.loading.GdsNeo4jValueConverter;
3536
import org.neo4j.gds.core.loading.NodeLabelTokenSet;
3637
import org.neo4j.gds.core.loading.nodeproperties.NodePropertiesFromStoreBuilder;
3738
import org.neo4j.internal.kernel.api.PropertyCursor;
3839
import org.neo4j.kernel.api.KernelTransaction;
3940
import org.neo4j.storageengine.api.PropertySelection;
4041
import org.neo4j.storageengine.api.Reference;
42+
import org.neo4j.values.storable.DoubleArray;
43+
import org.neo4j.values.storable.FloatArray;
44+
import org.neo4j.values.storable.FloatingPointValue;
45+
import org.neo4j.values.storable.IntegralValue;
46+
import org.neo4j.values.storable.LongArray;
4147
import org.neo4j.values.storable.Value;
4248

4349
import java.util.ArrayList;
@@ -49,6 +55,7 @@
4955
import static java.util.stream.Collectors.toMap;
5056
import static org.neo4j.gds.core.GraphDimensions.ANY_LABEL;
5157
import static org.neo4j.gds.core.GraphDimensions.IGNORE;
58+
import static org.neo4j.gds.utils.StringFormatting.formatWithLocale;
5259

5360
public final class NativeNodePropertyImporter {
5461

@@ -142,14 +149,31 @@ private int setPropertyValue(
142149
Value value = propertyCursor.propertyValue();
143150

144151
for (NodePropertiesFromStoreBuilder builder : builders) {
145-
builder.set(neoNodeId, value);
152+
verifyValueType(value);
153+
var gdsValue = GdsNeo4jValueConverter.toValue(value);
154+
builder.set(neoNodeId, gdsValue);
146155
propertiesImported++;
147156
}
148157
}
149158

150159
return propertiesImported;
151160
}
152161

162+
private void verifyValueType(Value value) {
163+
if (!(
164+
value instanceof IntegralValue ||
165+
value instanceof FloatingPointValue ||
166+
value instanceof LongArray ||
167+
value instanceof DoubleArray ||
168+
value instanceof FloatArray
169+
)) {
170+
throw new UnsupportedOperationException(formatWithLocale(
171+
"Loading of values of type %s is currently not supported",
172+
value.getTypeName()
173+
));
174+
}
175+
}
176+
153177
public static final class Builder {
154178
private Concurrency concurrency = ConcurrencyConfig.TYPED_DEFAULT_CONCURRENCY;
155179
private Map<NodeLabel, PropertyMappings> propertyMappings;

0 commit comments

Comments
 (0)