From 3bddf0dc438c763775628e0dbef8a4bf3f5f3dc0 Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Thu, 10 Oct 2024 12:50:01 +0300 Subject: [PATCH 1/4] add support for new Vector type --- .../com/falkordb/impl/resultset/ResultSetImpl.java | 12 ++++++++++++ .../impl/resultset/ResultSetScalarTypes.java | 3 ++- src/test/java/com/falkordb/GraphAPITest.java | 8 ++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java b/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java index 6c77cf8..aafb886 100644 --- a/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java +++ b/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java @@ -246,6 +246,8 @@ private Object deserializeScalar(List rawScalarData) { return deserializeMap(obj); case VALUE_POINT: return deserializePoint(obj); + case VALUE_VECTORF32: + return deserializeVector(obj); case VALUE_UNKNOWN: default: return obj; @@ -256,6 +258,16 @@ private Object deserializePoint(Object rawScalarData) { return new Point(BuilderFactory.DOUBLE_LIST.build(rawScalarData)); } + private List deserializeVector(Object rawScalarData) { + List array = (List) rawScalarData; + + List res = new ArrayList<>(array.size()); + for (byte[] val : array) { + res.add(Float.parseFloat(SafeEncoder.encode(val))); + } + return res; + } + @SuppressWarnings("unchecked") private Map deserializeMap(Object rawScalarData) { List keyTypeValueEntries = (List) rawScalarData; diff --git a/src/main/java/com/falkordb/impl/resultset/ResultSetScalarTypes.java b/src/main/java/com/falkordb/impl/resultset/ResultSetScalarTypes.java index 414e2ac..e62bb75 100644 --- a/src/main/java/com/falkordb/impl/resultset/ResultSetScalarTypes.java +++ b/src/main/java/com/falkordb/impl/resultset/ResultSetScalarTypes.java @@ -14,7 +14,8 @@ enum ResultSetScalarTypes { VALUE_NODE, VALUE_PATH, VALUE_MAP, - VALUE_POINT; + VALUE_POINT, + VALUE_VECTORF32; private static final ResultSetScalarTypes[] values = values(); diff --git a/src/test/java/com/falkordb/GraphAPITest.java b/src/test/java/com/falkordb/GraphAPITest.java index c8cc08a..157e032 100644 --- a/src/test/java/com/falkordb/GraphAPITest.java +++ b/src/test/java/com/falkordb/GraphAPITest.java @@ -798,6 +798,14 @@ public void test64bitnumber() { Assert.assertEquals(Long.valueOf(value), r.getValue(0)); } + @Test + public void testVecf32() { + ResultSet resultSet = client.query("RETURN vecf32([2.1, -0.82, 1.3, 4.5]) AS vector"); + Assert.assertEquals(1, resultSet.size()); + Record r = resultSet.iterator().next(); + Assert.assertEquals(Arrays.asList(2.1f, -0.82f, 1.3f, 4.5f), r.getValue(0)); + } + @Test public void testCachedExecution() { client.query("CREATE (:N {val:1}), (:N {val:2})"); From e991a189e69a36d810e3f5dbc8c1e388b258ca32 Mon Sep 17 00:00:00 2001 From: Barak Bar Orion Date: Thu, 10 Oct 2024 13:08:44 +0300 Subject: [PATCH 2/4] Add sdk init file Fix testVecf32 --- .sdkmanrc | 3 +++ src/test/java/com/falkordb/GraphAPITest.java | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .sdkmanrc diff --git a/.sdkmanrc b/.sdkmanrc new file mode 100644 index 0000000..ce5e133 --- /dev/null +++ b/.sdkmanrc @@ -0,0 +1,3 @@ +# Enable auto-env through the sdkman_auto_env config +# Add key=value pairs of SDKs to use below +java=17.0.12-graal diff --git a/src/test/java/com/falkordb/GraphAPITest.java b/src/test/java/com/falkordb/GraphAPITest.java index 157e032..40bc34a 100644 --- a/src/test/java/com/falkordb/GraphAPITest.java +++ b/src/test/java/com/falkordb/GraphAPITest.java @@ -803,7 +803,12 @@ public void testVecf32() { ResultSet resultSet = client.query("RETURN vecf32([2.1, -0.82, 1.3, 4.5]) AS vector"); Assert.assertEquals(1, resultSet.size()); Record r = resultSet.iterator().next(); - Assert.assertEquals(Arrays.asList(2.1f, -0.82f, 1.3f, 4.5f), r.getValue(0)); + List vector = r.getValue(0); + Assert.assertEquals(4, vector.size()); + Assert.assertEquals(2.1f, vector.get(0), 0.01); + Assert.assertEquals(-0.82f, vector.get(1), 0.01); + Assert.assertEquals(1.3f, vector.get(2), 0.01); + Assert.assertEquals(4.5f, vector.get(3), 0.01); } @Test From 4c8caabfb1e21547c27002cb393880cc65a40e28 Mon Sep 17 00:00:00 2001 From: Barak Bar Orion Date: Thu, 10 Oct 2024 13:26:32 +0300 Subject: [PATCH 3/4] make testVecf32 comply with latest changes in vector serialization --- src/test/java/com/falkordb/GraphAPITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/falkordb/GraphAPITest.java b/src/test/java/com/falkordb/GraphAPITest.java index 40bc34a..4bdd08c 100644 --- a/src/test/java/com/falkordb/GraphAPITest.java +++ b/src/test/java/com/falkordb/GraphAPITest.java @@ -803,7 +803,7 @@ public void testVecf32() { ResultSet resultSet = client.query("RETURN vecf32([2.1, -0.82, 1.3, 4.5]) AS vector"); Assert.assertEquals(1, resultSet.size()); Record r = resultSet.iterator().next(); - List vector = r.getValue(0); + List vector = r.getValue(0); Assert.assertEquals(4, vector.size()); Assert.assertEquals(2.1f, vector.get(0), 0.01); Assert.assertEquals(-0.82f, vector.get(1), 0.01); From eb7c77b3c9b37b884637c829d1a44f4b9958367a Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Thu, 10 Oct 2024 13:58:32 +0300 Subject: [PATCH 4/4] fix CI use edge docker --- .github/workflows/maven.yml | 2 +- .../impl/resultset/ResultSetImpl.java | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index bff3444..ba354e8 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -28,7 +28,7 @@ jobs: # Label used to access the service container falkordb: # Docker Hub image - image: falkordb/falkordb:latest + image: falkordb/falkordb:edge # Map port 6379 on the Docker host to port 6379 on the FalkorDB container ports: - 6379:6379 diff --git a/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java b/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java index aafb886..a84de64 100644 --- a/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java +++ b/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java @@ -13,6 +13,7 @@ import redis.clients.jedis.exceptions.JedisDataException; import java.util.*; +import java.util.stream.Collectors; public class ResultSetImpl implements ResultSet { @@ -25,7 +26,7 @@ public class ResultSetImpl implements ResultSet { /** * @param rawResponse the raw representation of response is at most 3 lists of * objects. The last list is the statistics list. - * @param graph the graph connection + * @param graph the graph connection * @param cache the graph local cache */ @SuppressWarnings("unchecked") @@ -157,7 +158,7 @@ private Node deserializeNode(List rawNodeData) { /** * @param graphEntity graph entity - * @param id entity id to be set to the graph entity + * @param id entity id to be set to the graph entity */ private void deserializeGraphEntityId(GraphEntity graphEntity, long id) { graphEntity.setId(id); @@ -260,12 +261,16 @@ private Object deserializePoint(Object rawScalarData) { private List deserializeVector(Object rawScalarData) { List array = (List) rawScalarData; - - List res = new ArrayList<>(array.size()); - for (byte[] val : array) { - res.add(Float.parseFloat(SafeEncoder.encode(val))); - } - return res; + return array.stream() + .map(val -> { + try { + return Float.parseFloat(SafeEncoder.encode(val)); + } catch (NumberFormatException e) { + // Handle the exception appropriately + throw new GraphException("Invalid float value in vector data", e); + } + }) + .collect(Collectors.toList()); } @SuppressWarnings("unchecked")