Skip to content

Commit

Permalink
Adds option to specify crs in csv header for points
Browse files Browse the repository at this point in the history
Might need more tests, especially for loading relationships with point properties
  • Loading branch information
SaschaPeukert committed Mar 8, 2018
1 parent 9e18a49 commit c0cf23c
Show file tree
Hide file tree
Showing 15 changed files with 318 additions and 173 deletions.
Expand Up @@ -267,9 +267,9 @@ private static boolean getTrimStringIgnoreErrors( Configuration config )
}

@Override
public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor )
public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, String optionalData )
{
if ( !tryExtract( mark, extractor ) )
if ( !tryExtract( mark, extractor, optionalData ) )
{
throw new IllegalStateException( extractor + " didn't extract value for " + mark +
". For values which are optional please use tryExtract method instead" );
Expand All @@ -278,11 +278,11 @@ public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR
}

@Override
public boolean tryExtract( Mark mark, Extractor<?> extractor )
public boolean tryExtract( Mark mark, Extractor<?> extractor, String optionalData )
{
int from = mark.startPosition();
int to = mark.position();
return extractor.extract( buffer, from, to - from, mark.isQuoted() );
return extractor.extract( buffer, from, to - from, mark.isQuoted(), optionalData );
}

private int nextChar( int skippedChars ) throws IOException
Expand Down
10 changes: 6 additions & 4 deletions community/csv/src/main/java/org/neo4j/csv/reader/CharSeeker.java
Expand Up @@ -25,7 +25,7 @@
/**
* Seeks for specific characters in a stream of characters, e.g. a {@link CharReadable}. Uses a {@link Mark}
* as keeper of position. Once a {@link #seek(Mark, int)} has succeeded the characters specified by
* the mark can be {@link #extract(Mark, Extractor) extracted} into a value of an arbitrary type.
* the mark can be {@link #extract(Mark, Extractor, String) extracted} into a value of an arbitrary type.
*
* Typical usage is:
*
Expand Down Expand Up @@ -66,19 +66,21 @@ public interface CharSeeker extends Closeable, SourceTraceability
* Extracts the value specified by the {@link Mark}, previously populated by a call to {@link #seek(Mark, int)}.
* @param mark the {@link Mark} specifying which part of a bigger piece of data contains the found value.
* @param extractor {@link Extractor} capable of extracting the value.
* @param optionalData holds additional information for spatial and temporal values or null
* @return the supplied {@link Extractor}, which after the call carries the extracted value itself,
* where either {@link Extractor#value()} or a more specific accessor method can be called to access the value.
* @throws IllegalStateException if the {@link Extractor#extract(char[], int, int, boolean) extraction}
* @throws IllegalStateException if the {@link Extractor#extract(char[], int, int, boolean, String) extraction}
* returns {@code false}.
*/
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor );
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, String optionalData );

/**
* Extracts the value specified by the {@link Mark}, previously populated by a call to {@link #seek(Mark, int)}.
* @param mark the {@link Mark} specifying which part of a bigger piece of data contains the found value.
* @param extractor {@link Extractor} capable of extracting the value.
* @param optionalData holds additional information for spatial and temporal values or null
* @return {@code true} if a value was extracted, otherwise {@code false}. Probably the only reason for
* returning {@code false} would be if the data to extract was empty.
*/
boolean tryExtract( Mark mark, Extractor<?> extractor );
boolean tryExtract( Mark mark, Extractor<?> extractor, String optionalData );
}
Expand Up @@ -40,9 +40,10 @@ public interface Extractor<T> extends Cloneable
* @param offset offset into the buffer where the value starts.
* @param length number of characters from the offset to extract.
* @param hadQuotes whether or not there were skipped characters, f.ex. quotation.
* @param optionalData optional data to be used for spatial (CRS) or temporal (timezone) values or null
* @return {@code true} if a value was extracted, otherwise {@code false}.
*/
boolean extract( char[] data, int offset, int length, boolean hadQuotes );
boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData );

/**
* @return the most recently extracted value.
Expand Down
64 changes: 33 additions & 31 deletions community/csv/src/main/java/org/neo4j/csv/reader/Extractors.java
Expand Up @@ -349,14 +349,14 @@ private abstract static class AbstractSingleValueExtractor<T> extends AbstractEx
}

@Override
public final boolean extract( char[] data, int offset, int length, boolean hadQuotes )
public final boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData )
{
if ( nullValue( length, hadQuotes ) )
{
clear();
return false;
}
return extract0( data, offset, length );
return extract0( data, offset, length, optionalData );
}

protected boolean nullValue( int length, boolean hadQuotes )
Expand All @@ -366,7 +366,7 @@ protected boolean nullValue( int length, boolean hadQuotes )

protected abstract void clear();

protected abstract boolean extract0( char[] data, int offset, int length );
protected abstract boolean extract0( char[] data, int offset, int length, String optionalData );
}

private abstract static class AbstractSingleAnyValueExtractor extends AbstractSingleValueExtractor<AnyValue>
Expand Down Expand Up @@ -415,7 +415,7 @@ protected boolean nullValue( int length, boolean hadQuotes )
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = new String( data, offset, length );
return true;
Expand Down Expand Up @@ -444,7 +444,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = extractLong( data, offset, length );
return true;
Expand Down Expand Up @@ -482,7 +482,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = safeCastLongToInt( extractLong( data, offset, length ) );
return true;
Expand Down Expand Up @@ -520,7 +520,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = safeCastLongToShort( extractLong( data, offset, length ) );
return true;
Expand Down Expand Up @@ -558,7 +558,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = safeCastLongToByte( extractLong( data, offset, length ) );
return true;
Expand Down Expand Up @@ -603,7 +603,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = extractBoolean( data, offset, length );
return true;
Expand Down Expand Up @@ -637,7 +637,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
if ( length > 1 )
{
Expand Down Expand Up @@ -675,7 +675,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
try
{
Expand Down Expand Up @@ -718,7 +718,7 @@ protected void clear()
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
try
{
Expand Down Expand Up @@ -763,13 +763,13 @@ public T value()
}

@Override
public boolean extract( char[] data, int offset, int length, boolean hadQuotes )
public boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData )
{
extract0( data, offset, length );
extract0( data, offset, length, optionalData );
return true;
}

protected abstract void extract0( char[] data, int offset, int length );
protected abstract void extract0( char[] data, int offset, int length, String optionalData );

protected int charsToNextDelimiter( char[] data, int offset, int length )
{
Expand Down Expand Up @@ -821,7 +821,7 @@ private static class StringArrayExtractor extends ArrayExtractor<String[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new String[numberOfValues] : EMPTY;
Expand All @@ -848,7 +848,7 @@ private static class ByteArrayExtractor extends ArrayExtractor<byte[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new byte[numberOfValues] : EMPTY;
Expand All @@ -871,7 +871,7 @@ private static class ShortArrayExtractor extends ArrayExtractor<short[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new short[numberOfValues] : EMPTY;
Expand All @@ -894,7 +894,7 @@ private static class IntArrayExtractor extends ArrayExtractor<int[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalDatah )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new int[numberOfValues] : EMPTY;
Expand All @@ -915,7 +915,7 @@ private static class LongArrayExtractor extends ArrayExtractor<long[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new long[numberOfValues] : EMPTY_LONG_ARRAY;
Expand All @@ -938,7 +938,7 @@ private static class FloatArrayExtractor extends ArrayExtractor<float[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new float[numberOfValues] : EMPTY;
Expand All @@ -963,7 +963,7 @@ private static class DoubleArrayExtractor extends ArrayExtractor<double[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new double[numberOfValues] : EMPTY;
Expand All @@ -988,7 +988,7 @@ private static class BooleanArrayExtractor extends ArrayExtractor<boolean[]>
}

@Override
protected void extract0( char[] data, int offset, int length )
protected void extract0( char[] data, int offset, int length, String optionalData )
{
int numberOfValues = numberOfValues( data, offset, length );
value = numberOfValues > 0 ? new boolean[numberOfValues] : EMPTY;
Expand All @@ -1009,9 +1009,9 @@ public static class PointExtractor extends AbstractSingleAnyValueExtractor
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = PointValue.parse( CharBuffer.wrap( data, offset, length ) );
value = PointValue.parse( CharBuffer.wrap( data, offset, length ), optionalData );
return true;
}

Expand All @@ -1028,9 +1028,11 @@ public static class DateExtractor extends AbstractSingleAnyValueExtractor
{
super( "Date" );
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
//TODO: Change DateValue parse to use optionalData
value = DateValue.parse( CharBuffer.wrap( data, offset, length ) );
return true;
}
Expand All @@ -1053,7 +1055,7 @@ public static class TimeExtractor extends AbstractSingleAnyValueExtractor
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = TimeValue.parse( CharBuffer.wrap( data, offset, length ), defaultTimeZone );
return true;
Expand All @@ -1077,7 +1079,7 @@ public static class DateTimeExtractor extends AbstractSingleAnyValueExtractor
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = DateTimeValue.parse( CharBuffer.wrap( data, offset, length ), defaultTimeZone );
return true;
Expand All @@ -1098,7 +1100,7 @@ public static class LocalTimeExtractor extends AbstractSingleAnyValueExtractor
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = LocalTimeValue.parse( CharBuffer.wrap( data, offset, length ) );
return true;
Expand All @@ -1119,7 +1121,7 @@ public static class LocalDateTimeExtractor extends AbstractSingleAnyValueExtract
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = LocalDateTimeValue.parse( CharBuffer.wrap( data, offset, length ) );
return true;
Expand All @@ -1140,7 +1142,7 @@ public static class DurationExtractor extends AbstractSingleAnyValueExtractor
}

@Override
protected boolean extract0( char[] data, int offset, int length )
protected boolean extract0( char[] data, int offset, int length, String optionalData )
{
value = DurationValue.parse( CharBuffer.wrap( data, offset, length ) );
return true;
Expand Down

0 comments on commit c0cf23c

Please sign in to comment.