Skip to content

Commit 6942068

Browse files
author
Jonathan Knight
committed
Bug 37190398 - [37190387->25.03] SimilaritySearch aggregator does not work from clients
(merge main -> ce/main 112012, 112013) [git-p4: depot-paths = "//dev/coherence-ce/main/": change = 112014]
1 parent 2d29c06 commit 6942068

File tree

18 files changed

+700
-238
lines changed

18 files changed

+700
-238
lines changed

prj/coherence-core/src/main/java/com/oracle/coherence/ai/search/ConverterResult.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
package com.oracle.coherence.ai.search;
99

1010
import com.oracle.coherence.ai.QueryResult;
11+
import com.tangosol.io.SerializationSupport;
1112
import com.tangosol.util.Binary;
1213
import com.tangosol.util.Converter;
1314

15+
import java.io.ObjectStreamException;
16+
import java.io.Serializable;
1417
import java.util.Objects;
1518

1619
/**
@@ -22,7 +25,7 @@
2225
*/
2326
@SuppressWarnings("unchecked")
2427
public class ConverterResult<K, V>
25-
implements QueryResult<K, V>
28+
implements QueryResult<K, V>, Serializable, SerializationSupport
2629
{
2730
/**
2831
* Create a {@link ConverterResult}.
@@ -88,6 +91,12 @@ public String toString()
8891
'}';
8992
}
9093

94+
@Override
95+
public Object writeReplace() throws ObjectStreamException
96+
{
97+
return new SimpleQueryResult<>(getDistance(), getKey(), getValue());
98+
}
99+
91100
// ----- data members ---------------------------------------------------
92101

93102
/**

prj/coherence-core/src/main/java/com/oracle/coherence/ai/search/SimilaritySearch.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.tangosol.util.Binary;
2626
import com.tangosol.util.BinaryEntry;
2727
import com.tangosol.util.Converter;
28-
import com.tangosol.util.ConverterCollections;
2928
import com.tangosol.util.ExternalizableHelper;
3029
import com.tangosol.util.Filter;
3130
import com.tangosol.util.InvocableMap;
@@ -43,12 +42,14 @@
4342
import java.io.DataOutput;
4443
import java.io.IOException;
4544

45+
import java.io.Serializable;
4646
import java.util.ArrayList;
4747
import java.util.Comparator;
4848
import java.util.Iterator;
4949
import java.util.List;
5050
import java.util.Map;
5151
import java.util.Objects;
52+
import java.util.stream.Collectors;
5253

5354
/**
5455
* An {@link StreamingAggregator} to execute a similarity query.
@@ -275,8 +276,10 @@ public List<QueryResult<K, V>> finalizeResult()
275276
@Override
276277
public List<QueryResult<K, V>> finalizeResult(Converter<Binary, ?> converterBin)
277278
{
278-
Converter<BinaryQueryResult, QueryResult<K, V>> convUp = r -> new ConverterResult<>(r, converterBin);
279-
return ConverterCollections.getList(new ArrayList<>(m_results), convUp, x -> null);
279+
Converter<BinaryQueryResult, QueryResult<K, V>> convUp = new ResultConverter<>(converterBin);
280+
return m_results.stream()
281+
.map(convUp::convert)
282+
.collect(Collectors.toList());
280283
}
281284

282285
@Override
@@ -391,6 +394,23 @@ protected boolean searchPartition(BinaryEntry binaryEntry, Vector<T> vector)
391394
return false;
392395
}
393396

397+
public static class ResultConverter<K, V>
398+
implements Converter<BinaryQueryResult, QueryResult<K, V>>, Serializable
399+
{
400+
public ResultConverter(Converter<Binary, ?> f_converterBin)
401+
{
402+
this.f_converterBin = f_converterBin;
403+
}
404+
405+
@Override
406+
public QueryResult<K, V> convert(BinaryQueryResult value)
407+
{
408+
return new ConverterResult<>(value, f_converterBin);
409+
}
410+
411+
private final Converter<Binary, ?> f_converterBin;
412+
}
413+
394414
// ----- data members ---------------------------------------------------
395415

396416
/**
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
3+
*
4+
* Licensed under the Universal Permissive License v 1.0 as shown at
5+
* https://oss.oracle.com/licenses/upl.
6+
*/
7+
8+
package com.oracle.coherence.ai.search;
9+
10+
public class SimpleQueryResult<K, V>
11+
extends BaseQueryResult<K, V>
12+
{
13+
public SimpleQueryResult()
14+
{
15+
}
16+
17+
public SimpleQueryResult(double result, K key, V value)
18+
{
19+
super(result, key, value);
20+
}
21+
}

prj/coherence-core/src/main/resources/META-INF/type-aliases.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ ai.distance.CosineSimilarity=com.oracle.coherence.ai.distance.CosineDistance
1515
ai.distance.InnerProductSimilarity=com.oracle.coherence.ai.distance.InnerProductDistance
1616
ai.distance.L2SquaredDistance=com.oracle.coherence.ai.distance.L2SquaredDistance
1717
ai.search.SimilarityAggregator=com.oracle.coherence.ai.search.SimilaritySearch
18-
ai.results.BinaryQueryResult=com.oracle.coherence.ai.search.BinaryQueryResult
18+
ai.results.QueryResult=com.oracle.coherence.ai.search.SimpleQueryResult
1919

2020
common.base.SimpleHolder=com.oracle.coherence.common.base.SimpleHolder
2121

prj/coherence-core/src/main/resources/coherence-pof-config.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1874,6 +1874,10 @@ descriptor: pof-config.xsd.
18741874
<type-id>935</type-id>
18751875
<class-name>com.oracle.coherence.ai.Float32Vector</class-name>
18761876
</user-type>
1877+
<user-type>
1878+
<type-id>936</type-id>
1879+
<class-name>com.oracle.coherence.ai.search.SimpleQueryResult</class-name>
1880+
</user-type>
18771881

18781882
<!-- java.time (940 - 949) -->
18791883

prj/coherence-json/src/main/java/com/oracle/coherence/io/json/JsonSerializer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
package com.oracle.coherence.io.json;
99

10+
import com.oracle.coherence.ai.QueryResult;
11+
import com.oracle.coherence.ai.search.ConverterResult;
12+
import com.oracle.coherence.ai.search.SimpleQueryResult;
1013
import com.oracle.coherence.common.base.Logger;
1114

1215
import com.oracle.coherence.io.json.genson.GenericType;
@@ -41,6 +44,7 @@
4144
import com.oracle.coherence.io.json.internal.MapConverter;
4245
import com.oracle.coherence.io.json.internal.MathContextConverter;
4346
import com.oracle.coherence.io.json.internal.MissingClassConverter;
47+
import com.oracle.coherence.io.json.internal.QueryResultConverter;
4448
import com.oracle.coherence.io.json.internal.RoundingModeConverter;
4549
import com.oracle.coherence.io.json.internal.SerializationGate;
4650
import com.oracle.coherence.io.json.internal.SerializationSupportConverter;
@@ -171,6 +175,9 @@ public JsonSerializer(ClassLoader loader, Modifier<GensonBuilder> builderModifie
171175
.withConverter(InetSocketAddressConverter.INSTANCE, InetSocketAddress.class)
172176
.withConverter(JsonObjectConverter.INSTANCE, JsonObject.class)
173177
.withConverter(MathContextConverter.INSTANCE, MathContext.class)
178+
.withConverter(QueryResultConverter.INSTANCE, QueryResult.class)
179+
.withConverter(QueryResultConverter.INSTANCE, ConverterResult.class)
180+
.withConverter(QueryResultConverter.INSTANCE, SimpleQueryResult.class)
174181
.withConverter(RoundingModeConverter.INSTANCE, RoundingMode.class);
175182

176183
addSafeBundle(builder, JsonbBundle.class);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
3+
*
4+
* Licensed under the Universal Permissive License v 1.0 as shown at
5+
* https://oss.oracle.com/licenses/upl.
6+
*/
7+
8+
package com.oracle.coherence.io.json.internal;
9+
10+
import com.oracle.coherence.ai.QueryResult;
11+
import com.oracle.coherence.ai.search.SimpleQueryResult;
12+
import com.oracle.coherence.io.json.genson.Context;
13+
import com.oracle.coherence.io.json.genson.Converter;
14+
import com.oracle.coherence.io.json.genson.GenericType;
15+
import com.oracle.coherence.io.json.genson.stream.ObjectReader;
16+
import com.oracle.coherence.io.json.genson.stream.ObjectWriter;
17+
18+
/**
19+
* A converter to serialize a {@link QueryResult} to json.
20+
*/
21+
@SuppressWarnings("rawtypes")
22+
public class QueryResultConverter
23+
implements Converter<QueryResult>
24+
{
25+
@Override
26+
public void serialize(QueryResult result, ObjectWriter writer, Context ctx) throws Exception
27+
{
28+
writer.beginObject();
29+
writer.writeNumber("distance", result.getDistance());
30+
writer.writeName("key");
31+
ctx.genson.serialize(result.getKey(), writer, ctx);
32+
writer.writeName("value");
33+
ctx.genson.serialize(result.getValue(), writer, ctx);
34+
writer.endObject();
35+
}
36+
37+
@Override
38+
public QueryResult deserialize(ObjectReader reader, Context ctx) throws Exception
39+
{
40+
double distance = 0.0d;
41+
Object key = null;
42+
Object value = null;
43+
44+
reader.beginObject();
45+
while (reader.hasNext())
46+
{
47+
reader.next();
48+
switch (reader.name())
49+
{
50+
case "distance":
51+
distance = reader.valueAsDouble();
52+
break;
53+
case "key":
54+
key = ctx.genson.deserialize(TYPE, reader, ctx);
55+
break;
56+
case "value":
57+
value = ctx.genson.deserialize(TYPE, reader, ctx);
58+
break;
59+
}
60+
}
61+
reader.endObject();
62+
return new SimpleQueryResult<>(distance, key, value);
63+
}
64+
65+
/**
66+
* {@link GenericType} for {@link Object}.
67+
*/
68+
private static final GenericType<Object> TYPE = GenericType.of(Object.class);
69+
70+
/**
71+
* The singleton instance for {@code QueryResultConverter}.
72+
*/
73+
public static final QueryResultConverter INSTANCE = new QueryResultConverter();
74+
}

prj/test/distribution/grpc-compatibility/grpc-ce-22.06/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
<coherence.compatability.minJavaVersion>11</coherence.compatability.minJavaVersion>
3535
<coherence.compatability.maxJavaVersion>21</coherence.compatability.maxJavaVersion>
36+
<skip.similarity.search>true</skip.similarity.search>
3637
</properties>
3738

3839
<dependencies>

prj/test/distribution/grpc-compatibility/grpc-compatibility-core/src/main/java/grpc/client/compatibility/ClientCompatibilityIT.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,13 @@ public void shouldReturnTrueForContainsKeyWithExistingMapping(String sSerializer
323323
super.shouldReturnTrueForContainsAssociatedKeyWithExistingMapping(sSerializerName, serializer);
324324
}
325325

326+
@Override
327+
public void shouldPerformSimilaritySearch(String sSerializerName, Serializer serializer) throws Exception
328+
{
329+
Assumptions.assumeFalse(Boolean.getBoolean("skip.similarity.search"), "Similarity search test is skipped");
330+
super.shouldPerformSimilaritySearch(sSerializerName, serializer);
331+
}
332+
326333
@Override
327334
protected <K, V> NamedCache<K, V> createClient(String sCacheName, String sSerializerName, Serializer serializer)
328335
{

prj/test/distribution/grpc-compatibility/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<coherence.compatability.groupId/>
3636
<coherence.compatability.minJavaVersion/>
3737
<coherence.compatability.maxJavaVersion/>
38+
<skip.similarity.search>false</skip.similarity.search>
3839

3940
<maven.home.dir>${env.MAVEN_HOME}</maven.home.dir>
4041
<coherence.compatability.settings>${maven.home.dir}/conf/settings.xml</coherence.compatability.settings>
@@ -65,6 +66,7 @@
6566
<coherence.compatability.settings>${coherence.compatability.settings}</coherence.compatability.settings>
6667
<coherence.compatability.minJavaVersion>${coherence.compatability.minJavaVersion}</coherence.compatability.minJavaVersion>
6768
<coherence.compatability.maxJavaVersion>${coherence.compatability.maxJavaVersion}</coherence.compatability.maxJavaVersion>
69+
<skip.similarity.search>${skip.similarity.search}</skip.similarity.search>
6870
</systemProperties>
6971
</configuration>
7072
</plugin>

0 commit comments

Comments
 (0)