From 4281a1cfb84aba0854e0c5c455945b568a0c6141 Mon Sep 17 00:00:00 2001 From: lvca Date: Fri, 14 Jul 2023 10:53:25 -0400 Subject: [PATCH] fix: fixed serialization of resultset nested in collection --- .../distance/DistanceFunctionFactory.java | 4 +- .../arcadedb/serializer/BinaryComparator.java | 2 +- .../arcadedb/serializer/JsonSerializer.java | 145 +++++++++--------- .../http/handler/AbstractQueryHandler.java | 8 +- 4 files changed, 79 insertions(+), 80 deletions(-) diff --git a/engine/src/main/java/com/arcadedb/index/vector/distance/DistanceFunctionFactory.java b/engine/src/main/java/com/arcadedb/index/vector/distance/DistanceFunctionFactory.java index 397878511..7154ea081 100644 --- a/engine/src/main/java/com/arcadedb/index/vector/distance/DistanceFunctionFactory.java +++ b/engine/src/main/java/com/arcadedb/index/vector/distance/DistanceFunctionFactory.java @@ -37,7 +37,7 @@ public class DistanceFunctionFactory { static { registerImplementation("FloatCosine", DistanceFunctions.FLOAT_COSINE_DISTANCE); - registerImplementation("FloatInnerProduct", DistanceFunctions.FLOAT_INNER_PRODUCT); + registerImplementation("FloatInnerProduct", DistanceFunctions.FLOAT_INNER_PRODUCT); // EXPECTED NORMALIZATION OF VECTORS registerImplementation("FloatEuclidean", DistanceFunctions.FLOAT_EUCLIDEAN_DISTANCE); registerImplementation("FloatCanberra", DistanceFunctions.FLOAT_CANBERRA_DISTANCE); registerImplementation("FloatBrayCurtis", DistanceFunctions.FLOAT_BRAY_CURTIS_DISTANCE); @@ -45,7 +45,7 @@ public class DistanceFunctionFactory { registerImplementation("FloatManhattan", DistanceFunctions.FLOAT_MANHATTAN_DISTANCE); registerImplementation("FloatChebyshev", new ChebyshevDistance.FloatChebyshevDistance()); registerImplementation("DoubleCosine", DistanceFunctions.DOUBLE_COSINE_DISTANCE); - registerImplementation("DoubleInnerProduct", DistanceFunctions.DOUBLE_INNER_PRODUCT); + registerImplementation("DoubleInnerProduct", DistanceFunctions.DOUBLE_INNER_PRODUCT); // EXPECTED NORMALIZATION OF VECTORS registerImplementation("DoubleEuclidean", DistanceFunctions.DOUBLE_EUCLIDEAN_DISTANCE); registerImplementation("DoubleCanberra", DistanceFunctions.DOUBLE_CANBERRA_DISTANCE); registerImplementation("DoubleBrayCurtis", DistanceFunctions.DOUBLE_BRAY_CURTIS_DISTANCE); diff --git a/engine/src/main/java/com/arcadedb/serializer/BinaryComparator.java b/engine/src/main/java/com/arcadedb/serializer/BinaryComparator.java index 9a917ccb8..373aa9f74 100644 --- a/engine/src/main/java/com/arcadedb/serializer/BinaryComparator.java +++ b/engine/src/main/java/com/arcadedb/serializer/BinaryComparator.java @@ -322,7 +322,7 @@ public int compare(final Object value1, final byte type1, final Object value2, f switch (type2) { case BinaryTypes.TYPE_COMPRESSED_RID: case BinaryTypes.TYPE_RID: - return ((Identifiable) value1).getIdentity().compareTo((Identifiable) value2); + return ((Identifiable) value1).getIdentity().compareTo(value2); } } diff --git a/engine/src/main/java/com/arcadedb/serializer/JsonSerializer.java b/engine/src/main/java/com/arcadedb/serializer/JsonSerializer.java index 6eca3a3a6..d32d14ba1 100644 --- a/engine/src/main/java/com/arcadedb/serializer/JsonSerializer.java +++ b/engine/src/main/java/com/arcadedb/serializer/JsonSerializer.java @@ -53,33 +53,9 @@ public JSONObject serializeDocument(final Document document) { else if (value instanceof Document) value = serializeDocument((Document) value); else if (value instanceof Collection) { - if (useCollectionSize) { - value = ((Collection) value).size(); - } else { - final List list = new ArrayList<>(); - for (Object o : (Collection) value) { - if (o instanceof Document) - o = serializeDocument((Document) o); - list.add(o); - } - value = list; - } - } else if (value instanceof Map) { - if (useCollectionSize) { - value = ((Map) value).size(); - } else { - final JSONObject map = new JSONObject().setDateFormat(database.getSchema().getDateTimeFormat()); - for (final Map.Entry entry : ((Map) value).entrySet()) { - Object o = entry.getValue(); - if (entry.getValue() instanceof Document) - o = serializeDocument((Document) o); - else if (entry.getValue() instanceof Result) - o = serializeResult((Result) o, database); - map.put(entry.getKey().toString(), o); - } - value = map; - } - } + serializeCollection(database, (Collection) value); + } else if (value instanceof Map) + value = serializeMap(database, (Map) value); value = convertNonNumbers(value); @@ -91,7 +67,7 @@ else if (entry.getValue() instanceof Result) return object; } - public JSONObject serializeResult(final Result result, final Database database) { + public JSONObject serializeResult(final Database database, final Result result) { final JSONObject object = new JSONObject().setDateFormat(database.getSchema().getDateTimeFormat()); if (result.isElement()) { @@ -111,51 +87,11 @@ public JSONObject serializeResult(final Result result, final Database database) else if (value instanceof Document) value = serializeDocument((Document) value); else if (value instanceof Result) - value = serializeResult((Result) value, database); - else if (value instanceof Collection) { - if (!((Collection) value).isEmpty()) { - if (useCollectionSizeForEdges && ((Collection) value).iterator().next() instanceof Edge) - value = ((Collection) value).size(); - else if (useCollectionSize) { - value = ((Collection) value).size(); - } else { - final JSONArray list = new JSONArray(); - for (Object o : (Collection) value) { - if (o instanceof Document) - o = serializeDocument((Document) o); - else if (o instanceof Result) - o = serializeResult((Result) o, database); - else if (o instanceof ResultSet) { - final ResultSet resultSet = (ResultSet) o; - final JSONArray array = new JSONArray(); - while (resultSet.hasNext()) { - final Result row = resultSet.next(); - array.put(serializeResult(row, database)); - } - o = array; - } - - list.put(o); - } - value = list; - } - } - } else if (value instanceof Map) { - if (useCollectionSize) { - value = ((Map) value).size(); - } else { - final JSONObject map = new JSONObject().setDateFormat(database.getSchema().getDateTimeFormat()); - for (final Map.Entry entry : ((Map) value).entrySet()) { - Object o = entry.getValue(); - if (entry.getValue() instanceof Document) - o = serializeDocument((Document) o); - else if (entry.getValue() instanceof Result) - o = serializeResult((Result) o, database); - map.put(entry.getKey().toString(), o); - } - value = map; - } - } + value = serializeResult(database, (Result) value); + else if (value instanceof Collection) + value = serializeCollection(database, (Collection) value); + else if (value instanceof Map) + value = serializeMap(database, (Map) value); value = convertNonNumbers(value); @@ -165,6 +101,69 @@ else if (entry.getValue() instanceof Result) return object; } + private Object serializeCollection(final Database database, final Collection value) { + Object result = value; + if (!value.isEmpty()) { + if (useCollectionSizeForEdges && value.iterator().next() instanceof Edge) + result = value.size(); + else if (useCollectionSize) { + result = value.size(); + } else { + final JSONArray list = new JSONArray(); + for (Object o : value) { + if (o instanceof Document) + o = serializeDocument((Document) o); + else if (o instanceof Result) + o = serializeResult(database, (Result) o); + else if (o instanceof ResultSet) + o = serializeResultSet(database, (ResultSet) o); + else if (o instanceof Collection) + o = serializeCollection(database, (Collection) o); + else if (o instanceof Map) + o = serializeMap(database, (Map) o); + + list.put(o); + } + result = list; + } + } + return result; + } + + private Object serializeResultSet(final Database database, final ResultSet resultSet) { + final JSONArray array = new JSONArray(); + while (resultSet.hasNext()) { + final Result row = resultSet.next(); + array.put(serializeResult(database, row)); + } + return array; + } + + private Object serializeMap(final Database database, final Map value) { + final Object result; + if (useCollectionSize) { + result = value.size(); + } else { + final JSONObject map = new JSONObject().setDateFormat(database.getSchema().getDateTimeFormat()); + for (final Map.Entry entry : value.entrySet()) { + Object o = entry.getValue(); + if (o instanceof Document) + o = serializeDocument((Document) o); + else if (o instanceof ResultSet) + o = serializeResultSet(database, (ResultSet) o); + else if (o instanceof Result) + o = serializeResult(database, (Result) o); + else if (o instanceof Collection) + o = serializeCollection(database, (Collection) o); + else if (o instanceof Map) + o = serializeMap(database, (Map) o); + map.put(entry.getKey().toString(), o); + } + result = map; + } + return result; + } + public boolean isUseVertexEdgeSize() { return useVertexEdgeSize; } diff --git a/server/src/main/java/com/arcadedb/server/http/handler/AbstractQueryHandler.java b/server/src/main/java/com/arcadedb/server/http/handler/AbstractQueryHandler.java index a806c1661..1d7ace08e 100644 --- a/server/src/main/java/com/arcadedb/server/http/handler/AbstractQueryHandler.java +++ b/server/src/main/java/com/arcadedb/server/http/handler/AbstractQueryHandler.java @@ -98,9 +98,9 @@ protected void serializeResultSet(final Database database, final String serializ final RID rid = row.getIdentity().get(); recordIncluded = includedRecords.add(rid); if (recordIncluded) - records.put(serializerImpl.serializeResult(row, database)); + records.put(serializerImpl.serializeResult(database, row)); } else - records.put(serializerImpl.serializeResult(row, database)); + records.put(serializerImpl.serializeResult(database, row)); if (row.isVertex()) { if (recordIncluded) { @@ -157,7 +157,7 @@ protected void serializeResultSet(final Database database, final String serializ case "record": { final JsonSerializer serializerImpl = new JsonSerializer().setIncludeVertexEdges(false).setUseCollectionSize(false).setUseCollectionSizeForEdges(false); final JSONArray result = new JSONArray( - qResult.stream().limit(limit + 1).map(r -> serializerImpl.serializeResult(r, database)).collect(Collectors.toList())); + qResult.stream().limit(limit + 1).map(r -> serializerImpl.serializeResult(database, r)).collect(Collectors.toList())); response.put("result", result); break; } @@ -165,7 +165,7 @@ protected void serializeResultSet(final Database database, final String serializ default: { final JsonSerializer serializerImpl = new JsonSerializer().setIncludeVertexEdges(true).setUseCollectionSize(false).setUseCollectionSizeForEdges(false); final JSONArray result = new JSONArray( - qResult.stream().limit(limit + 1).map(r -> serializerImpl.serializeResult(r, database)).collect(Collectors.toList())); + qResult.stream().limit(limit + 1).map(r -> serializerImpl.serializeResult(database, r)).collect(Collectors.toList())); response.put("result", result); } }