Skip to content

Commit 3637193

Browse files
author
Zhen Li
committed
Added as method for all primitive types, String, Java native types
1 parent 8b54a3b commit 3637193

File tree

3 files changed

+229
-61
lines changed

3 files changed

+229
-61
lines changed

driver/src/main/java/org/neo4j/driver/internal/value/ValueAdapter.java

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,75 @@ public <T> T computeOrDefault( Function<Value,T> mapper, T defaultValue )
197197
}
198198

199199
@Override
200-
public <T> T computeOrNull( Function<Value,T> mapper )
200+
public Map<String,Object> asMap( Map<String,Object> defaultValue )
201201
{
202-
return computeOrDefault( mapper, null );
202+
return computeOrDefault( Value::asMap, defaultValue );
203+
}
204+
205+
@Override
206+
public <T> Map<String,T> asMap( Function<Value,T> mapFunction, Map<String,T> defaultValue )
207+
{
208+
return computeOrDefault( value -> value.asMap( mapFunction ), defaultValue );
209+
}
210+
211+
@Override
212+
public byte[] asByteArray( byte[] defaultValue )
213+
{
214+
return computeOrDefault( Value::asByteArray, defaultValue );
215+
}
216+
217+
@Override
218+
public List<Object> asList( List<Object> defaultValue )
219+
{
220+
return computeOrDefault( Value::asList, defaultValue );
221+
}
222+
223+
@Override
224+
public <T> List<T> asList( Function<Value,T> mapFunction, List<T> defaultValue )
225+
{
226+
return computeOrDefault( value -> value.asList( mapFunction ), defaultValue );
227+
}
228+
229+
@Override
230+
public LocalDate asLocalDate( LocalDate defaultValue )
231+
{
232+
return computeOrDefault( Value::asLocalDate, defaultValue );
233+
}
234+
235+
@Override
236+
public OffsetTime asOffsetTime( OffsetTime defaultValue )
237+
{
238+
return computeOrDefault( Value::asOffsetTime, defaultValue );
239+
}
240+
241+
@Override
242+
public LocalTime asLocalTime( LocalTime defaultValue )
243+
{
244+
return computeOrDefault( Value::asLocalTime, defaultValue );
245+
}
246+
247+
@Override
248+
public LocalDateTime asLocalDateTime( LocalDateTime defaultValue )
249+
{
250+
return computeOrDefault( Value::asLocalDateTime, defaultValue );
251+
}
252+
253+
@Override
254+
public ZonedDateTime asZonedDateTime( ZonedDateTime defaultValue )
255+
{
256+
return computeOrDefault( Value::asZonedDateTime, defaultValue );
257+
}
258+
259+
@Override
260+
public IsoDuration asIsoDuration( IsoDuration defaultValue )
261+
{
262+
return computeOrDefault( Value::asIsoDuration, defaultValue );
263+
}
264+
265+
@Override
266+
public Point asPoint( Point defaultValue )
267+
{
268+
return computeOrDefault( Value::asPoint, defaultValue );
203269
}
204270

205271
@Override

driver/src/main/java/org/neo4j/driver/v1/Value.java

Lines changed: 99 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,6 @@ public interface Value extends MapAccessor, MapAccessorWithDefaultValue
204204
*/
205205
<T>T computeOrDefault( Function<Value, T> mapper, T defaultValue );
206206

207-
/**
208-
* Apply the mapping function on the value if the value is not a {@link NullValue}, or null if the value is a {@link NullValue}.
209-
* @param mapper The mapping function defines how to map a {@link Value} to T.
210-
* @param <T> The return type
211-
* @return The value after applying the given mapping function or null if the value is {@link NullValue}.
212-
*/
213-
<T>T computeOrNull( Function<Value, T> mapper );
214-
215207
/**
216208
* @return the value as a Java boolean, if possible.
217209
* @throws Uncoercible if value types are incompatible.
@@ -231,6 +223,13 @@ public interface Value extends MapAccessor, MapAccessorWithDefaultValue
231223
*/
232224
byte[] asByteArray();
233225

226+
/**
227+
* @param defaultValue default to this value if the original value is a {@link NullValue}
228+
* @return the value as a Java byte array, if possible.
229+
* @throws Uncoercible if value types are incompatible.
230+
*/
231+
byte[] asByteArray( byte[] defaultValue );
232+
234233
/**
235234
* @return the value as a Java String, if possible.
236235
* @throws Uncoercible if value types are incompatible.
@@ -331,14 +330,35 @@ public interface Value extends MapAccessor, MapAccessorWithDefaultValue
331330
*/
332331
List<Object> asList();
333332

333+
334+
/**
335+
* If the underlying type can be viewed as a list, returns a java list of
336+
* values, where each value has been converted using {@link #asObject()}.
337+
*
338+
* @see #asObject()
339+
* @param defaultValue default to this value if the value is a {@link NullValue}
340+
* @return the value as a Java list of values, if possible
341+
*/
342+
List<Object> asList( List<Object> defaultValue );
343+
344+
/**
345+
* @param mapFunction a function to map from Value to T. See {@link Values} for some predefined functions, such
346+
* as {@link Values#ofBoolean()}, {@link Values#ofList(Function)}.
347+
* @param <T> the type of target list elements
348+
* @see Values for a long list of built-in conversion functions
349+
* @return the value as a list of T obtained by mapping from the list elements, if possible
350+
*/
351+
<T> List<T> asList( Function<Value,T> mapFunction );
352+
334353
/**
335354
* @param mapFunction a function to map from Value to T. See {@link Values} for some predefined functions, such
336355
* as {@link Values#ofBoolean()}, {@link Values#ofList(Function)}.
337356
* @param <T> the type of target list elements
357+
* @param defaultValue default to this value if the value is a {@link NullValue}
338358
* @see Values for a long list of built-in conversion functions
339359
* @return the value as a list of T obtained by mapping from the list elements, if possible
340360
*/
341-
<T> List<T> asList( Function<Value, T> mapFunction );
361+
<T> List<T> asList( Function<Value,T> mapFunction, List<T> defaultValue );
342362

343363
/**
344364
* @return the value as a {@link Entity}, if possible.
@@ -406,6 +426,76 @@ public interface Value extends MapAccessor, MapAccessorWithDefaultValue
406426
*/
407427
Point asPoint();
408428

429+
/**
430+
* @param defaultValue default to this value if the value is a {@link NullValue}
431+
* @return the value as a {@link LocalDate}, if possible.
432+
* @throws Uncoercible if value types are incompatible.
433+
*/
434+
LocalDate asLocalDate( LocalDate defaultValue );
435+
436+
/**
437+
* @param defaultValue default to this value if the value is a {@link NullValue}
438+
* @return the value as a {@link OffsetTime}, if possible.
439+
* @throws Uncoercible if value types are incompatible.
440+
*/
441+
OffsetTime asOffsetTime( OffsetTime defaultValue );
442+
443+
/**
444+
* @param defaultValue default to this value if the value is a {@link NullValue}
445+
* @return the value as a {@link LocalTime}, if possible.
446+
* @throws Uncoercible if value types are incompatible.
447+
*/
448+
LocalTime asLocalTime( LocalTime defaultValue );
449+
450+
/**
451+
* @param defaultValue default to this value if the value is a {@link NullValue}
452+
* @return the value as a {@link LocalDateTime}, if possible.
453+
* @throws Uncoercible if value types are incompatible.
454+
*/
455+
LocalDateTime asLocalDateTime( LocalDateTime defaultValue );
456+
457+
/**
458+
* @param defaultValue default to this value if the value is a {@link NullValue}
459+
* @return the value as a {@link ZonedDateTime}, if possible.
460+
* @throws Uncoercible if value types are incompatible.
461+
*/
462+
ZonedDateTime asZonedDateTime( ZonedDateTime defaultValue );
463+
464+
/**
465+
* @param defaultValue default to this value if the value is a {@link NullValue}
466+
* @return the value as a {@link IsoDuration}, if possible.
467+
* @throws Uncoercible if value types are incompatible.
468+
*/
469+
IsoDuration asIsoDuration( IsoDuration defaultValue );
470+
471+
/**
472+
* @param defaultValue default to this value if the value is a {@link NullValue}
473+
* @return the value as a {@link Point}, if possible.
474+
* @throws Uncoercible if value types are incompatible.
475+
*/
476+
Point asPoint( Point defaultValue );
477+
478+
/**
479+
* Return as a map of string keys and values converted using
480+
* {@link Value#asObject()}.
481+
*
482+
* This is equivalent to calling {@link #asMap(Function, Map)} with {@link Values#ofObject()}.
483+
*
484+
* @param defaultValue default to this value if the value is a {@link NullValue}
485+
* @return the value as a Java map
486+
*/
487+
Map<String, Object> asMap( Map<String,Object> defaultValue );
488+
489+
/**
490+
* @param mapFunction a function to map from Value to T. See {@link Values} for some predefined functions, such
491+
* as {@link Values#ofBoolean()}, {@link Values#ofList(Function)}.
492+
* @param <T> the type of map values
493+
* @param defaultValue default to this value if the value is a {@link NullValue}
494+
* @see Values for a long list of built-in conversion functions
495+
* @return the value as a map from string keys to values of type T obtained from mapping he original map values, if possible
496+
*/
497+
<T> Map<String, T> asMap( Function<Value, T> mapFunction, Map<String, T> defaultValue );
498+
409499
@Override
410500
boolean equals( Object other );
411501

driver/src/test/java/org/neo4j/driver/internal/value/NullValueTest.java

Lines changed: 62 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,18 @@
2525
import java.time.LocalTime;
2626
import java.time.OffsetTime;
2727
import java.time.ZonedDateTime;
28-
import java.util.Collections;
2928

3029
import org.neo4j.driver.internal.types.TypeConstructor;
3130
import org.neo4j.driver.v1.Value;
32-
import org.neo4j.driver.v1.Values;
3331
import org.neo4j.driver.v1.util.Function;
3432

33+
import static java.util.Collections.emptyList;
34+
import static java.util.Collections.emptyMap;
3535
import static org.hamcrest.MatcherAssert.assertThat;
3636
import static org.hamcrest.Matchers.equalTo;
37-
import static org.hamcrest.Matchers.nullValue;
3837
import static org.junit.Assert.assertTrue;
38+
import static org.neo4j.driver.v1.Values.isoDuration;
39+
import static org.neo4j.driver.v1.Values.ofValue;
3940
import static org.neo4j.driver.v1.Values.point;
4041

4142
public class NullValueTest
@@ -62,73 +63,84 @@ public void shouldTypeAsNull()
6263
public void shouldReturnNativeTypesAsDefaultValue() throws Throwable
6364
{
6465
Value value = NullValue.NULL;
66+
// string
67+
assertThat( value.asString( "string value" ), equalTo( "string value" ) );
68+
69+
// primitives
6570
assertThat( value.asBoolean( false ), equalTo( false ) );
6671
assertThat( value.asBoolean( true ), equalTo( true ) );
67-
assertThat( value.asString( "string value" ), equalTo( "string value" ) );
6872
assertThat( value.asInt( 10 ), equalTo( 10 ) );
6973
assertThat( value.asLong( 100L ), equalTo( 100L ) );
7074
assertThat( value.asFloat( 10.4f ), equalTo( 10.4f ) );
7175
assertThat( value.asDouble( 10.10 ), equalTo( 10.10 ) );
76+
77+
//array, list, map
78+
assertThat( value.asByteArray( new byte[]{1, 2} ), equalTo( new byte[]{1, 2} ) );
79+
assertThat( value.asList( emptyList() ), equalTo( emptyList() ) );
80+
assertThat( value.asList( ofValue(), emptyList() ), equalTo( emptyList() ) );
81+
assertThat( value.asMap( emptyMap() ), equalTo( emptyMap() ) );
82+
assertThat( value.asMap( ofValue(), emptyMap() ), equalTo( emptyMap() ) );
83+
84+
// spatial, temporal
85+
assertAsWithDefaultValueReturnDefault( value::asPoint, point( 1234, 1, 2 ).asPoint() );
86+
87+
assertAsWithDefaultValueReturnDefault( value::asLocalDate, LocalDate.now() );
88+
assertAsWithDefaultValueReturnDefault( value::asOffsetTime, OffsetTime.now() );
89+
assertAsWithDefaultValueReturnDefault( value::asLocalTime, LocalTime.now() );
90+
assertAsWithDefaultValueReturnDefault( value::asLocalDateTime, LocalDateTime.now() );
91+
assertAsWithDefaultValueReturnDefault( value::asZonedDateTime, ZonedDateTime.now() );
92+
assertAsWithDefaultValueReturnDefault( value::asIsoDuration,
93+
isoDuration( 1, 2, 3, 4 ).asIsoDuration() );
7294
}
7395

7496
@Test
7597
public void shouldReturnAsNull() throws Throwable
7698
{
77-
Value value = NullValue.NULL;
78-
79-
assertThat( value.computeOrNull( Value::asObject ), nullValue() );
80-
assertThat( value.computeOrNull( Value::asNumber ), nullValue() );
81-
assertThat( value.computeOrNull( Value::asByteArray ), nullValue() );
82-
83-
assertThat( value.computeOrNull( Value::asEntity ), nullValue() );
84-
assertThat( value.computeOrNull( Value::asNode ), nullValue() );
85-
assertThat( value.computeOrNull( Value::asRelationship ), nullValue() );
86-
assertThat( value.computeOrNull( Value::asPath ), nullValue() );
87-
88-
assertThat( value.computeOrNull( Value::asPoint ), nullValue() );
89-
90-
assertThat( value.computeOrNull( Value::asLocalDate ), nullValue() );
91-
assertThat( value.computeOrNull( Value::asOffsetTime ), nullValue() );
92-
assertThat( value.computeOrNull( Value::asLocalTime ), nullValue() );
93-
assertThat( value.computeOrNull( Value::asLocalDateTime ), nullValue() );
94-
assertThat( value.computeOrNull( Value::asZonedDateTime ), nullValue() );
95-
assertThat( value.computeOrNull( Value::asIsoDuration ), nullValue() );
96-
97-
assertThat( value.computeOrNull( Value::asList ), nullValue() );
98-
assertThat( value.computeOrNull( Value::asMap ), nullValue() );
99+
assertComputeOrDefaultReturnNull( Value::asObject );
100+
assertComputeOrDefaultReturnNull( Value::asNumber );
101+
102+
assertComputeOrDefaultReturnNull( Value::asEntity );
103+
assertComputeOrDefaultReturnNull( Value::asNode );
104+
assertComputeOrDefaultReturnNull( Value::asRelationship );
105+
assertComputeOrDefaultReturnNull( Value::asPath );
106+
107+
assertComputeOrDefaultReturnNull( Value::asString );
108+
assertComputeOrDefaultReturnNull( Value::asByteArray );
109+
assertComputeOrDefaultReturnNull( Value::asList );
110+
assertComputeOrDefaultReturnNull( v -> v.asList( ofValue() ) );
111+
assertComputeOrDefaultReturnNull( Value::asMap );
112+
assertComputeOrDefaultReturnNull( v -> v.asMap( ofValue() ) );
113+
114+
assertComputeOrDefaultReturnNull( Value::asPoint );
115+
116+
assertComputeOrDefaultReturnNull( Value::asLocalDate );
117+
assertComputeOrDefaultReturnNull( Value::asOffsetTime );
118+
assertComputeOrDefaultReturnNull( Value::asLocalTime );
119+
assertComputeOrDefaultReturnNull( Value::asLocalDateTime );
120+
assertComputeOrDefaultReturnNull( Value::asZonedDateTime );
121+
assertComputeOrDefaultReturnNull( Value::asIsoDuration );
99122
}
100123

101124
@Test
102125
public void shouldReturnAsDefaultValue() throws Throwable
103126
{
104-
Value value = NullValue.NULL;
105-
106-
assertThat( value.computeOrDefault( Value::asObject, "null" ), equalTo( "null" ) );
107-
assertThat( value.computeOrDefault( Value::asNumber, 10 ), equalTo( 10 ) );
108-
assertThat( value.computeOrDefault( Value::asByteArray, new byte[0] ), equalTo( new byte[0] ) );
109-
110-
assertThat( value.computeOrDefault( Value::asEntity, null ), nullValue() );
111-
assertThat( value.computeOrDefault( Value::asNode, null ), nullValue() );
112-
assertThat( value.computeOrDefault( Value::asRelationship, null ), nullValue() );
113-
assertThat( value.computeOrDefault( Value::asPath, null ), nullValue() );
114-
115-
assertComputeOrDefaultReturnsDefaultValue( Value::asPoint, point( 1234, 1, 2 ) );
127+
assertComputeOrDefaultReturnDefault( Value::asObject, "null string" );
128+
assertComputeOrDefaultReturnDefault( Value::asNumber, 10 );
129+
}
116130

117-
assertComputeOrDefaultReturnsDefaultValue( Value::asLocalDate, LocalDate.now() );
118-
assertComputeOrDefaultReturnsDefaultValue( Value::asOffsetTime, OffsetTime.now() );
119-
assertComputeOrDefaultReturnsDefaultValue( Value::asLocalTime, LocalTime.now() );
120-
assertComputeOrDefaultReturnsDefaultValue( Value::asLocalDateTime, LocalDateTime.now() );
121-
assertComputeOrDefaultReturnsDefaultValue( Value::asZonedDateTime, ZonedDateTime.now() );
122-
assertComputeOrDefaultReturnsDefaultValue( Value::asIsoDuration, Values.isoDuration( 1, 2, 3, 4 ) );
131+
private <T> void assertComputeOrDefaultReturnDefault( Function<Value,T> f, T defaultAndExpectedValue )
132+
{
133+
Value value = NullValue.NULL;
134+
assertThat( value.computeOrDefault( f, defaultAndExpectedValue ), equalTo( defaultAndExpectedValue ) );
135+
}
123136

124-
assertThat( value.computeOrDefault( Value::asList, Collections.emptyList() ), equalTo( Collections.emptyList() ) );
125-
assertThat( value.computeOrDefault( Value::asMap, Collections.emptyMap() ), equalTo( Collections.emptyMap() ) );
137+
private <T> void assertComputeOrDefaultReturnNull( Function<Value,T> f )
138+
{
139+
assertComputeOrDefaultReturnDefault( f, null );
126140
}
127141

128-
private <T> void assertComputeOrDefaultReturnsDefaultValue( Function<Value, T> f, T defaultAndExpectedValue )
142+
private <T> void assertAsWithDefaultValueReturnDefault( Function<T,T> map, T defaultValue )
129143
{
130-
Value value = NullValue.NULL;
131-
T returned = value.computeOrDefault( f, defaultAndExpectedValue );
132-
assertThat( returned, equalTo( defaultAndExpectedValue ) );
144+
assertThat( map.apply( defaultValue ), equalTo( defaultValue ) );
133145
}
134146
}

0 commit comments

Comments
 (0)