Skip to content

Commit ae67305

Browse files
author
Julien Ruaux
committed
feat: Support projecting non-indexed fields. Resolves #4
1 parent 446d880 commit ae67305

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

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

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@
1212
import static java.util.concurrent.TimeUnit.MINUTES;
1313

1414
import java.util.Collections;
15+
import java.util.LinkedHashMap;
1516
import java.util.List;
17+
import java.util.Map;
1618
import java.util.Optional;
1719
import java.util.Set;
1820
import java.util.stream.Collectors;
1921

2022
import com.google.common.cache.CacheBuilder;
2123
import com.google.common.cache.CacheLoader;
2224
import com.google.common.cache.LoadingCache;
23-
import com.google.common.collect.ImmutableList;
2425
import com.google.common.collect.ImmutableSet;
2526
import com.google.common.util.concurrent.UncheckedExecutionException;
2627
import com.redis.lettucemod.RedisModulesUtils;
@@ -29,6 +30,7 @@
2930
import com.redis.lettucemod.search.AggregateWithCursorResults;
3031
import com.redis.lettucemod.search.CreateOptions;
3132
import com.redis.lettucemod.search.CursorOptions;
33+
import com.redis.lettucemod.search.Document;
3234
import com.redis.lettucemod.search.Field;
3335
import com.redis.lettucemod.search.Group;
3436
import com.redis.lettucemod.search.IndexInfo;
@@ -158,26 +160,40 @@ public void dropColumn(SchemaTableName schemaTableName, String columnName) {
158160
}
159161

160162
private RediSearchTable loadTableSchema(SchemaTableName schemaTableName) {
161-
IndexInfo indexInfo = getIndexInfo(schemaTableName.getSchemaName(), schemaTableName.getTableName());
162-
163-
ImmutableList.Builder<RediSearchColumnHandle> columnHandles = ImmutableList.builder();
164-
165-
for (Field columnMetadata : indexInfo.getFields()) {
163+
String index = schemaTableName.getTableName();
164+
Optional<IndexInfo> indexInfo = indexInfo(index);
165+
if (indexInfo.isEmpty()) {
166+
throw new TableNotFoundException(schemaTableName, format("Index '%s' not found", index), null);
167+
}
168+
Map<String, RediSearchColumnHandle> columns = new LinkedHashMap<>();
169+
for (Field columnMetadata : indexInfo.get().getFields()) {
166170
RediSearchColumnHandle columnHandle = buildColumnHandle(columnMetadata);
167-
columnHandles.add(columnHandle);
171+
columns.put(columnHandle.getName(), columnHandle);
168172
}
169173

174+
SearchResults<String, String> results = connection.sync().search(index, "*");
175+
for (Document<String, String> doc : results) {
176+
Set<String> fields = doc.keySet();
177+
fields.removeAll(columns.keySet());
178+
for (String field : fields) {
179+
columns.put(field, new RediSearchColumnHandle(field, VarcharType.VARCHAR, false));
180+
}
181+
}
170182
RediSearchTableHandle tableHandle = new RediSearchTableHandle(RediSearchTableHandle.Type.SEARCH,
171183
schemaTableName);
172-
return new RediSearchTable(tableHandle, columnHandles.build());
184+
return new RediSearchTable(tableHandle, columns.values());
173185
}
174186

175-
private IndexInfo getIndexInfo(String schemaName, String tableName) throws TableNotFoundException {
176-
if (connection.sync().list().contains(tableName)) {
177-
return RedisModulesUtils.indexInfo(connection.sync().indexInfo(tableName));
187+
private Optional<IndexInfo> indexInfo(String index) {
188+
try {
189+
List<Object> indexInfoList = connection.sync().indexInfo(index);
190+
if (indexInfoList != null) {
191+
return Optional.of(RedisModulesUtils.indexInfo(indexInfoList));
192+
}
193+
} catch (Exception e) {
194+
// Ignore as index might not exist
178195
}
179-
throw new TableNotFoundException(new SchemaTableName(schemaName, tableName),
180-
format("Index '%s' not found", tableName), null);
196+
return Optional.empty();
181197
}
182198

183199
private RediSearchColumnHandle buildColumnHandle(Field field) {

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.redis.trino;
22

3-
import com.google.common.collect.ImmutableList;
3+
import static com.google.common.base.MoreObjects.toStringHelper;
44

5+
import java.util.Collection;
56
import java.util.List;
67

7-
import static com.google.common.base.MoreObjects.toStringHelper;
8+
import com.google.common.collect.ImmutableList;
89

910
public class RediSearchTable {
1011

1112
private final RediSearchTableHandle tableHandle;
1213
private final List<RediSearchColumnHandle> columns;
1314

14-
public RediSearchTable(RediSearchTableHandle tableHandle, List<RediSearchColumnHandle> columns) {
15+
public RediSearchTable(RediSearchTableHandle tableHandle, Collection<RediSearchColumnHandle> columns) {
1516
this.tableHandle = tableHandle;
1617
this.columns = ImmutableList.copyOf(columns);
1718
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
import static java.util.Objects.requireNonNull;
1010
import static org.assertj.core.api.Assertions.assertThat;
1111

12+
import java.io.IOException;
13+
1214
import org.testng.SkipException;
1315
import org.testng.annotations.AfterClass;
1416
import org.testng.annotations.Test;
1517

1618
import com.google.common.base.Throwables;
19+
import com.redis.lettucemod.test.Beers;
1720

1821
import io.airlift.log.Logger;
1922
import io.trino.spi.TrinoException;
@@ -100,6 +103,12 @@ protected QueryRunner createQueryRunner() throws Exception {
100103
return RediSearchQueryRunner.createRediSearchQueryRunner(redisearch, CUSTOMER, NATION, ORDERS, REGION);
101104
}
102105

106+
@Test
107+
public void testNonIndexFields() throws IOException {
108+
Beers.populateIndex(redisearch.getTestContext().getConnection());
109+
getQueryRunner().execute("select id,last_mod from beers");
110+
}
111+
103112
@Test
104113
public void testHaving() {
105114
throw new SkipException("Not supported by RediSearch connector");

0 commit comments

Comments
 (0)