Skip to content

Commit

Permalink
fix: fixed serialization of resultset nested in collection
Browse files Browse the repository at this point in the history
  • Loading branch information
lvca committed Jul 14, 2023
1 parent f5156aa commit 4281a1c
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ 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);
registerImplementation("FloatCorrelation", DistanceFunctions.FLOAT_CORRELATION_DISTANCE);
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
145 changes: 72 additions & 73 deletions engine/src/main/java/com/arcadedb/serializer/JsonSerializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Object> 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<Object, Object> entry : ((Map<Object, Object>) 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<Object, Object>) value);

value = convertNonNumbers(value);

Expand All @@ -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()) {
Expand All @@ -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<Object, Object> entry : ((Map<Object, Object>) 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<Object, Object>) value);

value = convertNonNumbers(value);

Expand All @@ -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<Object, Object>) 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<Object, Object> value) {
final Object result;
if (useCollectionSize) {
result = value.size();
} else {
final JSONObject map = new JSONObject().setDateFormat(database.getSchema().getDateTimeFormat());
for (final Map.Entry<Object, Object> 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<Object, Object>) o);
map.put(entry.getKey().toString(), o);
}
result = map;
}
return result;
}

public boolean isUseVertexEdgeSize() {
return useVertexEdgeSize;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -157,15 +157,15 @@ 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;
}

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);
}
}
Expand Down

0 comments on commit 4281a1c

Please sign in to comment.