Skip to content

Commit 6996600

Browse files
committed
Add Support for non string keys
1 parent 702d092 commit 6996600

File tree

17 files changed

+451
-52
lines changed

17 files changed

+451
-52
lines changed

astra-db-java/src/main/java/com/datastax/astra/client/core/query/Filters.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import java.util.Arrays;
2727
import java.util.Calendar;
2828
import java.util.Date;
29+
import java.util.HashMap;
30+
import java.util.List;
31+
import java.util.Map;
2932

3033
/**
3134
* Helper to create Filter
@@ -386,6 +389,12 @@ public static <V> Filter in(final String fieldName, final V... values) {
386389
return new Filter().where(fieldName).isInArray(values);
387390
}
388391

392+
public static <V> Filter in(final V... values) {
393+
Filter f = new Filter();
394+
f.documentMap.put(FilterOperator.IN.getOperator(), values);
395+
return f;
396+
}
397+
389398
/**
390399
* Creates a filter that matches all documents where the value of a field equals any value in the list of specified values.
391400
*
@@ -525,4 +534,16 @@ public static Filter not(Filter filter) {
525534
return andFilter;
526535
}
527536

537+
public static Filter values(String fieldName, Map<String, Object> values) {
538+
Filter valuesFilter = new Filter();
539+
Map<String, Map<String, Object>> map = new HashMap<>();
540+
map.put("$values", values);
541+
valuesFilter.documentMap.put(fieldName, map);
542+
return valuesFilter;
543+
}
544+
545+
546+
547+
548+
528549
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.datastax.astra.client.tables;
2+
3+
public class DataAPIMap {
4+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.datastax.astra.client.tables;
2+
3+
import com.datastax.astra.internal.serdes.tables.DataAPIPairSerializer;
4+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
/**
11+
* Represent a key/value pair.
12+
*
13+
* @param <K> key type
14+
* @param <V> value type
15+
*/
16+
@Data
17+
@NoArgsConstructor
18+
@AllArgsConstructor
19+
@JsonSerialize(using = DataAPIPairSerializer.class)
20+
public class DataAPIPair<K, V> {
21+
22+
K key;
23+
24+
V value;
25+
}

astra-db-java/src/main/java/com/datastax/astra/client/tables/Table.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ public <R> Page<R> findPage(Filter filter, TableFindOptions options, Class<R> ne
880880
.appendIfNotNull("skip", options.skip())
881881
.appendIfNotNull("limit", options.limit())
882882
.appendIfNotNull(OPTIONS_PAGE_STATE, options.pageState())
883-
.appendIfNotNull(OPTIONS_INCLUDE_SCORES, options.includeSortVector())
883+
.appendIfNotNull(OPTIONS_INCLUDE_SORT_VECTOR, options.includeSortVector())
884884
.appendIfNotNull(OPTIONS_INCLUDE_SIMILARITY, options.includeSimilarity()));
885885
}
886886
DataAPIResponse apiResponse = runCommand(findCommand, options);

astra-db-java/src/main/java/com/datastax/astra/client/tables/definition/rows/Row.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.datastax.astra.client.core.hybrid.Hybrid;
2626
import com.datastax.astra.client.core.vector.DataAPIVector;
2727
import com.datastax.astra.client.exceptions.UnexpectedDataAPIResponseException;
28+
import com.datastax.astra.client.tables.DataAPIPair;
2829
import com.datastax.astra.client.tables.definition.TableDuration;
2930
import com.datastax.astra.internal.serdes.DataAPISerializer;
3031
import com.datastax.astra.internal.serdes.tables.RowSerializer;
@@ -682,6 +683,18 @@ public <T> Row addSet(String key, Set<T> set) {
682683
* </pre>
683684
*/
684685
public <K, V> Row addMap(String key, Map<K, V> myMap) {
686+
if (!myMap.isEmpty()) {
687+
Object firstKey = myMap.keySet().iterator().next();
688+
if (firstKey instanceof String) {
689+
return add(key, myMap);
690+
} else {
691+
// Convert to a list of pairs
692+
return add(key, myMap.entrySet()
693+
.stream()
694+
.map(e -> new DataAPIPair<>(e.getKey(), e.getValue()))
695+
.toList());
696+
}
697+
}
685698
return add(key, myMap);
686699
}
687700

astra-db-java/src/main/java/com/datastax/astra/internal/command/AbstractCommandRunner.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,11 @@ public DataAPIResponse runCommand(Command command, BaseOptions<?> overridingOpti
199199
// Should we override the client to use a different one
200200
long requestTimeout = this.options.getRequestTimeout();
201201
if (overridingOptions != null && overridingOptions.getDataAPIClientOptions() != null) {
202-
DataAPIClientOptions overClientOptions = overridingOptions.getDataAPIClientOptions();
202+
DataAPIClientOptions overClientOptions = overridingOptions.getDataAPIClientOptions();
203203
HttpClientOptions overHttpClientOptions = overClientOptions.getHttpClientOptions();
204204
TimeoutOptions overTimeoutOptions = overClientOptions.getTimeoutOptions();
205205
// User provided specific parameters for the client
206206
if (overHttpClientOptions != null || overTimeoutOptions != null) {
207-
log.debug("Overriding Http Client");
208207
// overTimeoutOptions used only for connection timeout
209208
requestHttpClient = new RetryHttpClient(
210209
overHttpClientOptions != null ? overHttpClientOptions : options.getHttpClientOptions(),
@@ -216,7 +215,6 @@ public DataAPIResponse runCommand(Command command, BaseOptions<?> overridingOpti
216215
// =======================
217216
if (overTimeoutOptions != null) {
218217
requestTimeout = overridingOptions.getRequestTimeout();
219-
log.debug("Overriding Timeouts to {}", requestTimeout);
220218
}
221219
}
222220

astra-db-java/src/main/java/com/datastax/astra/internal/http/RetryHttpClient.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public String getUserAgentHeader() {
144144
*/
145145
public ApiResponseHttp parseHttpResponse(HttpResponse<String> response) {
146146
if (response == null) return null;
147-
148147
ApiResponseHttp res = new ApiResponseHttp(response.body(), response.statusCode(),
149148
response.headers().map().entrySet()
150149
.stream()
@@ -178,7 +177,7 @@ public Status<HttpResponse<String>> executeHttpRequest(HttpRequest req) {
178177
.afterFailedTryListener(s -> {
179178
log.error("Failure on attempt {}/{} ", s.getTotalTries(), retryConfig.getMaxNumberOfTries());
180179
log.error("Failed request {} on {}", req.method() , req.uri().toString() );
181-
log.error("+ Exception was ", s.getLastExceptionThatCausedRetry());
180+
log.error("Exception was ", s.getLastExceptionThatCausedRetry());
182181
})
183182
.build()
184183
.execute(executeRequest);
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.datastax.astra.internal.serdes.tables;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.core.JsonToken;
5+
import com.fasterxml.jackson.databind.BeanProperty;
6+
import com.fasterxml.jackson.databind.DeserializationContext;
7+
import com.fasterxml.jackson.databind.JavaType;
8+
import com.fasterxml.jackson.databind.JsonDeserializer;
9+
import com.fasterxml.jackson.databind.JsonMappingException;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
12+
import com.fasterxml.jackson.databind.type.MapType;
13+
14+
import java.io.IOException;
15+
import java.util.LinkedHashMap;
16+
import java.util.Map;
17+
18+
public class DataAPIPairArrayDeserializerToMap<K, V>
19+
extends JsonDeserializer<Map<K, V>>
20+
implements ContextualDeserializer {
21+
22+
private JavaType keyType;
23+
private JavaType valueType;
24+
25+
public DataAPIPairArrayDeserializerToMap() {
26+
// default constructor
27+
}
28+
29+
public DataAPIPairArrayDeserializerToMap(JavaType keyType, JavaType valueType) {
30+
this.keyType = keyType;
31+
this.valueType = valueType;
32+
}
33+
34+
@Override
35+
public Map<K, V> deserialize(JsonParser p, DeserializationContext ctxt)
36+
throws IOException {
37+
ObjectMapper mapper = (ObjectMapper) p.getCodec();
38+
Map<K, V> map = new LinkedHashMap<>();
39+
40+
if (p.currentToken() == null) p.nextToken();
41+
if (p.currentToken() != JsonToken.START_ARRAY) {
42+
throw JsonMappingException.from(p, "Expected START_ARRAY for list of pairs");
43+
}
44+
45+
while (p.nextToken() != JsonToken.END_ARRAY) {
46+
if (p.currentToken() != JsonToken.START_ARRAY) {
47+
throw JsonMappingException.from(p, "Expected START_ARRAY for pair");
48+
}
49+
50+
p.nextToken();
51+
K key = mapper.readValue(p, keyType);
52+
53+
p.nextToken();
54+
V value = mapper.readValue(p, valueType);
55+
56+
map.put(key, value);
57+
58+
if (p.nextToken() != JsonToken.END_ARRAY) {
59+
throw JsonMappingException.from(p, "Expected END_ARRAY after pair");
60+
}
61+
}
62+
63+
return map;
64+
}
65+
66+
@Override
67+
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
68+
if (property != null) {
69+
JavaType type = property.getType(); // Map<K,V>
70+
MapType mapType = (MapType) type;
71+
return new DataAPIPairArrayDeserializerToMap<>(mapType.getKeyType(), mapType.getContentType());
72+
}
73+
return this;
74+
}
75+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.datastax.astra.internal.serdes.tables;
2+
3+
import com.datastax.astra.client.tables.DataAPIPair;
4+
import com.fasterxml.jackson.core.JsonGenerator;
5+
import com.fasterxml.jackson.databind.JsonSerializer;
6+
import com.fasterxml.jackson.databind.SerializerProvider;
7+
8+
import java.io.IOException;
9+
10+
/**
11+
* Serialize a pair as an array of two elements.
12+
*/
13+
public class DataAPIPairSerializer extends JsonSerializer<DataAPIPair<?, ?>> {
14+
15+
@Override
16+
public void serialize(DataAPIPair<?, ?> pair, JsonGenerator gen, SerializerProvider serializers) throws IOException {
17+
gen.writeStartArray();
18+
gen.writeObject(pair.getKey());
19+
gen.writeObject(pair.getValue());
20+
gen.writeEndArray();
21+
}
22+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.datastax.astra.internal.serdes.tables;
2+
3+
import com.fasterxml.jackson.core.JsonGenerator;
4+
import com.fasterxml.jackson.databind.JsonSerializer;
5+
import com.fasterxml.jackson.databind.SerializerProvider;
6+
7+
import java.io.IOException;
8+
import java.util.Map;
9+
10+
public class MapToDataApiPairArraySerializer<K, V> extends JsonSerializer<Map<K, V>> {
11+
12+
@Override
13+
public void serialize(Map<K, V> map, JsonGenerator gen, SerializerProvider serializers)
14+
throws IOException {
15+
gen.writeStartArray();
16+
for (Map.Entry<K, V> entry : map.entrySet()) {
17+
gen.writeStartArray();
18+
serializers.defaultSerializeValue(entry.getKey(), gen);
19+
serializers.defaultSerializeValue(entry.getValue(), gen);
20+
gen.writeEndArray();
21+
}
22+
gen.writeEndArray();
23+
}
24+
25+
}

0 commit comments

Comments
 (0)