Skip to content

Commit 6270717

Browse files
author
Julien Ruaux
committed
fix: IN operator did not work for tags
1 parent dfcfb53 commit 6270717

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/main/java/com/redis/trino/RediSearchQueryBuilder.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.redis.lettucemod.search.Reducers.Sum;
5656
import com.redis.lettucemod.search.querybuilder.Node;
5757
import com.redis.lettucemod.search.querybuilder.QueryBuilder;
58+
import com.redis.lettucemod.search.querybuilder.QueryNode;
5859
import com.redis.lettucemod.search.querybuilder.Value;
5960
import com.redis.lettucemod.search.querybuilder.Values;
6061
import com.redis.lettucemod.util.RedisModulesUtils;
@@ -151,13 +152,25 @@ private Optional<Node> buildPredicate(RediSearchColumnHandle column, Domain doma
151152
}
152153
}
153154
}
155+
singleValues(column, singleValues).ifPresent(disjuncts::add);
156+
return Optional.of(QueryBuilder.union(disjuncts.toArray(Node[]::new)));
157+
}
158+
159+
private Optional<QueryNode> singleValues(RediSearchColumnHandle column, Set<Object> singleValues) {
160+
if (singleValues.isEmpty()) {
161+
return Optional.empty();
162+
}
154163
if (singleValues.size() == 1) {
155-
disjuncts.add(QueryBuilder.intersect(columnName, value(Iterables.getOnlyElement(singleValues), column)));
156-
} else if (singleValues.size() > 1) {
157-
disjuncts.add(QueryBuilder.union(columnName,
158-
singleValues.stream().map(v -> value(v, column)).toArray(Value[]::new)));
164+
return Optional.of(
165+
QueryBuilder.intersect(column.getName(), value(Iterables.getOnlyElement(singleValues), column)));
159166
}
160-
return Optional.of(QueryBuilder.union(disjuncts.toArray(Node[]::new)));
167+
if (column.getType() instanceof VarcharType && column.getFieldType() == Field.Type.TAG) {
168+
// Takes care of IN: col IN ('value1', 'value2', ...)
169+
return Optional
170+
.of(QueryBuilder.intersect(column.getName(), Values.tags(singleValues.toArray(String[]::new))));
171+
}
172+
Value[] values = singleValues.stream().map(v -> value(v, column)).toArray(Value[]::new);
173+
return Optional.of(QueryBuilder.union(column.getName(), values));
161174
}
162175

163176
private Value value(Object trinoNativeValue, RediSearchColumnHandle column) {

src/test/java/com/redis/trino/TestRediSearchConnectorSmokeTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,14 @@ public void testLikePredicate() {
191191
assertQuery("SELECT name, regionkey FROM nation WHERE name LIKE 'EGY%'");
192192
}
193193

194+
@Test
195+
public void testInPredicate() {
196+
assertQuery("SELECT name, regionkey FROM nation WHERE name in ('EGYPT', 'FRANCE')");
197+
}
198+
199+
@Test
200+
public void testInPredicateNumeric() {
201+
assertQuery("SELECT name, regionkey FROM nation WHERE regionKey in (1, 2, 3)");
202+
}
203+
194204
}

0 commit comments

Comments
 (0)