Skip to content

Commit 3cdfa5b

Browse files
Merge pull request #5879 from soerenreichardt/2.1-csv-loading-with-jackson
Csv loading with jackson
2 parents d664601 + cca9963 commit 3cdfa5b

File tree

22 files changed

+575
-324
lines changed

22 files changed

+575
-324
lines changed

graph-projection-api/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ dependencies {
2020
[group: 'org.eclipse.collections', name: 'eclipse-collections', version: ver.'eclipse-collections'],
2121
)
2222

23+
api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: ver.'jackson'
24+
api group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-csv', version: ver.'jackson'
25+
2326
testCompileOnly group: 'org.immutables', name: 'builder', version: ver.'immutables'
2427
testCompileOnly group: 'org.immutables', name: 'value-annotations', version: ver.'immutables'
2528

graph-projection-api/src/main/java/org/neo4j/gds/api/nodeproperties/ValueType.java

Lines changed: 0 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@
2121

2222
import org.neo4j.gds.api.DefaultValue;
2323

24-
import java.util.Arrays;
25-
import java.util.stream.Collectors;
26-
import java.util.stream.IntStream;
27-
2824
public enum ValueType {
2925
LONG {
3026
@Override
@@ -37,22 +33,6 @@ public String csvName() {
3733
return "long";
3834
}
3935

40-
@Override
41-
public String csvValue(Object value) {
42-
if (value == null || (Long) value == DefaultValue.LONG_DEFAULT_FALLBACK || (Long) value == DefaultValue.INTEGER_DEFAULT_FALLBACK) {
43-
return "";
44-
}
45-
return value.toString();
46-
}
47-
48-
@Override
49-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
50-
if (csvValue.isBlank()) {
51-
return fallbackValue.longValue();
52-
}
53-
return Long.parseLong(csvValue);
54-
}
55-
5636
@Override
5737
public DefaultValue fallbackValue() {
5838
return DefaultValue.forLong();
@@ -69,22 +49,6 @@ public String csvName() {
6949
return "double";
7050
}
7151

72-
@Override
73-
public String csvValue(Object value) {
74-
if (value == null || ((Double) value).isNaN()) {
75-
return "";
76-
}
77-
return value.toString();
78-
}
79-
80-
@Override
81-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
82-
if (csvValue.isBlank()) {
83-
return fallbackValue.doubleValue();
84-
}
85-
return Double.parseDouble(csvValue);
86-
}
87-
8852
@Override
8953
public DefaultValue fallbackValue() {
9054
return DefaultValue.forDouble();
@@ -101,19 +65,6 @@ public String csvName() {
10165
return "string";
10266
}
10367

104-
@Override
105-
public String csvValue(Object value) {
106-
if (value == null) {
107-
return "";
108-
}
109-
return value.toString();
110-
}
111-
112-
@Override
113-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
114-
throw new UnsupportedOperationException("Unsupported conversion from CSV value to STRING");
115-
}
116-
11768
@Override
11869
public DefaultValue fallbackValue() {
11970
return DefaultValue.DEFAULT;
@@ -130,28 +81,6 @@ public String csvName() {
13081
return "double[]";
13182
}
13283

133-
@Override
134-
public String csvValue(Object value) {
135-
if (value == null) {
136-
return "";
137-
}
138-
var doubleArray = (double[]) value;
139-
return Arrays.stream(doubleArray).mapToObj(Double::toString).collect(Collectors.joining(";"));
140-
}
141-
142-
@Override
143-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
144-
if (csvValue.isBlank()) {
145-
return fallbackValue.doubleArrayValue();
146-
}
147-
String[] arrayElements = csvValue.split(";");
148-
double[] doubleArray = new double[arrayElements.length];
149-
for (int i = 0; i < arrayElements.length; i++) {
150-
doubleArray[i] = Double.parseDouble(arrayElements[i]);
151-
}
152-
return doubleArray;
153-
}
154-
15584
@Override
15685
public DefaultValue fallbackValue() {
15786
return DefaultValue.forDoubleArray();
@@ -168,32 +97,6 @@ public String csvName() {
16897
return "float[]";
16998
}
17099

171-
@Override
172-
public String csvValue(Object value) {
173-
if (value == null) {
174-
return "";
175-
}
176-
var floatArray = (float[]) value;
177-
return IntStream
178-
.range(0, floatArray.length)
179-
.mapToDouble(i -> floatArray[i])
180-
.mapToObj(Double::toString)
181-
.collect(Collectors.joining(";"));
182-
}
183-
184-
@Override
185-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
186-
if (csvValue.isBlank()) {
187-
return fallbackValue.floatArrayValue();
188-
}
189-
String[] arrayElements = csvValue.split(";");
190-
float[] floatArray = new float[arrayElements.length];
191-
for (int i = 0; i < arrayElements.length; i++) {
192-
floatArray[i] = Float.parseFloat(arrayElements[i]);
193-
}
194-
return floatArray;
195-
}
196-
197100
@Override
198101
public DefaultValue fallbackValue() {
199102
return DefaultValue.forFloatArray();
@@ -210,28 +113,6 @@ public String csvName() {
210113
return "long[]";
211114
}
212115

213-
@Override
214-
public String csvValue(Object value) {
215-
if (value == null) {
216-
return "";
217-
}
218-
var longArray = (long[]) value;
219-
return Arrays.stream(longArray).mapToObj(Long::toString).collect(Collectors.joining(";"));
220-
}
221-
222-
@Override
223-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
224-
if (csvValue.isBlank()) {
225-
return fallbackValue.longArrayValue();
226-
}
227-
String[] arrayElements = csvValue.split(";");
228-
long[] longArray = new long[arrayElements.length];
229-
for (int i = 0; i < arrayElements.length; i++) {
230-
longArray[i] = Long.parseLong(arrayElements[i]);
231-
}
232-
return longArray;
233-
}
234-
235116
@Override
236117
public DefaultValue fallbackValue() {
237118
return DefaultValue.forLongArray();
@@ -248,19 +129,6 @@ public String csvName() {
248129
throw new UnsupportedOperationException("Value Type UKNONWN is not supported in CSV");
249130
}
250131

251-
@Override
252-
public String csvValue(Object value) {
253-
if (value == null) {
254-
return "";
255-
}
256-
return value.toString();
257-
}
258-
259-
@Override
260-
public Object fromCsvValue(String csvValue, DefaultValue fallbackValue) {
261-
throw new UnsupportedOperationException("Unsupported conversion from CSV value to UNKNOWN");
262-
}
263-
264132
@Override
265133
public DefaultValue fallbackValue() {
266134
return DefaultValue.DEFAULT;
@@ -271,16 +139,8 @@ public DefaultValue fallbackValue() {
271139

272140
public abstract String csvName();
273141

274-
public abstract String csvValue(Object value);
275-
276-
public abstract Object fromCsvValue(String csvValue, DefaultValue fallbackValue);
277-
278142
public abstract DefaultValue fallbackValue();
279143

280-
public Object fromCsvValue(String csvValue) {
281-
return fromCsvValue(csvValue, fallbackValue());
282-
}
283-
284144
public static ValueType fromCsvName(String csvName) {
285145
for (ValueType value : values()) {
286146
if (value == UNKNOWN) {

io/core/src/main/java/org/neo4j/gds/core/io/file/FileHeader.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
*/
2020
package org.neo4j.gds.core.io.file;
2121

22-
import org.neo4j.gds.ElementIdentifier;
2322
import org.neo4j.gds.api.schema.ElementSchema;
2423
import org.neo4j.gds.api.schema.PropertySchema;
2524

2625
import java.util.Map;
26+
import java.util.Set;
2727

28-
public interface FileHeader<SCHEMA extends ElementSchema<SCHEMA, IDENTIFIER, PROPERTY_SCHEMA>, IDENTIFIER extends ElementIdentifier, PROPERTY_SCHEMA extends PropertySchema> {
28+
public interface FileHeader<SCHEMA extends ElementSchema<SCHEMA, ?, PROPERTY_SCHEMA>, PROPERTY_SCHEMA extends PropertySchema> {
29+
30+
Set<HeaderProperty> propertyMappings();
2931

3032
Map<String, PROPERTY_SCHEMA> schemaForIdentifier(SCHEMA schema);
3133
}

io/csv/src/main/java/org/neo4j/gds/core/io/file/NodeFileHeader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@
3333
import java.util.stream.Stream;
3434

3535
@ValueClass
36-
public interface NodeFileHeader extends FileHeader<NodeSchema, NodeLabel, PropertySchema> {
37-
Set<HeaderProperty> propertyMappings();
36+
public interface NodeFileHeader extends FileHeader<NodeSchema, PropertySchema> {
3837
String[] nodeLabels();
3938

4039
@Override

io/csv/src/main/java/org/neo4j/gds/core/io/file/RelationshipFileHeader.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
import java.util.Set;
3131

3232
@ValueClass
33-
public interface RelationshipFileHeader extends FileHeader<RelationshipSchema, RelationshipType, RelationshipPropertySchema> {
34-
Set<HeaderProperty> propertyMappings();
33+
public interface RelationshipFileHeader extends FileHeader<RelationshipSchema, RelationshipPropertySchema> {
3534
String relationshipType();
3635

3736
@Override

0 commit comments

Comments
 (0)