From fd45ae646a3c411f9a439ad0992bdd4d00c734f6 Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Wed, 18 Jun 2025 19:55:23 +0100 Subject: [PATCH] perf(value): optimise value handling for Bolt Connection The objective of this update is to reduce the amount of memory allocations needed when Bolt Connection values are used. Driver internal values now implement Bolt Connection values directly and no longer need a wrapper adapter. In addition, lists are used instead of arrays to prevent array copying. --- .../main/java/org/neo4j/driver/Values.java | 57 +++--- .../neo4j/driver/internal/InternalRecord.java | 17 +- .../AdaptingDriverResponseHandler.java | 10 +- .../adaptedbolt/BasicResponseHandler.java | 6 +- .../adaptedbolt/DriverResponseHandler.java | 3 +- .../async/DelegatingResponseHandler.java | 3 +- .../internal/cursor/ResultCursorImpl.java | 2 +- .../internal/cursor/RxResultCursorImpl.java | 2 +- .../neo4j/driver/internal/util/Extract.java | 17 +- .../driver/internal/value/BoltValue.java | 190 ------------------ .../internal/value/BoltValueFactory.java | 72 ++++--- .../driver/internal/value/BooleanValue.java | 15 +- .../driver/internal/value/BytesValue.java | 10 +- .../driver/internal/value/DateTimeValue.java | 4 +- .../driver/internal/value/DateValue.java | 4 +- .../driver/internal/value/DurationValue.java | 4 +- .../driver/internal/value/FloatValue.java | 10 +- .../driver/internal/value/IntegerValue.java | 10 +- .../driver/internal/value/InternalValue.java | 48 ++++- .../driver/internal/value/ListValue.java | 49 ++--- .../internal/value/LocalDateTimeValue.java | 4 +- .../driver/internal/value/LocalTimeValue.java | 4 +- .../neo4j/driver/internal/value/MapValue.java | 16 +- .../driver/internal/value/NodeValue.java | 4 +- .../driver/internal/value/NullValue.java | 10 +- .../driver/internal/value/PathValue.java | 4 +- .../driver/internal/value/PointValue.java | 4 +- .../internal/value/RelationshipValue.java | 4 +- .../driver/internal/value/StringValue.java | 10 +- .../driver/internal/value/TimeValue.java | 4 +- .../value/UnsupportedDateTimeValue.java | 10 +- .../java/org/neo4j/driver/AuthTokensTest.java | 6 +- .../org/neo4j/driver/ObjectMappingTests.java | 6 +- .../java/org/neo4j/driver/ParametersTest.java | 3 +- .../driver/integration/ScalarTypeIT.java | 23 ++- .../neo4j/driver/internal/ExtractTest.java | 31 +-- ...ternalMapAccessorWithDefaultValueTest.java | 31 ++- .../driver/internal/InternalRecordTest.java | 16 +- .../driver/internal/InternalResultTest.java | 2 +- .../internal/InternalTransactionTest.java | 3 +- .../org/neo4j/driver/internal/ValuesTest.java | 73 +++++-- .../async/InternalAsyncSessionTest.java | 3 +- .../async/InternalAsyncTransactionTest.java | 4 +- .../internal/cursor/ResultCursorImplTest.java | 11 +- .../reactive/InternalReactiveSessionTest.java | 3 +- .../summary/InternalProfiledPlanTest.java | 5 +- .../driver/internal/value/ListValueTest.java | 2 +- pom.xml | 2 +- .../backend/messages/requests/StartTest.java | 3 - .../TestkitNodeValueSerializer.java | 2 +- .../TestkitPathValueSerializer.java | 4 +- 51 files changed, 343 insertions(+), 497 deletions(-) delete mode 100644 driver/src/main/java/org/neo4j/driver/internal/value/BoltValue.java diff --git a/driver/src/main/java/org/neo4j/driver/Values.java b/driver/src/main/java/org/neo4j/driver/Values.java index 7bf5685f0d..e68454d9a0 100644 --- a/driver/src/main/java/org/neo4j/driver/Values.java +++ b/driver/src/main/java/org/neo4j/driver/Values.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; import org.neo4j.driver.exceptions.ClientException; @@ -44,7 +45,6 @@ import org.neo4j.driver.internal.InternalIsoDuration; import org.neo4j.driver.internal.InternalPoint2D; import org.neo4j.driver.internal.InternalPoint3D; -import org.neo4j.driver.internal.value.BoltValue; import org.neo4j.driver.internal.value.BooleanValue; import org.neo4j.driver.internal.value.BytesValue; import org.neo4j.driver.internal.value.DateTimeValue; @@ -110,9 +110,6 @@ public static Value value(Object value) { return NullValue.NULL; } - if (value instanceof BoltValue boltValue) { - return boltValue.asDriverValue(); - } if (value instanceof AsValue) { return ((AsValue) value).asValue(); } @@ -252,10 +249,7 @@ public static Value[] values(final Object... input) { * @return the value */ public static Value value(Value... input) { - var size = input.length; - var values = new Value[size]; - System.arraycopy(input, 0, values, 0, size); - return new ListValue(values); + return new ListValue(List.of(input)); } /** @@ -273,7 +267,9 @@ public static Value value(byte... input) { * @return the value */ public static Value value(String... input) { - var values = Arrays.stream(input).map(StringValue::new).toArray(StringValue[]::new); + var values = Arrays.stream(input) + .map(StringValue::new) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -283,8 +279,9 @@ public static Value value(String... input) { * @return the value */ public static Value value(boolean... input) { - var values = - IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + var values = IntStream.range(0, input.length) + .mapToObj(i -> value(input[i])) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -294,8 +291,9 @@ public static Value value(boolean... input) { * @return the value */ public static Value value(char... input) { - var values = - IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + var values = IntStream.range(0, input.length) + .mapToObj(i -> value(input[i])) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -305,7 +303,9 @@ public static Value value(char... input) { * @return the value */ public static Value value(long... input) { - var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + var values = Arrays.stream(input) + .mapToObj(Values::value) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -315,8 +315,9 @@ public static Value value(long... input) { * @return the value */ public static Value value(short... input) { - var values = - IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + var values = IntStream.range(0, input.length) + .mapToObj(i -> value(input[i])) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } /** @@ -325,7 +326,9 @@ public static Value value(short... input) { * @return the value */ public static Value value(int... input) { - var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + var values = Arrays.stream(input) + .mapToObj(Values::value) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } /** @@ -334,7 +337,9 @@ public static Value value(int... input) { * @return the value */ public static Value value(double... input) { - var values = Arrays.stream(input).mapToObj(Values::value).toArray(Value[]::new); + var values = Arrays.stream(input) + .mapToObj(Values::value) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -344,8 +349,9 @@ public static Value value(double... input) { * @return the value */ public static Value value(float... input) { - var values = - IntStream.range(0, input.length).mapToObj(i -> value(input[i])).toArray(Value[]::new); + var values = IntStream.range(0, input.length) + .mapToObj(i -> value(input[i])) + .collect(Collectors.toCollection(() -> new ArrayList<>(input.length))); return new ListValue(values); } @@ -355,11 +361,8 @@ public static Value value(float... input) { * @return the value */ public static Value value(List vals) { - var values = new Value[vals.size()]; - var i = 0; - for (var val : vals) { - values[i++] = value(val); - } + var values = + vals.stream().map(Values::value).collect(Collectors.toCollection(() -> new ArrayList<>(vals.size()))); return new ListValue(values); } @@ -382,7 +385,7 @@ public static Value value(Iterator val) { while (val.hasNext()) { values.add(value(val.next())); } - return new ListValue(values.toArray(new Value[0])); + return new ListValue(values); } /** @@ -391,7 +394,7 @@ public static Value value(Iterator val) { * @return the value */ public static Value value(Stream stream) { - var values = stream.map(Values::value).toArray(Value[]::new); + var values = stream.map(Values::value).collect(Collectors.toList()); return new ListValue(values); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/InternalRecord.java b/driver/src/main/java/org/neo4j/driver/internal/InternalRecord.java index 954c09fb06..afb7961620 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/InternalRecord.java +++ b/driver/src/main/java/org/neo4j/driver/internal/InternalRecord.java @@ -21,7 +21,6 @@ import static org.neo4j.driver.Values.ofValue; import static org.neo4j.driver.internal.util.Format.formatPairs; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -39,15 +38,15 @@ public class InternalRecord extends InternalMapAccessorWithDefaultValue implements Record { private final QueryKeys queryKeys; - private final Value[] values; + private final List values; private int hashCode = 0; - public InternalRecord(List keys, Value[] values) { + public InternalRecord(List keys, List values) { this.queryKeys = new QueryKeys(keys); this.values = values; } - public InternalRecord(QueryKeys queryKeys, Value[] values) { + public InternalRecord(QueryKeys queryKeys, List values) { this.queryKeys = queryKeys; this.values = values; } @@ -59,7 +58,7 @@ public List keys() { @Override public List values() { - return Arrays.asList(values); + return values; } @Override @@ -94,18 +93,18 @@ public Value get(String key) { if (fieldIndex == -1) { return Values.NULL; } else { - return values[fieldIndex]; + return values.get(fieldIndex); } } @Override public Value get(int index) { - return index >= 0 && index < values.length ? values[index] : Values.NULL; + return index >= 0 && index < values.size() ? values.get(index) : Values.NULL; } @Override public int size() { - return values.length; + return values.size(); } @Override @@ -161,7 +160,7 @@ public boolean equals(Object other) { @Override public int hashCode() { if (hashCode == 0) { - hashCode = 31 * queryKeys.hashCode() + Arrays.hashCode(values); + hashCode = 31 * queryKeys.hashCode() + values.hashCode(); } return hashCode; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java index a503069597..91e1369c37 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/AdaptingDriverResponseHandler.java @@ -16,7 +16,7 @@ */ package org.neo4j.driver.internal.adaptedbolt; -import java.util.Arrays; +import java.util.List; import java.util.Map; import java.util.Objects; import org.neo4j.bolt.connection.ResponseHandler; @@ -32,7 +32,6 @@ import org.neo4j.bolt.connection.summary.RunSummary; import org.neo4j.bolt.connection.summary.TelemetrySummary; import org.neo4j.driver.Value; -import org.neo4j.driver.internal.value.BoltValue; import org.neo4j.driver.internal.value.BoltValueFactory; final class AdaptingDriverResponseHandler implements ResponseHandler { @@ -63,11 +62,8 @@ public void onRunSummary(RunSummary summary) { } @Override - public void onRecord(org.neo4j.bolt.connection.values.Value[] fields) { - var mappedFields = Arrays.stream(fields) - .map(field -> ((BoltValue) field).asDriverValue()) - .toArray(Value[]::new); - delegate.onRecord(mappedFields); + public void onRecord(List fields) { + delegate.onRecord(boltValueFactory.toDriverList(fields)); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java index 3736ca539b..bb88bb9029 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/BasicResponseHandler.java @@ -37,7 +37,7 @@ public class BasicResponseHandler implements DriverResponseHandler { private final CompletableFuture summariesFuture = new CompletableFuture<>(); - private final List valuesList = new ArrayList<>(); + private final List> valuesList = new ArrayList<>(); private BeginSummary beginSummary; private RunSummary runSummary; @@ -83,7 +83,7 @@ public void onRunSummary(RunSummary summary) { } @Override - public void onRecord(Value[] fields) { + public void onRecord(List fields) { valuesList.add(fields); } @@ -162,7 +162,7 @@ public void onComplete() { public record Summaries( BeginSummary beginSummary, RunSummary runSummary, - List valuesList, + List> valuesList, PullSummary pullSummary, DiscardSummary discardSummary, CommitSummary commitSummary, diff --git a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java index b575b62d74..2973413351 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/adaptedbolt/DriverResponseHandler.java @@ -16,6 +16,7 @@ */ package org.neo4j.driver.internal.adaptedbolt; +import java.util.List; import org.neo4j.bolt.connection.summary.BeginSummary; import org.neo4j.bolt.connection.summary.CommitSummary; import org.neo4j.bolt.connection.summary.LogoffSummary; @@ -41,7 +42,7 @@ default void onRunSummary(RunSummary summary) { // ignored } - default void onRecord(Value[] fields) { + default void onRecord(List fields) { // ignored } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java b/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java index 15ea6ee4e0..70056dfd3d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/DelegatingResponseHandler.java @@ -16,6 +16,7 @@ */ package org.neo4j.driver.internal.async; +import java.util.List; import java.util.Objects; import org.neo4j.bolt.connection.summary.BeginSummary; import org.neo4j.bolt.connection.summary.CommitSummary; @@ -54,7 +55,7 @@ public void onRunSummary(RunSummary summary) { } @Override - public void onRecord(Value[] fields) { + public void onRecord(List fields) { delegate.onRecord(fields); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java index bf34aa3c19..b948b07894 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cursor/ResultCursorImpl.java @@ -591,7 +591,7 @@ public void onRunSummary(RunSummary summary) { } @Override - public void onRecord(Value[] fields) { + public void onRecord(List fields) { var record = new InternalRecord(runSummary.keys(), fields); CompletableFuture peekFuture; CompletableFuture recordFuture = null; diff --git a/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java index 9ff8138672..fe4824e0f2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cursor/RxResultCursorImpl.java @@ -331,7 +331,7 @@ public synchronized void onIgnored() { } @Override - public void onRecord(Value[] fields) { + public void onRecord(List fields) { log.trace("[%d] onRecord", hashCode()); synchronized (this) { updateRecordState(RecordState.HAD_RECORD); 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 ed38d9bff9..6fb125bc05 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 @@ -26,7 +26,6 @@ import static org.neo4j.driver.internal.util.Iterables.newHashMapWithSize; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -52,25 +51,17 @@ private Extract() { throw new UnsupportedOperationException(); } - public static List list(Value[] values) { - return switch (values.length) { - case 0 -> emptyList(); - case 1 -> singletonList(values[0]); - default -> List.of(values); - }; - } - - public static List list(Value[] data, Function mapFunction) { - var size = data.length; + public static List list(List data, Function mapFunction) { + var size = data.size(); switch (size) { case 0 -> { return emptyList(); } case 1 -> { - return singletonList(mapFunction.apply(data[0])); + return singletonList(mapFunction.apply(data.get(0))); } default -> { - return Arrays.stream(data).map(mapFunction).toList(); + return data.stream().map(mapFunction).toList(); } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BoltValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/BoltValue.java deleted file mode 100644 index e1b813bc8f..0000000000 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BoltValue.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) "Neo4j" - * Neo4j Sweden AB [https://neo4j.com] - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.neo4j.driver.internal.value; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetTime; -import java.time.ZonedDateTime; -import java.util.Iterator; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; -import org.neo4j.bolt.connection.values.IsoDuration; -import org.neo4j.bolt.connection.values.Point; -import org.neo4j.bolt.connection.values.Type; -import org.neo4j.bolt.connection.values.Value; -import org.neo4j.driver.exceptions.value.Uncoercible; -import org.neo4j.driver.internal.InternalIsoDuration; -import org.neo4j.driver.internal.InternalPoint2D; -import org.neo4j.driver.internal.InternalPoint3D; - -public class BoltValue implements org.neo4j.bolt.connection.values.Value { - private final InternalValue value; - private final Type type; - - public BoltValue(InternalValue value, Type type) { - this.value = Objects.requireNonNull(value); - this.type = Objects.requireNonNull(type); - } - - public org.neo4j.driver.Value asDriverValue() { - return value; - } - - @Override - public Type type() { - return type; - } - - @Override - public boolean asBoolean() { - return value.asBoolean(); - } - - @Override - public byte[] asByteArray() { - return value.asByteArray(); - } - - @Override - public String asString() { - return value.asString(); - } - - @Override - public long asLong() { - return value.asLong(); - } - - @Override - public double asDouble() { - return value.asDouble(); - } - - @Override - public LocalDate asLocalDate() { - return value.asLocalDate(); - } - - @Override - public OffsetTime asOffsetTime() { - return value.asOffsetTime(); - } - - @Override - public LocalTime asLocalTime() { - return value.asLocalTime(); - } - - @Override - public LocalDateTime asLocalDateTime() { - return value.asLocalDateTime(); - } - - @Override - public ZonedDateTime asZonedDateTime() { - return value.asZonedDateTime(); - } - - @Override - public IsoDuration asIsoDuration() { - return (InternalIsoDuration) value.asIsoDuration(); - } - - @Override - public Point asPoint() { - var point = value.asPoint(); - if (point instanceof InternalPoint2D internalPoint2D) { - return internalPoint2D; - } else if (point instanceof InternalPoint3D internalPoint3D) { - return internalPoint3D; - } - throw new Uncoercible(value.type().name(), "Bolt IsoDuration"); - } - - @Override - public boolean isNull() { - return value.isNull(); - } - - @Override - public boolean isEmpty() { - return value.isEmpty(); - } - - @Override - public Iterable keys() { - return value.keys(); - } - - @Override - public int size() { - return value.size(); - } - - @Override - public org.neo4j.bolt.connection.values.Value get(String key) { - return ((InternalValue) value.get(key)).asBoltValue(); - } - - @Override - public Iterable values() { - return () -> new Iterator<>() { - private final Iterator iterator = - value.values().iterator(); - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public Value next() { - return ((InternalValue) iterator.next()).asBoltValue(); - } - }; - } - - @Override - public boolean containsKey(String key) { - return value.containsKey(key); - } - - @Override - public Map asMap(Function mapFunction) { - return value.asMap(v -> mapFunction.apply(((InternalValue) v).asBoltValue())); - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - var boltValue = (BoltValue) o; - return Objects.equals(value, boltValue.value) && type == boltValue.type; - } - - @Override - public int hashCode() { - return Objects.hash(value, type); - } - - @Override - public String toString() { - return value.toString(); - } -} diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java b/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java index c324cf4513..e9618f7274 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BoltValueFactory.java @@ -27,7 +27,6 @@ import java.time.ZonedDateTime; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import org.neo4j.bolt.connection.values.Node; @@ -52,22 +51,22 @@ private BoltValueFactory() {} @Override public Value value(Object value) { - return ((InternalValue) Values.value(value)).asBoltValue(); + return ((InternalValue) Values.value(value)); } @Override public Value value(boolean value) { - return ((InternalValue) Values.value(value)).asBoltValue(); + return ((InternalValue) Values.value(value)); } @Override public Value value(long value) { - return ((InternalValue) Values.value(value)).asBoltValue(); + return ((InternalValue) Values.value(value)); } @Override public Value value(double value) { - return ((InternalValue) Values.value(value)).asBoltValue(); + return ((InternalValue) Values.value(value)); } @Override @@ -75,7 +74,7 @@ public Value value(byte[] values) { if (values == null) { return value((Object) null); } - return ((InternalValue) Values.value(values)).asBoltValue(); + return ((InternalValue) Values.value(values)); } @Override @@ -83,23 +82,25 @@ public Value value(String value) { if (value == null) { return value((Object) null); } - return ((InternalValue) Values.value(value)).asBoltValue(); + return ((InternalValue) Values.value(value)); } + @SuppressWarnings("unchecked") @Override public Value value(Map stringToValue) { if (stringToValue == null) { return value((Object) null); } - return ((InternalValue) Values.value(stringToValue)).asBoltValue(); + return new MapValue((Map) (Map) stringToValue); } + @SuppressWarnings("unchecked") @Override - public Value value(Value[] values) { + public Value value(List values) { if (values == null) { return value((Object) null); } - return ((InternalValue) Values.value(values)).asBoltValue(); + return new ListValue((List) (List) values); } @Override @@ -107,7 +108,7 @@ public Value value(Node node) { if (node == null) { return value((Object) null); } - return ((InternalValue) Values.value(node)).asBoltValue(); + return (InternalValue) ((InternalNode) node).asValue(); } @Override @@ -115,7 +116,7 @@ public Value value(Relationship relationship) { if (relationship == null) { return value((Object) null); } - return ((InternalValue) Values.value(relationship)).asBoltValue(); + return (InternalValue) ((InternalRelationship) relationship).asValue(); } @Override @@ -123,7 +124,7 @@ public Value value(Path path) { if (path == null) { return value((Object) null); } - return ((InternalValue) Values.value(path)).asBoltValue(); + return (InternalValue) ((InternalPath) path).asValue(); } @Override @@ -131,7 +132,7 @@ public Value value(LocalDate localDate) { if (localDate == null) { return value((Object) null); } - return ((InternalValue) Values.value(localDate)).asBoltValue(); + return ((InternalValue) Values.value(localDate)); } @Override @@ -139,7 +140,7 @@ public Value value(OffsetTime offsetTime) { if (offsetTime == null) { return value((Object) null); } - return ((InternalValue) Values.value(offsetTime)).asBoltValue(); + return ((InternalValue) Values.value(offsetTime)); } @Override @@ -147,7 +148,7 @@ public Value value(LocalTime localTime) { if (localTime == null) { return value((Object) null); } - return ((InternalValue) Values.value(localTime)).asBoltValue(); + return ((InternalValue) Values.value(localTime)); } @Override @@ -155,7 +156,7 @@ public Value value(LocalDateTime localDateTime) { if (localDateTime == null) { return value((Object) null); } - return ((InternalValue) Values.value(localDateTime)).asBoltValue(); + return ((InternalValue) Values.value(localDateTime)); } @Override @@ -163,7 +164,7 @@ public Value value(OffsetDateTime offsetDateTime) { if (offsetDateTime == null) { return value((Object) null); } - return ((InternalValue) Values.value(offsetDateTime)).asBoltValue(); + return ((InternalValue) Values.value(offsetDateTime)); } @Override @@ -171,7 +172,7 @@ public Value value(ZonedDateTime zonedDateTime) { if (zonedDateTime == null) { return value((Object) null); } - return ((InternalValue) Values.value(zonedDateTime)).asBoltValue(); + return ((InternalValue) Values.value(zonedDateTime)); } @Override @@ -179,7 +180,7 @@ public Value value(Period period) { if (period == null) { return value((Object) null); } - return ((InternalValue) Values.value(period)).asBoltValue(); + return ((InternalValue) Values.value(period)); } @Override @@ -187,7 +188,7 @@ public Value value(Duration duration) { if (duration == null) { return value((Object) null); } - return ((InternalValue) Values.value(duration)).asBoltValue(); + return ((InternalValue) Values.value(duration)); } @Override @@ -230,39 +231,36 @@ public Path path(List segments, List nodes, List re @Override public Value isoDuration(long months, long days, long seconds, int nanoseconds) { - return ((InternalValue) Values.isoDuration(months, days, seconds, nanoseconds)).asBoltValue(); + return ((InternalValue) Values.isoDuration(months, days, seconds, nanoseconds)); } @Override public Value point(int srid, double x, double y) { - return ((InternalValue) Values.point(srid, x, y)).asBoltValue(); + return ((InternalValue) Values.point(srid, x, y)); } @Override public Value point(int srid, double x, double y, double z) { - return ((InternalValue) Values.point(srid, x, y, z)).asBoltValue(); + return ((InternalValue) Values.point(srid, x, y, z)); } @Override public Value unsupportedDateTimeValue(DateTimeException e) { - return new UnsupportedDateTimeValue(e).asBoltValue(); + return new UnsupportedDateTimeValue(e); } + @SuppressWarnings("unchecked") public Map toBoltMap(Map map) { - var result = new HashMap(map.size()); - for (var entry : map.entrySet()) { - var boltValue = ((InternalValue) entry.getValue()).asBoltValue(); - result.put(entry.getKey(), boltValue); - } - return Collections.unmodifiableMap(result); + return Collections.unmodifiableMap((Map) (Map) map); } + @SuppressWarnings("unchecked") public Map toDriverMap(Map map) { - var result = new HashMap(map.size()); - for (var entry : map.entrySet()) { - var boltValue = ((BoltValue) entry.getValue()).asDriverValue(); - result.put(entry.getKey(), boltValue); - } - return Collections.unmodifiableMap(result); + return Collections.unmodifiableMap((Map) (Map) map); + } + + @SuppressWarnings("unchecked") + public List toDriverList(List list) { + return (List) (List) list; } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java index 2671c66df5..3619165e35 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BooleanValue.java @@ -40,6 +40,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.BOOLEAN(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.BOOLEAN; + } + @Override public int hashCode() { var value = asBoolean() ? Boolean.TRUE : Boolean.FALSE; @@ -84,11 +89,6 @@ public boolean equals(Object obj) { public String toString() { return "TRUE"; } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.BOOLEAN); - } } private static class FalseValue extends BooleanValue { @@ -128,10 +128,5 @@ public boolean equals(Object obj) { public String toString() { return "FALSE"; } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.BOOLEAN); - } } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java index c8ad70a580..5e79060238 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/BytesValue.java @@ -64,6 +64,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.BYTES(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.BYTES; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -93,9 +98,4 @@ public String toString() { } return s.toString(); } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.BYTES); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java index e2c0ca0164..7ddbeacca7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DateTimeValue.java @@ -43,8 +43,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.DATE_TIME); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.DATE_TIME; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java index 07ab3415e9..7e67dabb5a 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DateValue.java @@ -37,8 +37,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.DATE); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.DATE; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java index cf37b54d13..a8bf16c564 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/DurationValue.java @@ -36,8 +36,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.DURATION); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.DURATION; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java index df6771ed5e..be2b8ea7ae 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/FloatValue.java @@ -33,6 +33,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.FLOAT(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.FLOAT; + } + @Override public Double asNumber() { return val; @@ -119,9 +124,4 @@ public int hashCode() { public String toString() { return Double.toString(val); } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.FLOAT); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java index 3588b7ffea..3616580db2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/IntegerValue.java @@ -33,6 +33,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.INTEGER(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.INTEGER; + } + @Override public Long asNumber() { return val; @@ -122,9 +127,4 @@ public boolean equals(Object o) { public int hashCode() { return (int) (val ^ (val >>> 32)); } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.INTEGER); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java index f41927dc24..6a5712b0bd 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/InternalValue.java @@ -18,16 +18,18 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Iterator; +import java.util.Map; +import org.neo4j.bolt.connection.values.IsoDuration; +import org.neo4j.bolt.connection.values.Point; import org.neo4j.driver.Value; import org.neo4j.driver.exceptions.value.Uncoercible; import org.neo4j.driver.internal.AsValue; import org.neo4j.driver.internal.types.TypeConstructor; -public interface InternalValue extends Value, AsValue { +public interface InternalValue extends Value, AsValue, org.neo4j.bolt.connection.values.Value { TypeConstructor typeConstructor(); - BoltValue asBoltValue(); - default Object as(Type type) { if (type instanceof ParameterizedType parameterizedType) { return as(parameterizedType); @@ -41,4 +43,44 @@ default Object as(Type type) { default Object as(ParameterizedType type) { throw new Uncoercible(type().name(), type.toString()); } + + @Override + default org.neo4j.bolt.connection.values.Value getBoltValue(String key) { + return (org.neo4j.bolt.connection.values.Value) get(key); + } + + @Override + default IsoDuration asBoltIsoDuration() { + return (IsoDuration) asIsoDuration(); + } + + @Override + default Point asBoltPoint() { + return (Point) asPoint(); + } + + @Override + default Iterable boltValues() { + var values = values(); + return () -> { + var iterator = values.iterator(); + return new Iterator<>() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public org.neo4j.bolt.connection.values.Value next() { + var next = iterator.next(); + return next != null ? (org.neo4j.bolt.connection.values.Value) next : null; + } + }; + }; + } + + @Override + default Map asBoltMap() { + return asMap(value -> (org.neo4j.bolt.connection.values.Value) value); + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java index 9809ac71ac..347115ea9e 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/ListValue.java @@ -20,7 +20,6 @@ import java.lang.reflect.Array; import java.lang.reflect.ParameterizedType; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.function.Function; @@ -33,9 +32,9 @@ import org.neo4j.driver.types.Type; public class ListValue extends ValueAdapter { - private final Value[] values; + private final List values; - public ListValue(Value... values) { + public ListValue(List values) { if (values == null) { throw new IllegalArgumentException("Cannot construct ListValue from null"); } @@ -44,7 +43,7 @@ public ListValue(Value... values) { @Override public boolean isEmpty() { - return values.length == 0; + return values.isEmpty(); } @Override @@ -68,11 +67,11 @@ public T as(Class targetClass) { return targetClass.cast(asList()); } else if (targetClass.isArray()) { var componentType = targetClass.componentType(); - var array = Array.newInstance(componentType, values.length); - for (var i = 0; i < values.length; i++) { + var array = Array.newInstance(componentType, values.size()); + for (var i = 0; i < values.size(); i++) { Object value; try { - value = values[i].as(componentType); + value = values.get(i).as(componentType); } catch (Throwable throwable) { throw new ValueException( "Failed to map LIST value to %s - an error occured while mapping the element at index %d" @@ -103,31 +102,27 @@ public Object as(ParameterizedType type) { @Override public int size() { - return values.length; + return values.size(); } @Override public Value get(int index) { - return index >= 0 && index < values.length ? values[index] : Values.NULL; + return index >= 0 && index < values.size() ? values.get(index) : Values.NULL; } @Override public Iterable values(final Function mapFunction) { + var iterator = values.iterator(); return () -> new Iterator<>() { - private int cursor = 0; - @Override public boolean hasNext() { - return cursor < values.length; + return iterator.hasNext(); } @Override public T next() { - return mapFunction.apply(values[cursor++]); + return mapFunction.apply(iterator.next()); } - - @Override - public void remove() {} }; } @@ -136,9 +131,20 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.LIST(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.LIST; + } + + @SuppressWarnings("unchecked") + @Override + public Iterable boltValues() { + return (Iterable) (Iterable) values; + } + @Override public String toString() { - return Arrays.toString(values); + return values.toString(); } @Override @@ -151,16 +157,11 @@ public boolean equals(Object o) { } var otherValues = (ListValue) o; - return Arrays.equals(values, otherValues.values); + return values.equals(otherValues.values); } @Override public int hashCode() { - return Arrays.hashCode(values); - } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.LIST); + return values.hashCode(); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java index 90d670a316..8c527ecead 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/LocalDateTimeValue.java @@ -37,8 +37,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.LOCAL_DATE_TIME); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.LOCAL_DATE_TIME; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java index 1b275a24c8..de279e40c2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/LocalTimeValue.java @@ -37,8 +37,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.LOCAL_TIME); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.LOCAL_TIME; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java index c58e77c257..42ab5a3a76 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/MapValue.java @@ -129,6 +129,17 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.MAP(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.MAP; + } + + @SuppressWarnings("unchecked") + @Override + public Map asBoltMap() { + return (Map) (Map) val; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -146,9 +157,4 @@ public boolean equals(Object o) { public int hashCode() { return val.hashCode(); } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.MAP); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java index d859db9ddd..e79e2af833 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/NodeValue.java @@ -36,8 +36,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.NODE); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.NODE; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java index 9ad122f4a0..88aab5f4e5 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/NullValue.java @@ -56,6 +56,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.NULL(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.NULL; + } + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object obj) { @@ -71,9 +76,4 @@ public int hashCode() { public String toString() { return "NULL"; } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.NULL); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java index 36d0f84996..45aaa0bfd9 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/PathValue.java @@ -41,8 +41,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.PATH); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.PATH; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java index feb8ac3e69..ac32787caa 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/PointValue.java @@ -37,8 +37,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.POINT); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.POINT; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java index 84dead0f11..ce0a46f3d1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/RelationshipValue.java @@ -36,8 +36,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.RELATIONSHIP); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.RELATIONSHIP; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java index 49a17810d0..59e94a2b3b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/StringValue.java @@ -77,6 +77,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.STRING(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.STRING; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -93,9 +98,4 @@ public boolean equals(Object o) { public int hashCode() { return val.hashCode(); } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.STRING); - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java index 0cbe2cb944..65632b45e7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/TimeValue.java @@ -37,8 +37,8 @@ public Type type() { } @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.TIME); + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.TIME; } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java b/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java index d04068b325..2ef6d3763d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java +++ b/driver/src/main/java/org/neo4j/driver/internal/value/UnsupportedDateTimeValue.java @@ -56,6 +56,11 @@ public Type type() { return InternalTypeSystem.TYPE_SYSTEM.DATE_TIME(); } + @Override + public org.neo4j.bolt.connection.values.Type boltValueType() { + return org.neo4j.bolt.connection.values.Type.DATE_TIME; + } + @Override public boolean equals(Object obj) { return this == obj; @@ -86,9 +91,4 @@ private DateTimeException instantiateDateTimeException() { } return newException; } - - @Override - public BoltValue asBoltValue() { - return new BoltValue(this, org.neo4j.bolt.connection.values.Type.DATE_TIME); - } } diff --git a/driver/src/test/java/org/neo4j/driver/AuthTokensTest.java b/driver/src/test/java/org/neo4j/driver/AuthTokensTest.java index 497af61fe0..8eca08f1d3 100644 --- a/driver/src/test/java/org/neo4j/driver/AuthTokensTest.java +++ b/driver/src/test/java/org/neo4j/driver/AuthTokensTest.java @@ -16,17 +16,17 @@ */ package org.neo4j.driver; -import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.neo4j.driver.AuthTokens.basic; import static org.neo4j.driver.AuthTokens.custom; -import static org.neo4j.driver.Values.values; +import static org.testng.internal.collections.Ints.asList; import java.util.HashMap; import java.util.Map; +import java.util.function.Function; import org.junit.jupiter.api.Test; import org.neo4j.driver.internal.security.InternalAuthToken; import org.neo4j.driver.internal.value.ListValue; @@ -79,7 +79,7 @@ void customAuthParameters() { var basic = (InternalAuthToken) custom("foo", "bar", "baz", "my_scheme", parameters); Map expectedParameters = new HashMap<>(); - expectedParameters.put("list", new ListValue(values(1, 2, 3))); + expectedParameters.put("list", new ListValue(Values.value(1, 2, 3).asList(Function.identity()))); var map = basic.toMap(); assertThat(map.size(), equalTo(5)); diff --git a/driver/src/test/java/org/neo4j/driver/ObjectMappingTests.java b/driver/src/test/java/org/neo4j/driver/ObjectMappingTests.java index 3c8c025510..ea106fa1d4 100644 --- a/driver/src/test/java/org/neo4j/driver/ObjectMappingTests.java +++ b/driver/src/test/java/org/neo4j/driver/ObjectMappingTests.java @@ -131,12 +131,10 @@ static Stream shouldMapValueArgs() { "map", properties -> Values.value(properties).as(ValueHolder.class))), Arguments.of(Named., ValueHolder>>of("record", properties -> { var keys = new ArrayList(); - var values = new Value[properties.size()]; - var i = 0; + var values = new ArrayList(); for (var entry : properties.entrySet()) { keys.add(entry.getKey()); - values[i] = entry.getValue(); - i++; + values.add(entry.getValue()); } return new InternalRecord(keys, values).as(ValueHolder.class); }))); diff --git a/driver/src/test/java/org/neo4j/driver/ParametersTest.java b/driver/src/test/java/org/neo4j/driver/ParametersTest.java index e0109ee852..ef59a81e52 100644 --- a/driver/src/test/java/org/neo4j/driver/ParametersTest.java +++ b/driver/src/test/java/org/neo4j/driver/ParametersTest.java @@ -32,6 +32,7 @@ import static org.neo4j.driver.internal.util.ValueFactory.filledPathValue; import java.util.Collections; +import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -91,7 +92,7 @@ void shouldNotBePossibleToUseInvalidParametersViaMap(Object obj, String expected @SuppressWarnings("resource") void shouldNotBePossibleToUseInvalidParametersViaRecord(Object obj, String expectedMsg) { assumeTrue(obj instanceof Value); - Record record = new InternalRecord(singletonList("a"), new Value[] {(Value) obj}); + Record record = new InternalRecord(singletonList("a"), List.of((Value) obj)); var session = mockedSession(); var e = assertThrows(ClientException.class, () -> session.run("RETURN {a}", record)); diff --git a/driver/src/test/java/org/neo4j/driver/integration/ScalarTypeIT.java b/driver/src/test/java/org/neo4j/driver/integration/ScalarTypeIT.java index f9364928af..f3217eb960 100644 --- a/driver/src/test/java/org/neo4j/driver/integration/ScalarTypeIT.java +++ b/driver/src/test/java/org/neo4j/driver/integration/ScalarTypeIT.java @@ -18,11 +18,12 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.neo4j.driver.Values.parameters; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -53,9 +54,11 @@ static Stream typesToTest() { Arguments.of("RETURN 'hello' as v", Values.value("hello")), Arguments.of("RETURN true as v", Values.value(true)), Arguments.of("RETURN false as v", Values.value(false)), - Arguments.of("RETURN [1,2,3] as v", new ListValue(Values.value(1), Values.value(2), Values.value(3))), - Arguments.of("RETURN ['hello'] as v", new ListValue(Values.value("hello"))), - Arguments.of("RETURN [] as v", new ListValue()), + Arguments.of( + "RETURN [1,2,3] as v", + new ListValue(List.of(Values.value(1), Values.value(2), Values.value(3)))), + Arguments.of("RETURN ['hello'] as v", new ListValue(List.of(Values.value("hello")))), + Arguments.of("RETURN [] as v", new ListValue(List.of())), Arguments.of("RETURN {k:'hello'} as v", parameters("k", Values.value("hello"))), Arguments.of("RETURN {} as v", new MapValue(Collections.emptyMap()))); } @@ -96,7 +99,7 @@ void shouldEchoVeryLongMap(Value collectionItem) { @MethodSource("collectionItems") void shouldEchoVeryLongList(Value collectionItem) { // Given - var input = IntStream.range(0, 1000).mapToObj(i -> collectionItem).toArray(Value[]::new); + var input = IntStream.range(0, 1000).mapToObj(i -> collectionItem).toList(); var listValue = new ListValue(input); // When & Then @@ -155,14 +158,14 @@ static Stream listToTest() { Arguments.of(Values.value(NullValue.NULL, NullValue.NULL)), Arguments.of(Values.value(Values.values( NullValue.NULL, true, "-17∂ßå®", 1.7976931348623157E+308d, -9223372036854775808d))), - Arguments.of(new ListValue(parameters("a", 1, "b", true, "c", 1.1, "d", "˚C", "e", null)))); + Arguments.of(new ListValue(List.of(parameters("a", 1, "b", true, "c", 1.1, "d", "˚C", "e", null))))); } @ParameterizedTest @MethodSource("listToTest") void shouldEchoList(Value input) { // When & Then - assertTrue(input instanceof ListValue); + assertInstanceOf(ListValue.class, input); verifyCanEncodeAndDecode(input); } @@ -171,7 +174,7 @@ void shouldEchoNestedList() { var input = Values.value(toValueStream(listToTest())); // When & Then - assertTrue(input instanceof ListValue); + assertInstanceOf(ListValue.class, input); verifyCanEncodeAndDecode(input); } @@ -188,7 +191,7 @@ static Stream mapToTest() { @ParameterizedTest @MethodSource("mapToTest") void shouldEchoMap(Value input) { - assertTrue(input instanceof MapValue); + assertInstanceOf(MapValue.class, input); // When & Then verifyCanEncodeAndDecode(input); } @@ -205,7 +208,7 @@ void shouldEchoNestedMap() { private Stream toValueStream(Stream arguments) { return arguments.map(arg -> { var obj = arg.get()[0]; - assertTrue(obj instanceof Value); + assertInstanceOf(Value.class, obj); return (Value) obj; }); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/ExtractTest.java b/driver/src/test/java/org/neo4j/driver/internal/ExtractTest.java index 9a3905c6f3..6c03c284cf 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/ExtractTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/ExtractTest.java @@ -16,7 +16,6 @@ */ package org.neo4j.driver.internal; -import static java.util.Arrays.asList; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; @@ -24,7 +23,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.empty; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -34,6 +32,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; import org.neo4j.driver.Value; @@ -42,33 +41,9 @@ import org.neo4j.driver.internal.util.Iterables; class ExtractTest { - @Test - void extractEmptyArrayShouldNotBeModifiable() { - var list = Extract.list(new Value[] {}); - - assertThat(list, empty()); - assertThrows(UnsupportedOperationException.class, () -> list.add(null)); - } - - @Test - void extractSingletonShouldNotBeModifiable() { - var list = Extract.list(new Value[] {value(42)}); - - assertThat(list, equalTo(singletonList(value(42)))); - assertThrows(UnsupportedOperationException.class, () -> list.add(null)); - } - - @Test - void extractMultipleShouldNotBeModifiable() { - var list = Extract.list(new Value[] {value(42), value(43)}); - - assertThat(list, equalTo(asList(value(42), value(43)))); - assertThrows(UnsupportedOperationException.class, () -> list.add(null)); - } - @Test void testMapOverList() { - var mapped = Extract.list(new Value[] {value(42), value(43)}, Value::asInt); + var mapped = Extract.list(List.of(value(42), value(43)), Value::asInt); assertThat(mapped, equalTo(Arrays.asList(42, 43))); } @@ -124,7 +99,7 @@ void testProperties() { @Test void testFields() { // GIVEN - var record = new InternalRecord(singletonList("k1"), new Value[] {value(42)}); + var record = new InternalRecord(singletonList("k1"), List.of(value(42))); // WHEN var fields = Extract.fields(record, Value::asInt); diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalMapAccessorWithDefaultValueTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalMapAccessorWithDefaultValueTest.java index c17a871370..855ecb7111 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalMapAccessorWithDefaultValueTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalMapAccessorWithDefaultValueTest.java @@ -71,9 +71,9 @@ var record = createRecord(); // List assertThat( - record.get("ListValue", new ListValue()), - equalTo(new ListValue(new IntegerValue(1), new IntegerValue(2)))); - assertThat(record.get(wrongKey, new ListValue()), equalTo(new ListValue())); + record.get("ListValue", new ListValue(List.of())), + equalTo(new ListValue(List.of(new IntegerValue(1), new IntegerValue(2))))); + assertThat(record.get(wrongKey, new ListValue(List.of())), equalTo(new ListValue(List.of()))); // Map Value defaultMapValue = new MapValue(new HashMap<>()); @@ -304,19 +304,18 @@ private Record createRecord() { "NodeValue", "RelValue", "float"); - var values = new Value[] { - NullValue.NULL, - BooleanValue.TRUE, - new StringValue("hello world"), - new IntegerValue(11), - new FloatValue(2.2), - new ListValue(new IntegerValue(1), new IntegerValue(2)), - new MapValue(map), - new PathValue(path), - new NodeValue(node), - new RelationshipValue(rel), - Values.value(0.1F) - }; + var values = List.of( + NullValue.NULL, + BooleanValue.TRUE, + new StringValue("hello world"), + new IntegerValue(11), + new FloatValue(2.2), + new ListValue(List.of(new IntegerValue(1), new IntegerValue(2))), + new MapValue(map), + new PathValue(path), + new NodeValue(node), + new RelationshipValue(rel), + Values.value(0.1F)); return new InternalRecord(keys, values); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalRecordTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalRecordTest.java index 6ac28ea1c4..d181fddded 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalRecordTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalRecordTest.java @@ -124,7 +124,7 @@ var record = createRecord(); void mapExtractionShouldPreserveIterationOrder() { // GIVEN var keys = Arrays.asList("k2", "k1"); - var record = new InternalRecord(keys, new Value[] {value(0), value(1)}); + var record = new InternalRecord(keys, List.of(value(0), value(1))); Function addOne = value -> value.asInt() + 1; // WHEN @@ -148,7 +148,7 @@ var record = createRecord(); void shouldHaveMethodToGetKeys() { // GIVEN var keys = Arrays.asList("k2", "k1"); - var record = new InternalRecord(keys, new Value[] {value(0), value(1)}); + var record = new InternalRecord(keys, List.of(value(0), value(1))); // WHEN var appendedKeys = record.keys(); @@ -161,7 +161,7 @@ var record = new InternalRecord(keys, new Value[] {value(0), value(1)}); void emptyKeysShouldGiveEmptyList() { // GIVEN List keys = Collections.emptyList(); - var record = new InternalRecord(keys, new Value[] {}); + var record = new InternalRecord(keys, List.of()); // WHEN var appendedKeys = record.keys(); @@ -174,32 +174,32 @@ var record = new InternalRecord(keys, new Value[] {}); void shouldHaveMethodToGetValues() { // GIVEN var keys = Arrays.asList("k2", "k1"); - var values = new Value[] {value(0), value(1)}; + var values = List.of(value(0), value(1)); var record = new InternalRecord(keys, values); // WHEN var appendedValues = record.values(); // THEN - assertThat(appendedValues, equalTo(Arrays.asList(values))); + assertThat(appendedValues, equalTo(values)); } @Test void emptyValuesShouldGiveEmptyList() { // GIVEN List keys = Collections.emptyList(); - var values = new Value[] {}; + var values = List.of(); var record = new InternalRecord(keys, values); // WHEN var appendedValues = record.values(); // THEN - assertThat(appendedValues, equalTo(Arrays.asList(values))); + assertThat(appendedValues, equalTo(values)); } private InternalRecord createRecord() { var keys = Arrays.asList("k1", "k2"); - return new InternalRecord(keys, new Value[] {value(0), value(1)}); + return new InternalRecord(keys, List.of(value(0), value(1))); } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java index e24911c95a..a81f9ba53c 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalResultTest.java @@ -350,7 +350,7 @@ private Result createResult(int numberOfRecords) { given(runSummary.keys()).willReturn(asList("k1", "k2")); resultCursor.onRunSummary(runSummary); for (var i = 1; i <= numberOfRecords; i++) { - resultCursor.onRecord(new Value[] {value("v1-" + i), value("v2-" + i)}); + resultCursor.onRecord(List.of(value("v1-" + i), value("v2-" + i))); } resultCursor.onPullSummary(new PullSummary() { @Override diff --git a/driver/src/test/java/org/neo4j/driver/internal/InternalTransactionTest.java b/driver/src/test/java/org/neo4j/driver/internal/InternalTransactionTest.java index 589d4c3cdb..16213eda04 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/InternalTransactionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/InternalTransactionTest.java @@ -55,7 +55,6 @@ import org.neo4j.driver.Query; import org.neo4j.driver.Result; import org.neo4j.driver.Transaction; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnection; import org.neo4j.driver.internal.adaptedbolt.DriverBoltConnectionSource; import org.neo4j.driver.internal.adaptedbolt.DriverResponseHandler; @@ -93,7 +92,7 @@ private static Stream> allSessionRunMethods() { tx -> tx.run("RETURN 1"), tx -> tx.run("RETURN $x", parameters("x", 1)), tx -> tx.run("RETURN $x", singletonMap("x", 1)), - tx -> tx.run("RETURN $x", new InternalRecord(singletonList("x"), new Value[] {new IntegerValue(1)})), + tx -> tx.run("RETURN $x", new InternalRecord(singletonList("x"), List.of(new IntegerValue(1)))), tx -> tx.run(new Query("RETURN $x", parameters("x", 1)))); } 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 48f24084f1..f606539a6a 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/ValuesTest.java @@ -59,6 +59,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Function; import java.util.stream.Stream; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; @@ -80,41 +81,73 @@ class ValuesTest { @Test @SuppressWarnings("RedundantArrayCreation") void shouldConvertPrimitiveArrays() { - assertThat(value(new short[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); - assertThat(value(new int[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); + assertThat( + value(new short[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); + + assertThat( + value(new int[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); - assertThat(value(new long[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); + assertThat( + value(new long[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); - assertThat(value(new float[] {1.1f, 2.2f, 3.3f}), equalTo(new ListValue(values(1.1f, 2.2f, 3.3f)))); + assertThat( + value(new float[] {1.1f, 2.2f, 3.3f}), + equalTo(new ListValue(Values.value(1.1f, 2.2f, 3.3f).asList(Function.identity())))); - assertThat(value(new double[] {1.1, 2.2, 3.3}), equalTo(new ListValue(values(1.1, 2.2, 3.3)))); + assertThat( + value(new double[] {1.1, 2.2, 3.3}), + equalTo(new ListValue(Values.value(1.1, 2.2, 3.3).asList(Function.identity())))); - assertThat(value(new boolean[] {true, false, true}), equalTo(new ListValue(values(true, false, true)))); + assertThat( + value(new boolean[] {true, false, true}), + equalTo(new ListValue(Values.value(true, false, true).asList(Function.identity())))); - assertThat(value(new char[] {'a', 'b', 'c'}), equalTo(new ListValue(values('a', 'b', 'c')))); + assertThat( + value(new char[] {'a', 'b', 'c'}), + equalTo(new ListValue(Values.value('a', 'b', 'c').asList(Function.identity())))); - assertThat(value(new String[] {"a", "b", "c"}), equalTo(new ListValue(values("a", "b", "c")))); + assertThat( + value(new String[] {"a", "b", "c"}), + equalTo(new ListValue(Values.value("a", "b", "c").asList(Function.identity())))); } @Test void shouldConvertPrimitiveArraysFromObject() { - assertThat(value((Object) new short[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); + assertThat( + value((Object) new short[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); - assertThat(value((Object) new int[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); + assertThat( + value((Object) new int[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); - assertThat(value((Object) new long[] {1, 2, 3}), equalTo(new ListValue(values(1, 2, 3)))); + assertThat( + value((Object) new long[] {1, 2, 3}), + equalTo(new ListValue(Values.value(1, 2, 3).asList(Function.identity())))); - assertThat(value((Object) new float[] {1.1f, 2.2f, 3.3f}), equalTo(new ListValue(values(1.1f, 2.2f, 3.3f)))); + assertThat( + value((Object) new float[] {1.1f, 2.2f, 3.3f}), + equalTo(new ListValue(Values.value(1.1f, 2.2f, 3.3f).asList(Function.identity())))); - assertThat(value((Object) new double[] {1.1, 2.2, 3.3}), equalTo(new ListValue(values(1.1, 2.2, 3.3)))); + assertThat( + value((Object) new double[] {1.1, 2.2, 3.3}), + equalTo(new ListValue(Values.value(1.1, 2.2, 3.3).asList(Function.identity())))); assertThat( - value((Object) new boolean[] {true, false, true}), equalTo(new ListValue(values(true, false, true)))); + value((Object) new boolean[] {true, false, true}), + equalTo(new ListValue(Values.value(true, false, true).asList(Function.identity())))); - assertThat(value((Object) new char[] {'a', 'b', 'c'}), equalTo(new ListValue(values('a', 'b', 'c')))); + assertThat( + value((Object) new char[] {'a', 'b', 'c'}), + equalTo(new ListValue(Values.value('a', 'b', 'c').asList(Function.identity())))); - assertThat(value((Object) new String[] {"a", "b", "c"}), equalTo(new ListValue(values("a", "b", "c")))); + assertThat( + value((Object) new String[] {"a", "b", "c"}), + equalTo(new ListValue(Values.value("a", "b", "c").asList(Function.identity())))); } @Test @@ -153,9 +186,9 @@ void equalityRules() { void shouldMapDriverComplexTypesToListOfJavaPrimitiveTypes() { // Given Map map = new HashMap<>(); - map.put("Cat", new ListValue(values("meow", "miaow"))); - map.put("Dog", new ListValue(values("wow"))); - map.put("Wrong", new ListValue(values(-1))); + map.put("Cat", new ListValue(Values.value("meow", "miaow").asList(Function.identity()))); + map.put("Dog", new ListValue(List.of(Values.value("wow")))); + map.put("Wrong", new ListValue(List.of(Values.value(-1)))); var mapValue = new MapValue(map); // When @@ -184,7 +217,7 @@ void shouldMapDriverMapsToJavaMaps() { var values = new MapValue(map); // When - var result = values.asMap(Values.ofToString()); + var result = values.asMap(ofToString()); // Then assertThat(result.size(), equalTo(2)); diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncSessionTest.java index 7fe27e8e30..4f638e5615 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncSessionTest.java @@ -76,7 +76,6 @@ import org.neo4j.driver.Bookmark; import org.neo4j.driver.Query; import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; import org.neo4j.driver.async.AsyncSession; import org.neo4j.driver.async.AsyncTransaction; import org.neo4j.driver.async.AsyncTransactionCallback; @@ -120,7 +119,7 @@ private static Stream>> all session -> session.runAsync("RETURN $x", parameters("x", 1)), session -> session.runAsync("RETURN $x", singletonMap("x", 1)), session -> session.runAsync( - "RETURN $x", new InternalRecord(singletonList("x"), new Value[] {new IntegerValue(1)})), + "RETURN $x", new InternalRecord(singletonList("x"), List.of(new IntegerValue(1)))), session -> session.runAsync(new Query("RETURN $x", parameters("x", 1))), session -> session.runAsync(new Query("RETURN $x", parameters("x", 1)), empty()), session -> session.runAsync("RETURN $x", singletonMap("x", 1), empty()), diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java index 804dd43b2f..84545c93d6 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/InternalAsyncTransactionTest.java @@ -60,7 +60,6 @@ import org.neo4j.bolt.connection.summary.RollbackSummary; import org.neo4j.bolt.connection.summary.RunSummary; import org.neo4j.driver.Query; -import org.neo4j.driver.Value; import org.neo4j.driver.async.AsyncTransaction; import org.neo4j.driver.async.ResultCursor; import org.neo4j.driver.exceptions.ServiceUnavailableException; @@ -95,8 +94,7 @@ private static Stream>> tx -> tx.runAsync("RETURN 1"), tx -> tx.runAsync("RETURN $x", parameters("x", 1)), tx -> tx.runAsync("RETURN $x", singletonMap("x", 1)), - tx -> tx.runAsync( - "RETURN $x", new InternalRecord(singletonList("x"), new Value[] {new IntegerValue(1)})), + tx -> tx.runAsync("RETURN $x", new InternalRecord(singletonList("x"), List.of(new IntegerValue(1)))), tx -> tx.runAsync(new Query("RETURN $x", parameters("x", 1)))); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java b/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java index a2d4b8b6e6..54dc5af9d1 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/cursor/ResultCursorImplTest.java @@ -29,6 +29,7 @@ import static org.mockito.MockitoAnnotations.openMocks; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; @@ -84,7 +85,7 @@ void shouldNextAsync() { given(connection.writeAndFlush(any(), any(Message.class))) .willAnswer((Answer>) invocation -> { var handler = (DriverResponseHandler) invocation.getArgument(0); - handler.onRecord(new Value[0]); + handler.onRecord(List.of()); return CompletableFuture.completedStage(null); }); @@ -121,7 +122,7 @@ void shouldFailNextAsyncOnFlushError() { @Test void shouldSingleAsync() { given(connection.serverAddress()).willReturn(BoltServerAddress.LOCAL_DEFAULT); - cursor.onRecord(new Value[0]); + cursor.onRecord(List.of()); cursor.onPullSummary(mock(PullSummary.class)); var record = cursor.singleAsync().toCompletableFuture().join(); @@ -136,7 +137,7 @@ void shouldFailSingleAsync() { given(connection.writeAndFlush(any(), any(Message.class))) .willAnswer((Answer>) invocation -> { var handler = (DriverResponseHandler) invocation.getArgument(0); - handler.onRecord(new Value[0]); + handler.onRecord(List.of()); var pullSummary = mock(PullSummary.class); given(pullSummary.hasMore()).willReturn(true); handler.onPullSummary(pullSummary); @@ -190,7 +191,7 @@ void shouldFetchMore() { .willAnswer((Answer>) invocation -> { var handler = (DriverResponseHandler) invocation.getArgument(0); for (var i = 0; i < fetchSize; i++) { - handler.onRecord(new Value[0]); + handler.onRecord(List.of()); } var pullSummary = mock(PullSummary.class); given(pullSummary.hasMore()).willReturn(true); @@ -213,7 +214,7 @@ void shouldListAsync() { given(connection.writeAndFlush(any(), any(Message.class))) .willAnswer((Answer>) invocation -> { var handler = (DriverResponseHandler) invocation.getArgument(0); - handler.onRecord(new Value[0]); + handler.onRecord(List.of()); var pullSummary = mock(PullSummary.class); handler.onPullSummary(pullSummary); return CompletableFuture.completedStage(null); diff --git a/driver/src/test/java/org/neo4j/driver/internal/reactive/InternalReactiveSessionTest.java b/driver/src/test/java/org/neo4j/driver/internal/reactive/InternalReactiveSessionTest.java index e0269a9601..cf97577931 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/reactive/InternalReactiveSessionTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/reactive/InternalReactiveSessionTest.java @@ -56,7 +56,6 @@ import org.neo4j.driver.Bookmark; import org.neo4j.driver.Query; import org.neo4j.driver.TransactionConfig; -import org.neo4j.driver.Value; import org.neo4j.driver.internal.InternalRecord; import org.neo4j.driver.internal.async.NetworkSession; import org.neo4j.driver.internal.async.UnmanagedTransaction; @@ -83,7 +82,7 @@ private static Stream>> allS rxSession -> rxSession.run("RETURN $x", parameters("x", 1)), rxSession -> rxSession.run("RETURN $x", singletonMap("x", 1)), rxSession -> rxSession.run( - "RETURN $x", new InternalRecord(singletonList("x"), new Value[] {new IntegerValue(1)})), + "RETURN $x", new InternalRecord(singletonList("x"), List.of(new IntegerValue(1)))), rxSession -> rxSession.run(new Query("RETURN $x", parameters("x", 1))), rxSession -> rxSession.run(new Query("RETURN $x", parameters("x", 1)), empty()), rxSession -> rxSession.run("RETURN $x", singletonMap("x", 1), empty()), diff --git a/driver/src/test/java/org/neo4j/driver/internal/summary/InternalProfiledPlanTest.java b/driver/src/test/java/org/neo4j/driver/internal/summary/InternalProfiledPlanTest.java index 940fd170fb..3392115588 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/summary/InternalProfiledPlanTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/summary/InternalProfiledPlanTest.java @@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; import org.neo4j.driver.Value; @@ -52,7 +53,7 @@ void shouldHandlePlanWithNoChildren() { void shouldHandlePlanWithChildren() { // GIVEN var planMap = createPlanMap(); - planMap.put("children", new ListValue(new MapValue(createPlanMap()), new MapValue(createPlanMap()))); + planMap.put("children", new ListValue(List.of(new MapValue(createPlanMap()), new MapValue(createPlanMap())))); Value value = new MapValue(planMap); // WHEN @@ -73,7 +74,7 @@ private Map createPlanMap() { map.put("pageCacheMisses", new IntegerValue(3456)); map.put("pageCacheHitRatio", new FloatValue(0.123)); map.put("time", new IntegerValue(999)); - map.put("identifiers", new ListValue(new StringValue("n1"), new StringValue("n2"))); + map.put("identifiers", new ListValue(List.of(new StringValue("n1"), new StringValue("n2")))); Map args = new HashMap<>(); args.put("version", new StringValue("CYPHER 1337")); map.put("args", new MapValue(args)); diff --git a/driver/src/test/java/org/neo4j/driver/internal/value/ListValueTest.java b/driver/src/test/java/org/neo4j/driver/internal/value/ListValueTest.java index 2b528bfd45..7db4d4f648 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/value/ListValueTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/value/ListValueTest.java @@ -158,6 +158,6 @@ void shouldMapMatrixValuesToArrays() { } private ListValue listValue(Value... values) { - return new ListValue(values); + return new ListValue(Arrays.asList(values)); } } diff --git a/pom.xml b/pom.xml index 4909bfb77b..69b8235550 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ true - 4.1.0 + 5.0.0 1.0.4 diff --git a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/StartTest.java b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/StartTest.java index eb1a60589f..bcfe007691 100644 --- a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/StartTest.java +++ b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/requests/StartTest.java @@ -92,9 +92,6 @@ public class StartTest implements TestkitRequest { COMMON_SKIP_PATTERN_TO_REASON.put( "^stub\\.summary\\.test_summary\\.TestSummaryBasicInfoDiscard\\.test_times$", "Driver sets summary's resultAvailableAfter to -1 on discard"); - skipMessage = "Driver expects serverAgent string starting with Neo4j only"; - COMMON_SKIP_PATTERN_TO_REASON.put( - "^stub\\.versions\\.test_versions\\.TestProtocolVersions\\.test_server_agent$", skipMessage); SYNC_SKIP_PATTERN_TO_REASON.putAll(COMMON_SKIP_PATTERN_TO_REASON); skipMessage = diff --git a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitNodeValueSerializer.java b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitNodeValueSerializer.java index 7ea8c87a8e..3967a9a9c6 100644 --- a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitNodeValueSerializer.java +++ b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitNodeValueSerializer.java @@ -52,7 +52,7 @@ public void serialize(NodeValue nodeValue, JsonGenerator gen, SerializerProvider var labels = StreamSupport.stream(node.labels().spliterator(), false) .map(StringValue::new) - .toArray(StringValue[]::new); + .toList(); gen.writeObjectField("labels", new ListValue(labels)); gen.writeObjectField("props", new MapValue(node.asMap(Function.identity()))); diff --git a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitPathValueSerializer.java b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitPathValueSerializer.java index 16f387f1ec..6d5934a8de 100644 --- a/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitPathValueSerializer.java +++ b/testkit-backend/src/main/java/neo4j/org/testkit/backend/messages/responses/serializer/TestkitPathValueSerializer.java @@ -43,11 +43,11 @@ public void serialize(PathValue pathValue, JsonGenerator gen, SerializerProvider var path = pathValue.asPath(); var nodes = StreamSupport.stream(path.nodes().spliterator(), false) .map(NodeValue::new) - .toArray(NodeValue[]::new); + .toList(); gen.writeObjectField("nodes", new ListValue(nodes)); var relationships = StreamSupport.stream(path.relationships().spliterator(), false) .map(RelationshipValue::new) - .toArray(RelationshipValue[]::new); + .toList(); gen.writeObjectField("relationships", new ListValue(relationships)); }); }