Skip to content

Commit 6a25fe2

Browse files
author
Julien Ruaux
committed
deps: Upgraded Lettucemod and ulid
1 parent a131953 commit 6a25fe2

File tree

8 files changed

+80
-52
lines changed

8 files changed

+80
-52
lines changed

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ jacksonVersion=2.13.1
1919
jnaVersion=5.10.0
2020
jodaVersion=2.10.13
2121
junitVersion=5.8.2
22-
lettucemodVersion=2.19.3
22+
lettucemodVersion=3.0.0
2323
testcontainersRedisVersion=1.6.0
2424
servletVersion=4.0.1
2525
slf4jVersion=1.7.32
2626
sliceVersion=0.42
2727
trinoVersion=380
28-
ulidVersion=4.2.1
28+
ulidVersion=5.0.0
2929
unitsVersion=1.6
3030
validationVersion=2.0.1.Final
3131
wsVersion=2.1.1

subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchClientModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ public void configure(Binder binder) {
2424
binder.bind(RediSearchPageSourceProvider.class).in(Scopes.SINGLETON);
2525
binder.bind(RediSearchPageSinkProvider.class).in(Scopes.SINGLETON);
2626

27-
configBinder(binder).bindConfig(RediSearchClientConfig.class);
27+
configBinder(binder).bindConfig(RediSearchConfig.class);
2828
}
2929

3030
@Singleton
3131
@Provides
32-
public static RediSearchSession createRediSearchSession(TypeManager typeManager, RediSearchClientConfig config) {
32+
public static RediSearchSession createRediSearchSession(TypeManager typeManager, RediSearchConfig config) {
3333
requireNonNull(config, "config is null");
3434
Optional<String> uri = config.getUri();
3535
if (uri.isPresent()) {

subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchClientConfig.java renamed to subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchConfig.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.redis.trino;
22

3+
import java.time.Duration;
34
import java.util.Optional;
45

56
import javax.validation.constraints.NotNull;
@@ -9,23 +10,27 @@
910
import io.airlift.configuration.ConfigDescription;
1011
import io.airlift.configuration.ConfigSecuritySensitive;
1112

12-
public class RediSearchClientConfig {
13+
public class RediSearchConfig {
1314

1415
public static final String DEFAULT_SCHEMA = "default";
1516
public static final long DEFAULT_LIMIT = 10000;
17+
public static final Duration DEFAULT_TABLE_CACHE_EXPIRATION = Duration.ofHours(1);
18+
public static final Duration DEFAULT_TABLE_CACHE_REFRESH = Duration.ofMinutes(1);
1619

1720
private String defaultSchema = DEFAULT_SCHEMA;
1821
private Optional<String> uri = Optional.empty();
1922
private boolean caseInsensitiveNameMatching;
2023
private long defaultLimit = DEFAULT_LIMIT;
2124
private long cursorCount = 0; // Use RediSearch default
25+
private long tableCacheExpiration = DEFAULT_TABLE_CACHE_EXPIRATION.toSeconds();
26+
private long tableCacheRefresh = DEFAULT_TABLE_CACHE_REFRESH.toSeconds();
2227

2328
public long getCursorCount() {
2429
return cursorCount;
2530
}
2631

2732
@Config("redisearch.cursor-count")
28-
public RediSearchClientConfig setCursorCount(long cursorCount) {
33+
public RediSearchConfig setCursorCount(long cursorCount) {
2934
this.cursorCount = cursorCount;
3035
return this;
3136
}
@@ -36,19 +41,41 @@ public long getDefaultLimit() {
3641

3742
@Config("redisearch.default-limit")
3843
@ConfigDescription("Default search limit number to use")
39-
public RediSearchClientConfig setDefaultLimit(long defaultLimit) {
44+
public RediSearchConfig setDefaultLimit(long defaultLimit) {
4045
this.defaultLimit = defaultLimit;
4146
return this;
4247
}
4348

49+
@Config("redisearch.table-cache-expiration")
50+
@ConfigDescription("Duration in seconds since the entry creation after which a table should be automatically removed from the cache.")
51+
public RediSearchConfig setTableCacheExpiration(long expirationDuration) {
52+
this.tableCacheExpiration = expirationDuration;
53+
return this;
54+
}
55+
56+
public long getTableCacheExpiration() {
57+
return tableCacheExpiration;
58+
}
59+
60+
@Config("redisearch.table-cache-refresh")
61+
@ConfigDescription("Duration in seconds since the entry creation after which to automatically refresh the table cache.")
62+
public RediSearchConfig setTableCacheRefresh(long refreshDuration) {
63+
this.tableCacheRefresh = refreshDuration;
64+
return this;
65+
}
66+
67+
public long getTableCacheRefresh() {
68+
return tableCacheRefresh;
69+
}
70+
4471
@NotNull
4572
public String getDefaultSchema() {
4673
return defaultSchema;
4774
}
4875

4976
@Config("redisearch.default-schema-name")
5077
@ConfigDescription("Default schema name to use")
51-
public RediSearchClientConfig setDefaultSchema(String defaultSchema) {
78+
public RediSearchConfig setDefaultSchema(String defaultSchema) {
5279
this.defaultSchema = defaultSchema;
5380
return this;
5481
}
@@ -61,7 +88,7 @@ public RediSearchClientConfig setDefaultSchema(String defaultSchema) {
6188
@Config("redisearch.uri")
6289
@ConfigDescription("Redis connection URI e.g. 'redis://localhost:6379'")
6390
@ConfigSecuritySensitive
64-
public RediSearchClientConfig setUri(String uri) {
91+
public RediSearchConfig setUri(String uri) {
6592
this.uri = Optional.ofNullable(uri);
6693
return this;
6794
}
@@ -72,7 +99,7 @@ public boolean isCaseInsensitiveNameMatching() {
7299

73100
@Config("redisearch.case-insensitive-name-matching")
74101
@ConfigDescription("Case-insensitive name-matching")
75-
public RediSearchClientConfig setCaseInsensitiveNameMatching(boolean caseInsensitiveNameMatching) {
102+
public RediSearchConfig setCaseInsensitiveNameMatching(boolean caseInsensitiveNameMatching) {
76103
this.caseInsensitiveNameMatching = caseInsensitiveNameMatching;
77104
return this;
78105
}

subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchPageSink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public class RediSearchPageSink implements ConnectorPageSink {
6161
private final List<RediSearchColumnHandle> columns;
6262
private final UlidFactory factory = UlidFactory.newInstance(new Random());
6363

64-
public RediSearchPageSink(RediSearchClientConfig config, RediSearchSession rediSearchSession,
64+
public RediSearchPageSink(RediSearchConfig config, RediSearchSession rediSearchSession,
6565
SchemaTableName schemaTableName, List<RediSearchColumnHandle> columns) {
6666
this.rediSearchSession = rediSearchSession;
6767
this.schemaTableName = schemaTableName;

subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchPageSinkProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111

1212
public class RediSearchPageSinkProvider implements ConnectorPageSinkProvider {
1313

14-
private final RediSearchClientConfig config;
14+
private final RediSearchConfig config;
1515
private final RediSearchSession rediSearchSession;
1616

1717
@Inject
18-
public RediSearchPageSinkProvider(RediSearchClientConfig config, RediSearchSession rediSearchSession) {
18+
public RediSearchPageSinkProvider(RediSearchConfig config, RediSearchSession rediSearchSession) {
1919
this.config = config;
2020
this.rediSearchSession = rediSearchSession;
2121
}

subprojects/trino-redisearch/src/main/java/com/redis/trino/RediSearchSession.java

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@
88
import static java.lang.String.format;
99
import static java.util.Locale.ENGLISH;
1010
import static java.util.Objects.requireNonNull;
11-
import static java.util.concurrent.TimeUnit.HOURS;
12-
import static java.util.concurrent.TimeUnit.MINUTES;
1311

1412
import java.util.Collections;
1513
import java.util.HashSet;
1614
import java.util.List;
1715
import java.util.Optional;
1816
import java.util.Set;
17+
import java.util.concurrent.TimeUnit;
1918
import java.util.stream.Collectors;
2019

2120
import com.google.common.cache.CacheBuilder;
@@ -71,24 +70,24 @@ public class RediSearchSession {
7170

7271
private final TypeManager typeManager;
7372
private final StatefulRedisModulesConnection<String, String> connection;
74-
private final RediSearchClientConfig config;
73+
private final RediSearchConfig config;
7574
private final LoadingCache<SchemaTableName, RediSearchTable> tableCache;
7675

7776
public RediSearchSession(TypeManager typeManager, StatefulRedisModulesConnection<String, String> connection,
78-
RediSearchClientConfig config) {
77+
RediSearchConfig config) {
7978
this.typeManager = requireNonNull(typeManager, "typeManager is null");
8079
this.connection = requireNonNull(connection, "connection is null");
8180
this.config = requireNonNull(config, "config is null");
82-
// TODO make table cache expiration configurable
83-
this.tableCache = CacheBuilder.newBuilder().expireAfterWrite(1, HOURS).refreshAfterWrite(1, MINUTES)
81+
this.tableCache = CacheBuilder.newBuilder().expireAfterWrite(config.getTableCacheExpiration(), TimeUnit.SECONDS)
82+
.refreshAfterWrite(config.getTableCacheRefresh(), TimeUnit.SECONDS)
8483
.build(CacheLoader.from(this::loadTableSchema));
8584
}
8685

8786
public StatefulRedisModulesConnection<String, String> getConnection() {
8887
return connection;
8988
}
9089

91-
public RediSearchClientConfig getConfig() {
90+
public RediSearchConfig getConfig() {
9291
return config;
9392
}
9493

@@ -107,7 +106,7 @@ public List<HostAddress> getAddresses() {
107106

108107
public Set<String> getAllTables() throws SchemaNotFoundException {
109108
ImmutableSet.Builder<String> builder = ImmutableSet.builder();
110-
builder.addAll(connection.sync().list());
109+
builder.addAll(connection.sync().ftList());
111110
return builder.build();
112111
}
113112

@@ -120,25 +119,26 @@ public RediSearchTable getTable(SchemaTableName tableName) throws TableNotFoundE
120119
}
121120
}
122121

122+
@SuppressWarnings("unchecked")
123123
public void createTable(SchemaTableName schemaTableName, List<RediSearchColumnHandle> columns) {
124124
String tableName = schemaTableName.getTableName();
125-
if (!connection.sync().list().contains(tableName)) {
126-
List<Field> fields = columns.stream().filter(c -> !c.getName().equals("_id"))
125+
if (!connection.sync().ftList().contains(tableName)) {
126+
List<Field<String>> fields = columns.stream().filter(c -> !c.getName().equals("_id"))
127127
.map(c -> buildField(c.getName(), c.getType())).collect(Collectors.toList());
128128
CreateOptions.Builder<String, String> options = CreateOptions.<String, String>builder();
129129
options.prefix(tableName + ":");
130-
connection.sync().create(tableName, options.build(), fields.toArray(new Field[0]));
130+
connection.sync().ftCreate(tableName, options.build(), fields.toArray(Field[]::new));
131131
}
132132
}
133133

134134
public void dropTable(SchemaTableName tableName) {
135-
connection.sync().dropindexDeleteDocs(toRemoteTableName(tableName.getTableName()));
135+
connection.sync().ftDropindexDeleteDocs(toRemoteTableName(tableName.getTableName()));
136136
tableCache.invalidate(tableName);
137137
}
138138

139139
public void addColumn(SchemaTableName schemaTableName, ColumnMetadata columnMetadata) {
140140
String tableName = toRemoteTableName(schemaTableName.getTableName());
141-
connection.sync().alter(tableName, buildField(columnMetadata.getName(), columnMetadata.getType()));
141+
connection.sync().ftAlter(tableName, buildField(columnMetadata.getName(), columnMetadata.getType()));
142142
tableCache.invalidate(schemaTableName);
143143
}
144144

@@ -167,12 +167,12 @@ private RediSearchTable loadTableSchema(SchemaTableName schemaTableName) {
167167
}
168168
Set<String> fields = new HashSet<>();
169169
ImmutableList.Builder<RediSearchColumnHandle> columnHandles = ImmutableList.builder();
170-
for (Field columnMetadata : indexInfo.get().getFields()) {
170+
for (Field<String> columnMetadata : indexInfo.get().getFields()) {
171171
RediSearchColumnHandle column = buildColumnHandle(columnMetadata);
172172
fields.add(column.getName());
173173
columnHandles.add(column);
174174
}
175-
SearchResults<String, String> results = connection.sync().search(index, "*");
175+
SearchResults<String, String> results = connection.sync().ftSearch(index, "*");
176176
for (Document<String, String> doc : results) {
177177
for (String field : doc.keySet()) {
178178
if (fields.contains(field)) {
@@ -188,7 +188,7 @@ private RediSearchTable loadTableSchema(SchemaTableName schemaTableName) {
188188

189189
private Optional<IndexInfo> indexInfo(String index) {
190190
try {
191-
List<Object> indexInfoList = connection.sync().indexInfo(index);
191+
List<Object> indexInfoList = connection.sync().ftInfo(index);
192192
if (indexInfoList != null) {
193193
return Optional.of(RedisModulesUtils.indexInfo(indexInfoList));
194194
}
@@ -198,7 +198,7 @@ private Optional<IndexInfo> indexInfo(String index) {
198198
return Optional.empty();
199199
}
200200

201-
private RediSearchColumnHandle buildColumnHandle(Field field) {
201+
private RediSearchColumnHandle buildColumnHandle(Field<String> field) {
202202
return buildColumnHandle(field.getName(), field.getType(), false);
203203
}
204204

@@ -222,32 +222,31 @@ public SearchResults<String, String> search(RediSearchTableHandle tableHandle,
222222
options.limit(Limit.offset(0).num(limit(tableHandle)));
223223
options.returnFields(columns.stream().map(RediSearchColumnHandle::getName).toArray(String[]::new));
224224
log.info("Running search on index %s with query '%s'", index, query);
225-
return connection.sync().search(index, query, options.build());
225+
return connection.sync().ftSearch(index, query, options.build());
226226
}
227227

228228
public AggregateWithCursorResults<String> aggregate(RediSearchTableHandle table) {
229229
String index = index(table);
230230
String query = RediSearchQueryBuilder.buildQuery(table.getConstraint());
231-
AggregateOptions.Builder<String, String> optionsBuilder = AggregateOptions.builder();
232-
optionsBuilder.limit(Limit.offset(0).num(limit(table)));
231+
AggregateOptions.Builder<String, String> options = AggregateOptions.builder();
232+
options.operation(Limit.offset(0).num(limit(table)));
233233
Optional<Group> group = RediSearchQueryBuilder.group(table.getTermAggregations(),
234234
table.getMetricAggregations());
235-
group.ifPresent(optionsBuilder::group);
236-
AggregateOptions<String, String> options = optionsBuilder.build();
237-
log.info("Running aggregation on index %s with query '%s' and %s", index, query, options);
235+
group.ifPresent(options::operation);
236+
log.info("Running aggregation on index %s with query '%s' and %s", index, query, options.build());
238237
CursorOptions.Builder cursorOptions = CursorOptions.builder();
239238
if (config.getCursorCount() > 0) {
240239
cursorOptions.count(config.getCursorCount());
241240
}
242-
return connection.sync().aggregate(index, query, cursorOptions.build(), options);
241+
return connection.sync().ftAggregate(index, query, cursorOptions.build(), options.build());
243242
}
244243

245244
public AggregateWithCursorResults<String> cursorRead(RediSearchTableHandle tableHandle, long cursor) {
246245
String index = index(tableHandle);
247246
if (config.getCursorCount() > 0) {
248-
return connection.sync().cursorRead(index, cursor, config.getCursorCount());
247+
return connection.sync().ftCursorRead(index, cursor, config.getCursorCount());
249248
}
250-
return connection.sync().cursorRead(index, cursor);
249+
return connection.sync().ftCursorRead(index, cursor);
251250
}
252251

253252
private String index(RediSearchTableHandle tableHandle) {
@@ -261,7 +260,7 @@ private long limit(RediSearchTableHandle tableHandle) {
261260
return config.getDefaultLimit();
262261
}
263262

264-
private Field buildField(String columnName, Type columnType) {
263+
private Field<String> buildField(String columnName, Type columnType) {
265264
Field.Type fieldType = toFieldType(columnType);
266265
switch (fieldType) {
267266
case GEO:
@@ -338,7 +337,7 @@ private TypeSignature varcharType() {
338337
}
339338

340339
public void cursorDelete(RediSearchTableHandle tableHandle, long cursor) {
341-
connection.sync().cursorDelete(index(tableHandle), cursor);
340+
connection.sync().ftCursorDelete(index(tableHandle), cursor);
342341
}
343342

344343
}

subprojects/trino-redisearch/src/test/java/com/redis/trino/RediSearchLoader.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ private class RediSearchLoadingSession implements ResultsSession<Void> {
5959
private RediSearchLoadingSession() {
6060
}
6161

62+
@SuppressWarnings("unchecked")
6263
@Override
6364
public void addResults(QueryStatusInfo statusInfo, QueryData data) {
6465
if (types.get() == null && statusInfo.getColumns() != null) {
@@ -70,15 +71,15 @@ public void addResults(QueryStatusInfo statusInfo, QueryData data) {
7071
}
7172
checkState(types.get() != null, "Type information is missing");
7273
List<Column> columns = statusInfo.getColumns();
73-
if (!context.sync().list().contains(tableName)) {
74-
List<Field> schema = new ArrayList<>();
74+
if (!context.sync().ftList().contains(tableName)) {
75+
List<Field<String>> schema = new ArrayList<>();
7576
for (int i = 0; i < columns.size(); i++) {
7677
Type type = types.get().get(i);
7778
schema.add(field(columns.get(i).getName(), type));
7879
}
79-
context.sync().create(tableName,
80+
context.sync().ftCreate(tableName,
8081
CreateOptions.<String, String>builder().prefix(tableName + ":").build(),
81-
schema.toArray(new Field[0]));
82+
schema.toArray(Field[]::new));
8283
}
8384
RedisModulesAsyncCommands<String, String> async = context.async();
8485
async.setAutoFlushCommands(false);
@@ -99,7 +100,7 @@ public void addResults(QueryStatusInfo statusInfo, QueryData data) {
99100
async.setAutoFlushCommands(true);
100101
}
101102

102-
private Field field(String name, Type type) {
103+
private Field<String> field(String name, Type type) {
103104
if (type instanceof VarcharType) {
104105
return Field.tag(name).build();
105106
}

subprojects/trino-redisearch/src/test/java/com/redis/trino/TestRediSearchConfig.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ public class TestRediSearchConfig {
1616

1717
@Test
1818
public void testDefaults() {
19-
assertRecordedDefaults(recordDefaults(RediSearchClientConfig.class).setUri(null)
20-
.setDefaultSchema(RediSearchClientConfig.DEFAULT_SCHEMA)
21-
.setDefaultLimit(RediSearchClientConfig.DEFAULT_LIMIT).setCaseInsensitiveNameMatching(false)
22-
.setCursorCount(0));
19+
assertRecordedDefaults(recordDefaults(RediSearchConfig.class).setUri(null)
20+
.setDefaultSchema(RediSearchConfig.DEFAULT_SCHEMA).setDefaultLimit(RediSearchConfig.DEFAULT_LIMIT)
21+
.setCaseInsensitiveNameMatching(false).setCursorCount(0)
22+
.setTableCacheExpiration(RediSearchConfig.DEFAULT_TABLE_CACHE_EXPIRATION.toSeconds())
23+
.setTableCacheRefresh(RediSearchConfig.DEFAULT_TABLE_CACHE_REFRESH.toSeconds()));
2324
}
2425

2526
@Test
@@ -30,9 +31,9 @@ public void testExplicitPropertyMappings() {
3031
.put("redisearch.default-schema-name", defaultSchema).build();
3132

3233
ConfigurationFactory configurationFactory = new ConfigurationFactory(properties);
33-
RediSearchClientConfig config = configurationFactory.build(RediSearchClientConfig.class);
34+
RediSearchConfig config = configurationFactory.build(RediSearchConfig.class);
3435

35-
RediSearchClientConfig expected = new RediSearchClientConfig().setDefaultSchema(defaultSchema).setUri(uri);
36+
RediSearchConfig expected = new RediSearchConfig().setDefaultSchema(defaultSchema).setUri(uri);
3637

3738
assertEquals(config.getDefaultSchema(), expected.getDefaultSchema());
3839
assertEquals(config.getUri(), expected.getUri());

0 commit comments

Comments
 (0)