Skip to content

Commit

Permalink
Introduce full map based approach for csv header format
Browse files Browse the repository at this point in the history
Data map entries override the (optional) header map entries
  • Loading branch information
SaschaPeukert committed Mar 13, 2018
1 parent c5d50c3 commit 2a2c72b
Show file tree
Hide file tree
Showing 10 changed files with 115 additions and 76 deletions.
Expand Up @@ -24,6 +24,7 @@
import java.io.Reader;

import org.neo4j.csv.reader.Source.Chunk;
import org.neo4j.values.AnyValue;

import static java.lang.String.format;

Expand Down Expand Up @@ -273,7 +274,7 @@ private static boolean getTrimStringIgnoreErrors( Configuration config )
}

@Override
public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, String optionalData )
public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, AnyValue[] optionalData )
{
if ( !tryExtract( mark, extractor, optionalData ) )
{
Expand All @@ -284,7 +285,7 @@ public <EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR
}

@Override
public boolean tryExtract( Mark mark, Extractor<?> extractor, String optionalData )
public boolean tryExtract( Mark mark, Extractor<?> extractor, AnyValue[] optionalData )
{
int from = mark.startPosition();
int to = mark.position();
Expand Down
11 changes: 6 additions & 5 deletions community/csv/src/main/java/org/neo4j/csv/reader/CharSeeker.java
Expand Up @@ -22,10 +22,11 @@
import java.io.Closeable;
import java.io.IOException;

import org.neo4j.values.AnyValue;
/**
* 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, String) extracted} into a value of an arbitrary type.
* the mark can be {@link #extract(Mark, Extractor, AnyValue[]) extracted} into a value of an arbitrary type.
*
* Typical usage is:
*
Expand Down Expand Up @@ -69,18 +70,18 @@ public interface CharSeeker extends Closeable, SourceTraceability
* @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, String) extraction}
* @throws IllegalStateException if the {@link Extractor#extract(char[], int, int, boolean, AnyValue[]) extraction}
* returns {@code false}.
*/
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, String optionalData );
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor, AnyValue[] 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.
* @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, String) extraction}
* @throws IllegalStateException if the {@link Extractor#extract(char[], int, int, boolean, AnyValue[]) extraction}
* returns {@code false}.
*/
<EXTRACTOR extends Extractor<?>> EXTRACTOR extract( Mark mark, EXTRACTOR extractor );
Expand All @@ -93,7 +94,7 @@ public interface CharSeeker extends Closeable, SourceTraceability
* @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, String optionalData );
boolean tryExtract( Mark mark, Extractor<?> extractor, AnyValue[] optionalData );

/**
* Extracts the value specified by the {@link Mark}, previously populated by a call to {@link #seek(Mark, int)}.
Expand Down
Expand Up @@ -19,6 +19,7 @@
*/
package org.neo4j.csv.reader;

import org.neo4j.values.AnyValue;
/**
* Extracts a value from a part of a {@code char[]} into any type of value, f.ex. a {@link Extractors#string()},
* {@link Extractors#long_() long} or {@link Extractors#intArray()}.
Expand All @@ -40,10 +41,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
* @param optionalData optional data to be used for spatial or temporal values or null if csv header did not use it
* @return {@code true} if a value was extracted, otherwise {@code false}.
*/
boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData );
boolean extract( char[] data, int offset, int length, boolean hadQuotes, AnyValue[] optionalData );

/**
* Extracts value of type {@code T} from the given character data.
Expand Down
56 changes: 28 additions & 28 deletions community/csv/src/main/java/org/neo4j/csv/reader/Extractors.java
Expand Up @@ -349,7 +349,7 @@ private abstract static class AbstractSingleValueExtractor<T> extends AbstractEx
}

@Override
public final boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData )
public final boolean extract( char[] data, int offset, int length, boolean hadQuotes, AnyValue[] optionalData )
{
if ( nullValue( length, hadQuotes ) )
{
Expand All @@ -372,7 +372,7 @@ protected boolean nullValue( int length, boolean hadQuotes )

protected abstract void clear();

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

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

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

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

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

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

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

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

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

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

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

@Override
public boolean extract( char[] data, int offset, int length, boolean hadQuotes, String optionalData )
public boolean extract( char[] data, int offset, int length, boolean hadQuotes, AnyValue[] optionalData )
{
extract0( data, offset, length, optionalData );
return true;
Expand All @@ -781,7 +781,7 @@ public boolean extract( char[] data, int offset, int length, boolean hadQuotes )
return extract( data, offset, length, hadQuotes, null );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@Override
protected boolean extract0( char[] data, int offset, int length, String optionalData )
protected boolean extract0( char[] data, int offset, int length, AnyValue[] optionalData )
{
value = DurationValue.parse( CharBuffer.wrap( data, offset, length ) );
return true;
Expand Down
Expand Up @@ -145,7 +145,8 @@ public void shouldExtractPoint()
// WHEN
char[] asChars = "Point{latitude: 56.7, longitude: 13.2}".toCharArray();
Extractors.PointExtractor extractor = extractors.point();
extractor.extract( asChars, 0, asChars.length, false, "WGS-84" );
String headerInfo = "{crs:WGS-84}";
extractor.extract( asChars, 0, asChars.length, false, PointValue.parseIntoArray( headerInfo ) );

// THEN
assertEquals( value, extractor.value );
Expand Down

0 comments on commit 2a2c72b

Please sign in to comment.