From 10659f52694c18fdb59f0cc78c1933e162aeb0f3 Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Sat, 15 Mar 2025 13:31:34 +0000 Subject: [PATCH 1/3] perf: Optimise Bolt values unpacking This update optimises Bolt values unpacking by implementing specific type mappings in `ValueFactory`. --- .gitignore | 1 + .../internal/value/BoltValueFactory.java | 98 +++++++++++++++++++ pom.xml | 2 +- 3 files changed, 100 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c18924a600..e8f5e2b969 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ venv testkit-backend/bin/ testkit/CAs/ testkit/CustomCAs/ +bolt-connection 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 3fcb7084b6..dba115261b 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 @@ -17,6 +17,14 @@ package org.neo4j.driver.internal.value; import java.time.DateTimeException; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.ZonedDateTime; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -47,6 +55,96 @@ public Value value(Object value) { return ((InternalValue) Values.value(value)).asBoltValue(); } + @Override + public Value value(boolean value) { + return ((InternalValue) Values.value(value)).asBoltValue(); + } + + @Override + public Value value(long value) { + return ((InternalValue) Values.value(value)).asBoltValue(); + } + + @Override + public Value value(double value) { + return ((InternalValue) Values.value(value)).asBoltValue(); + } + + @Override + public Value value(byte[] values) { + return ((InternalValue) Values.value(values)).asBoltValue(); + } + + @Override + public Value value(String value) { + return ((InternalValue) Values.value(value)).asBoltValue(); + } + + @Override + public Value value(Map stringToValue) { + return ((InternalValue) Values.value(stringToValue)).asBoltValue(); + } + + @Override + public Value value(Value[] values) { + return ((InternalValue) Values.value(values)).asBoltValue(); + } + + @Override + public Value value(Node node) { + return ((InternalValue) Values.value(node)).asBoltValue(); + } + + @Override + public Value value(Relationship relationship) { + return ((InternalValue) Values.value(relationship)).asBoltValue(); + } + + @Override + public Value value(Path path) { + return ((InternalValue) Values.value(path)).asBoltValue(); + } + + @Override + public Value value(LocalDate localDate) { + return ((InternalValue) Values.value(localDate)).asBoltValue(); + } + + @Override + public Value value(OffsetTime offsetTime) { + return ((InternalValue) Values.value(offsetTime)).asBoltValue(); + } + + @Override + public Value value(LocalTime localTime) { + return ((InternalValue) Values.value(localTime)).asBoltValue(); + } + + @Override + public Value value(LocalDateTime localDateTime) { + return ((InternalValue) Values.value(localDateTime)).asBoltValue(); + } + + @Override + public Value value(OffsetDateTime offsetDateTime) { + return ((InternalValue) Values.value(offsetDateTime)).asBoltValue(); + } + + @Override + public Value value(ZonedDateTime zonedDateTime) { + return ((InternalValue) Values.value(zonedDateTime)).asBoltValue(); + } + + @Override + public Value value(Period period) { + return ((InternalValue) Values.value(period)).asBoltValue(); + } + + @Override + public Value value(Duration duration) { + return ((InternalValue) Values.value(duration)).asBoltValue(); + } + @Override public Node node(long id, String elementId, Collection labels, Map properties) { return new InternalNode(id, elementId, labels, toDriverMap(properties)); diff --git a/pom.xml b/pom.xml index 0ab282a5cd..0a516d4fbd 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,7 @@ true - 1.0.0 + 1.1.0 1.0.4 From 37193681a2d6f204a3bdfc2043705e276109cabd Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Tue, 18 Mar 2025 08:57:07 +0000 Subject: [PATCH 2/3] Make methods null safe --- .../internal/value/BoltValueFactory.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) 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 dba115261b..069d35bd2c 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 @@ -77,71 +77,113 @@ public Value value(byte[] values) { @Override public Value value(String value) { + if (value == null) { + return value((Object) null); + } return ((InternalValue) Values.value(value)).asBoltValue(); } @Override public Value value(Map stringToValue) { + if (stringToValue == null) { + return value((Object) null); + } return ((InternalValue) Values.value(stringToValue)).asBoltValue(); } @Override public Value value(Value[] values) { + if (values == null) { + return value((Object) null); + } return ((InternalValue) Values.value(values)).asBoltValue(); } @Override public Value value(Node node) { + if (node == null) { + return value((Object) null); + } return ((InternalValue) Values.value(node)).asBoltValue(); } @Override public Value value(Relationship relationship) { + if (relationship == null) { + return value((Object) null); + } return ((InternalValue) Values.value(relationship)).asBoltValue(); } @Override public Value value(Path path) { + if (path == null) { + return value((Object) null); + } return ((InternalValue) Values.value(path)).asBoltValue(); } @Override public Value value(LocalDate localDate) { + if (localDate == null) { + return value((Object) null); + } return ((InternalValue) Values.value(localDate)).asBoltValue(); } @Override public Value value(OffsetTime offsetTime) { + if (offsetTime == null) { + return value((Object) null); + } return ((InternalValue) Values.value(offsetTime)).asBoltValue(); } @Override public Value value(LocalTime localTime) { + if (localTime == null) { + return value((Object) null); + } return ((InternalValue) Values.value(localTime)).asBoltValue(); } @Override public Value value(LocalDateTime localDateTime) { + if (localDateTime == null) { + return value((Object) null); + } return ((InternalValue) Values.value(localDateTime)).asBoltValue(); } @Override public Value value(OffsetDateTime offsetDateTime) { + if (offsetDateTime == null) { + return value((Object) null); + } return ((InternalValue) Values.value(offsetDateTime)).asBoltValue(); } @Override public Value value(ZonedDateTime zonedDateTime) { + if (zonedDateTime == null) { + return value((Object) null); + } return ((InternalValue) Values.value(zonedDateTime)).asBoltValue(); } @Override public Value value(Period period) { + if (period == null) { + return value((Object) null); + } return ((InternalValue) Values.value(period)).asBoltValue(); } @Override public Value value(Duration duration) { + if (duration == null) { + return value((Object) null); + } return ((InternalValue) Values.value(duration)).asBoltValue(); } From 44d150c1f0119e48e00477ba21bfe068acfeddae Mon Sep 17 00:00:00 2001 From: Dmitriy Tverdiakov Date: Tue, 18 Mar 2025 09:04:55 +0000 Subject: [PATCH 3/3] Make method null safe --- .../java/org/neo4j/driver/internal/value/BoltValueFactory.java | 3 +++ 1 file changed, 3 insertions(+) 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 069d35bd2c..c324cf4513 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 @@ -72,6 +72,9 @@ public Value value(double value) { @Override public Value value(byte[] values) { + if (values == null) { + return value((Object) null); + } return ((InternalValue) Values.value(values)).asBoltValue(); }