diff --git a/driver/src/main/java/org/neo4j/driver/internal/ExplicitTransaction.java b/driver/src/main/java/org/neo4j/driver/internal/ExplicitTransaction.java index 7436745db2..56578ac93d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/ExplicitTransaction.java +++ b/driver/src/main/java/org/neo4j/driver/internal/ExplicitTransaction.java @@ -47,9 +47,9 @@ import static java.util.Collections.emptyMap; import static java.util.concurrent.CompletableFuture.completedFuture; +import static org.neo4j.driver.internal.util.Extract.parameters; import static org.neo4j.driver.internal.util.Futures.completedWithNull; import static org.neo4j.driver.internal.util.Futures.failedFuture; -import static org.neo4j.driver.v1.Values.value; public class ExplicitTransaction implements Transaction { @@ -227,7 +227,7 @@ public CompletionStage runAsync( String statementTemplate @Override public StatementResult run( String statementText, Map statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters ); return run( statementText, params ); } @@ -235,21 +235,21 @@ public StatementResult run( String statementText, Map statementPa public CompletionStage runAsync( String statementTemplate, Map statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters ); return runAsync( statementTemplate, params ); } @Override public StatementResult run( String statementTemplate, Record statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters.asMap() ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters.asMap() ); return run( statementTemplate, params ); } @Override public CompletionStage runAsync( String statementTemplate, Record statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters.asMap() ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters.asMap() ); return runAsync( statementTemplate, params ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/NetworkSession.java b/driver/src/main/java/org/neo4j/driver/internal/NetworkSession.java index 0fe5296678..21af1d8cb8 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/NetworkSession.java +++ b/driver/src/main/java/org/neo4j/driver/internal/NetworkSession.java @@ -47,9 +47,9 @@ import org.neo4j.driver.v1.types.TypeSystem; import static java.util.concurrent.CompletableFuture.completedFuture; +import static org.neo4j.driver.internal.util.Extract.parameters; import static org.neo4j.driver.internal.util.Futures.completedWithNull; import static org.neo4j.driver.internal.util.Futures.failedFuture; -import static org.neo4j.driver.v1.Values.value; public class NetworkSession implements Session { @@ -91,7 +91,7 @@ public CompletionStage runAsync( String statementText ) @Override public StatementResult run( String statementText, Map statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters ); return run( statementText, params ); } @@ -99,21 +99,21 @@ public StatementResult run( String statementText, Map statementPa public CompletionStage runAsync( String statementText, Map statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters ); return runAsync( statementText, params ); } @Override public StatementResult run( String statementTemplate, Record statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters.asMap() ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters.asMap() ); return run( statementTemplate, params ); } @Override public CompletionStage runAsync( String statementTemplate, Record statementParameters ) { - Value params = statementParameters == null ? Values.EmptyMap : value( statementParameters.asMap() ); + Value params = statementParameters == null ? Values.EmptyMap : parameters( statementParameters.asMap() ); return runAsync( statementTemplate, params ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java b/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java index ca825ca536..1138716bde 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java +++ b/driver/src/main/java/org/neo4j/driver/internal/util/Extract.java @@ -24,9 +24,17 @@ import java.util.Map; import org.neo4j.driver.internal.InternalPair; +import org.neo4j.driver.internal.value.MapValue; +import org.neo4j.driver.internal.value.NodeValue; +import org.neo4j.driver.internal.value.PathValue; +import org.neo4j.driver.internal.value.RelationshipValue; import org.neo4j.driver.v1.Record; import org.neo4j.driver.v1.Value; +import org.neo4j.driver.v1.exceptions.ClientException; import org.neo4j.driver.v1.types.MapAccessor; +import org.neo4j.driver.v1.types.Node; +import org.neo4j.driver.v1.types.Path; +import org.neo4j.driver.v1.types.Relationship; import org.neo4j.driver.v1.util.Function; import org.neo4j.driver.v1.util.Pair; @@ -36,6 +44,8 @@ import static java.util.Collections.singletonMap; import static java.util.Collections.unmodifiableList; import static java.util.Collections.unmodifiableMap; +import static org.neo4j.driver.internal.util.Iterables.newHashMapWithSize; +import static org.neo4j.driver.v1.Values.value; /** * Utility class for extracting data. @@ -190,4 +200,32 @@ public static List> fields( final Record map, final Function } } } + + public static Value parameters( Map val ) + { + Map asValues = newHashMapWithSize( val.size() ); + for ( Map.Entry entry : val.entrySet() ) + { + Object value = entry.getValue(); + assertParameter( value ); + asValues.put( entry.getKey(), value( value ) ); + } + return new MapValue( asValues ); + } + + public static void assertParameter( Object value ) + { + if ( value instanceof Node || value instanceof NodeValue ) + { + throw new ClientException( "Nodes can't be used as parameters." ); + } + if ( value instanceof Relationship || value instanceof RelationshipValue ) + { + throw new ClientException( "Relationships can't be used as parameters." ); + } + if ( value instanceof Path || value instanceof PathValue ) + { + throw new ClientException( "Paths can't be used as parameters." ); + } + } } diff --git a/driver/src/main/java/org/neo4j/driver/v1/Values.java b/driver/src/main/java/org/neo4j/driver/v1/Values.java index dfaa01f255..920af896ee 100644 --- a/driver/src/main/java/org/neo4j/driver/v1/Values.java +++ b/driver/src/main/java/org/neo4j/driver/v1/Values.java @@ -49,11 +49,8 @@ import org.neo4j.driver.internal.value.LocalDateTimeValue; import org.neo4j.driver.internal.value.LocalTimeValue; import org.neo4j.driver.internal.value.MapValue; -import org.neo4j.driver.internal.value.NodeValue; import org.neo4j.driver.internal.value.NullValue; -import org.neo4j.driver.internal.value.PathValue; import org.neo4j.driver.internal.value.PointValue; -import org.neo4j.driver.internal.value.RelationshipValue; import org.neo4j.driver.internal.value.StringValue; import org.neo4j.driver.internal.value.TimeValue; import org.neo4j.driver.v1.exceptions.ClientException; @@ -67,6 +64,7 @@ import org.neo4j.driver.v1.types.TypeSystem; import org.neo4j.driver.v1.util.Function; +import static org.neo4j.driver.internal.util.Extract.assertParameter; import static org.neo4j.driver.internal.util.Iterables.newHashMapWithSize; /** @@ -94,7 +92,6 @@ public static Value value( Object value ) { if ( value == null ) { return NullValue.NULL; } - assertParameter( value ); if ( value instanceof AsValue ) { return ((AsValue) value).asValue(); } if ( value instanceof Boolean ) { return value( (boolean) value ); } if ( value instanceof String ) { return value( (String) value ); } @@ -385,6 +382,7 @@ public static Value parameters( Object... keysAndValues ) for ( int i = 0; i < keysAndValues.length; i += 2 ) { Object value = keysAndValues[i + 1]; + assertParameter( value ); map.put( keysAndValues[i].toString(), value( value ) ); } return value( map ); @@ -666,21 +664,4 @@ public static Function> ofList( final Function innerM { return value -> value.asList( innerMap ); } - - private static void assertParameter( Object value ) - { - if ( value instanceof Node || value instanceof NodeValue ) - { - throw new ClientException( "Nodes can't be used as parameters." ); - } - if ( value instanceof Relationship || value instanceof RelationshipValue ) - { - throw new ClientException( "Relationships can't be used as parameters." ); - } - if ( value instanceof Path || value instanceof PathValue ) - { - throw new ClientException( "Paths can't be used as parameters." ); - } - - } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java b/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java index 08c9b0dbd2..cf4c291ac2 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java @@ -494,74 +494,50 @@ public void shouldCreateValueFromPoint3D() } @Test - public void shouldComplainAboutNodeValueType() throws Throwable + public void shouldCreateValueFromNodeValue() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Nodes can't be used as parameters." ); - - // When NodeValue node = emptyNodeValue(); - value( node ); + Value value = value( node ); + assertEquals( node, value ); } @Test - public void shouldComplainAboutNodeType() throws Throwable + public void shouldCreateValueFromNode() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Nodes can't be used as parameters." ); - - // When Node node = emptyNodeValue().asNode(); - value( node ); + Value value = value( node ); + assertEquals( node, value.asNode() ); } @Test - public void shouldComplainAboutRelationshipValueType() throws Throwable + public void shouldCreateValueFromRelationshipValue() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Relationships can't be used as parameters." ); - - // When RelationshipValue rel = emptyRelationshipValue(); - value( rel ); + Value value = value( rel ); + assertEquals( rel, value ); } @Test - public void shouldComplainAboutRelationshipType() throws Throwable + public void shouldCreateValueFromRelationship() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Relationships can't be used as parameters." ); - - // When Relationship rel = emptyRelationshipValue().asRelationship(); - value( rel ); + Value value = value( rel ); + assertEquals( rel, value.asRelationship() ); } @Test - public void shouldComplainAboutPathValueType() throws Throwable + public void shouldCreateValueFromPathValue() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Paths can't be used as parameters." ); - - // When PathValue path = filledPathValue(); - value( path ); + Value value = value( path ); + assertEquals( path, value ); } @Test - public void shouldComplainAboutPathType() throws Throwable + public void shouldCreateValueFromPath() { - // Expect - exception.expect( ClientException.class ); - exception.expectMessage( "Paths can't be used as parameters." ); - - // When Path path = filledPathValue().asPath(); - value( path ); + Value value = value( path ); + assertEquals( path, value.asPath() ); } }