Skip to content

Commit a2e273a

Browse files
soerenreichardts1ck
andcommitted
Use Nodes#nodeSchema in native factory
Co-authored-by: Martin Junghanns <martin.junghanns@neotechnology.com>
1 parent fe8eaae commit a2e273a

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

core/src/main/java/org/neo4j/gds/core/loading/IndexPropertyMappings.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static java.util.stream.Collectors.toMap;
4747
import static org.neo4j.gds.core.GraphDimensions.ANY_LABEL;
4848

49+
// TODO: should be named LoadablePropertyMappings
4950
final class IndexPropertyMappings {
5051

5152
static LoadablePropertyMappings prepareProperties(
@@ -66,6 +67,20 @@ static LoadablePropertyMappings prepareProperties(
6667
return prepareLoadableProperties(graphDimensions, transaction, storeLoadedProperties);
6768
}
6869

70+
static Map<NodeLabel, PropertyMappings> propertyMappingsByLabel(GraphProjectFromStoreConfig graphProjectConfig) {
71+
return graphProjectConfig
72+
.nodeProjections()
73+
.projections()
74+
.entrySet()
75+
.stream()
76+
.collect(toMap(
77+
Map.Entry::getKey,
78+
entry -> entry
79+
.getValue()
80+
.properties()
81+
));
82+
}
83+
6984
private static LoadablePropertyMappings prepareLoadableProperties(
7085
GraphDimensions dimensions,
7186
TransactionContext transaction,

core/src/main/java/org/neo4j/gds/core/loading/Nodes.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,17 @@
2020
package org.neo4j.gds.core.loading;
2121

2222
import org.immutables.value.Value;
23+
import org.neo4j.gds.NodeLabel;
2324
import org.neo4j.gds.PropertyMapping;
25+
import org.neo4j.gds.PropertyMappings;
2426
import org.neo4j.gds.annotation.ValueClass;
2527
import org.neo4j.gds.api.IdMap;
2628
import org.neo4j.gds.api.PropertyState;
2729
import org.neo4j.gds.api.properties.nodes.ImmutableNodeProperty;
2830
import org.neo4j.gds.api.properties.nodes.NodeProperty;
2931
import org.neo4j.gds.api.properties.nodes.NodePropertyStore;
3032
import org.neo4j.gds.api.properties.nodes.NodePropertyValues;
33+
import org.neo4j.gds.api.schema.ImmutablePropertySchema;
3134
import org.neo4j.gds.api.schema.NodeSchema;
3235

3336
import java.util.Map;
@@ -72,6 +75,36 @@ static Nodes of(IdMap idMap, NodeSchema nodeSchema, Map<String, NodePropertyValu
7275
return ImmutableNodes.of(nodeSchema, idMap, nodePropertyStoreBuilder.build());
7376
}
7477

78+
static Nodes of(
79+
IdMap idMap,
80+
Map<NodeLabel, PropertyMappings> propertyMappingsByLabel,
81+
Map<PropertyMapping, NodePropertyValues> properties,
82+
PropertyState propertyState
83+
) {
84+
var nodeSchema = NodeSchema.empty();
85+
var nodePropertyStoreBuilder = NodePropertyStore.builder();
86+
propertyMappingsByLabel.forEach(((nodeLabel, propertyMappings) -> {
87+
if (propertyMappings.mappings().isEmpty()) {
88+
nodeSchema.addLabel(nodeLabel);
89+
} else {
90+
propertyMappings.mappings().forEach(propertyMapping -> {
91+
var nodePropertyValues = properties.get(propertyMapping);
92+
var propertySchema = ImmutablePropertySchema.builder()
93+
.key(propertyMapping.propertyKey())
94+
.valueType(nodePropertyValues.valueType())
95+
.defaultValue(propertyMapping.defaultValue())
96+
.state(propertyState)
97+
.build();
98+
99+
nodeSchema.addProperty(nodeLabel, propertySchema.key(), propertySchema);
100+
nodePropertyStoreBuilder.putProperty(propertySchema.key(), ImmutableNodeProperty.of(nodePropertyValues, propertySchema));
101+
});
102+
}
103+
}));
104+
105+
return ImmutableNodes.of(nodeSchema, idMap, nodePropertyStoreBuilder.build());
106+
}
107+
75108
static Nodes of(IdMap idMap, Map<PropertyMapping, NodePropertyValues> properties, PropertyState propertyState) {
76109
NodePropertyStore.Builder builder = NodePropertyStore.builder();
77110
properties.forEach((mapping, nodeProperties) -> builder.putProperty(

core/src/main/java/org/neo4j/gds/core/loading/ScanningNodesImporter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121

2222
import org.immutables.builder.Builder;
2323
import org.jetbrains.annotations.Nullable;
24+
import org.neo4j.gds.NodeLabel;
2425
import org.neo4j.gds.PropertyMapping;
26+
import org.neo4j.gds.PropertyMappings;
2527
import org.neo4j.gds.api.GraphLoaderContext;
2628
import org.neo4j.gds.api.IdMap;
2729
import org.neo4j.gds.api.PropertyState;
@@ -50,6 +52,7 @@
5052
public final class ScanningNodesImporter extends ScanningRecordsImporter<NodeReference, Nodes> {
5153

5254
private final IndexPropertyMappings.LoadablePropertyMappings propertyMappings;
55+
private final Map<NodeLabel, PropertyMappings> propertyMappingsByLabel;
5356
private final TerminationFlag terminationFlag;
5457
private final IdMapBuilder idMapBuilder;
5558
private final LabelInformation.Builder labelInformationBuilder;
@@ -93,6 +96,8 @@ public static ScanningNodesImporter scanningNodesImporter(
9396
loadingContext.transactionContext()
9497
);
9598

99+
var propertyMappingsByLabel = IndexPropertyMappings.propertyMappingsByLabel(graphProjectConfig);
100+
96101
var nodePropertyImporter = initializeNodePropertyImporter(
97102
propertyMappings,
98103
dimensions,
@@ -106,6 +111,7 @@ public static ScanningNodesImporter scanningNodesImporter(
106111
progressTracker,
107112
concurrency,
108113
propertyMappings,
114+
propertyMappingsByLabel,
109115
nodePropertyImporter,
110116
idMapBuilder,
111117
labelInformationBuilder
@@ -119,6 +125,7 @@ private ScanningNodesImporter(
119125
ProgressTracker progressTracker,
120126
int concurrency,
121127
IndexPropertyMappings.LoadablePropertyMappings propertyMappings,
128+
Map<NodeLabel, PropertyMappings> propertyMappingsByLabel,
122129
@Nullable NativeNodePropertyImporter nodePropertyImporter,
123130
IdMapBuilder idMapBuilder,
124131
LabelInformation.Builder labelInformationBuilder
@@ -133,6 +140,7 @@ private ScanningNodesImporter(
133140

134141
this.terminationFlag = loadingContext.terminationFlag();
135142
this.propertyMappings = propertyMappings;
143+
this.propertyMappingsByLabel = propertyMappingsByLabel;
136144
this.nodePropertyImporter = nodePropertyImporter;
137145
this.idMapBuilder = idMapBuilder;
138146
this.labelInformationBuilder = labelInformationBuilder;
@@ -191,7 +199,7 @@ public Nodes build() {
191199
importPropertiesFromIndex(idMap, nodeProperties);
192200
}
193201

194-
return Nodes.of(idMap, nodeProperties, PropertyState.PERSISTENT);
202+
return Nodes.of(idMap, propertyMappingsByLabel, nodeProperties, PropertyState.PERSISTENT);
195203
}
196204

197205
private void importPropertiesFromIndex(

0 commit comments

Comments
 (0)