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/.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/main/java/com/falkordb/impl/resultset/ResultSetImpl.java b/src/main/java/com/falkordb/impl/resultset/ResultSetImpl.java index 6c77cf8..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); @@ -246,6 +247,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 +259,20 @@ private Object deserializePoint(Object rawScalarData) { return new Point(BuilderFactory.DOUBLE_LIST.build(rawScalarData)); } + private List deserializeVector(Object rawScalarData) { + List array = (List) rawScalarData; + 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") 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..4bdd08c 100644 --- a/src/test/java/com/falkordb/GraphAPITest.java +++ b/src/test/java/com/falkordb/GraphAPITest.java @@ -798,6 +798,19 @@ 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(); + 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 public void testCachedExecution() { client.query("CREATE (:N {val:1}), (:N {val:2})");