Skip to content

Commit fe7d92c

Browse files
committed
RediSearch commands implementation (continued) and tests
1 parent 7cc507c commit fe7d92c

21 files changed

+2610
-64
lines changed

pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@
6666
<artifactId>gson</artifactId>
6767
<version>2.8.8</version>
6868
</dependency>
69+
<dependency>
70+
<groupId>org.json</groupId>
71+
<artifactId>json</artifactId>
72+
<version>20210307</version>
73+
</dependency>
6974

7075
<dependency>
7176
<groupId>junit</groupId>

src/main/java/redis/clients/jedis/BuilderFactory.java

+34
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,19 @@ public String toString() {
6161
}
6262
};
6363

64+
public static final Builder<Map<String, Object>> ENCODED_OBJECT_MAP_FROM_PLAIN_LIST = new Builder<Map<String, Object>>() {
65+
@Override
66+
public Map<String, Object> build(Object data) {
67+
final List list = (List) data;
68+
final Map<String, Object> map = new HashMap<>(list.size() / 2, 1);
69+
final Iterator iterator = list.iterator();
70+
while (iterator.hasNext()) {
71+
map.put(STRING.build(iterator.next()), ENCODED_OBJECT.build(iterator.next()));
72+
}
73+
return map;
74+
}
75+
};
76+
6477
public static final Builder<Long> LONG = new Builder<Long>() {
6578
@Override
6679
public Long build(Object data) {
@@ -1222,6 +1235,27 @@ public LCSMatchResult build(Object data) {
12221235
}
12231236
};
12241237

1238+
public static final Builder<Map<String, String>> STRING_MAP_FROM_PAIR_ARRAY = new Builder<Map<String, String>>() {
1239+
@Override
1240+
@SuppressWarnings("unchecked")
1241+
public Map<String, String> build(Object data) {
1242+
final List<Object> list = (List<Object>) data;
1243+
final Map<String, String> map = new HashMap<>(list.size());
1244+
for (Object object : list) {
1245+
final List<byte[]> flat = (List<byte[]>) object;
1246+
map.put(SafeEncoder.encode(flat.get(0)), flat.get(1) != null ? SafeEncoder.encode(flat.get(1)) : null);
1247+
}
1248+
1249+
return map;
1250+
}
1251+
1252+
@Override
1253+
public String toString() {
1254+
return "Map<String, String>";
1255+
}
1256+
1257+
};
1258+
12251259
public static final Builder<Class<?>> JSON_TYPE = new Builder<Class<?>>() {
12261260
@Override
12271261
public Class<?> build(Object data) {

src/main/java/redis/clients/jedis/CommandArguments.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public CommandArguments addObjects(Object... args) {
5252
return this;
5353
}
5454

55-
public CommandArguments addObjects(Collection<Object> args) {
55+
public CommandArguments addObjects(Collection args) {
5656
for (Object arg : args) {
5757
add(arg);
5858
}

src/main/java/redis/clients/jedis/RedisClusterCommandObjects.java

+100-9
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,21 @@
22

33
import static redis.clients.jedis.Protocol.Command.KEYS;
44
import static redis.clients.jedis.Protocol.Command.SCAN;
5-
import static redis.clients.jedis.Protocol.Command.WAIT;
65
import static redis.clients.jedis.Protocol.Keyword.TYPE;
76

7+
import java.util.List;
8+
import java.util.Map;
89
import java.util.Set;
10+
911
import redis.clients.jedis.commands.ProtocolCommand;
1012
import redis.clients.jedis.params.ScanParams;
1113
import redis.clients.jedis.resps.ScanResult;
1214
import redis.clients.jedis.search.IndexOptions;
1315
import redis.clients.jedis.search.Query;
1416
import redis.clients.jedis.search.Schema;
15-
import redis.clients.jedis.search.SearchProtocol;
1617
import redis.clients.jedis.search.SearchResult;
18+
import redis.clients.jedis.search.aggr.AggregationBuilder;
19+
import redis.clients.jedis.search.aggr.AggregationResult;
1720
import redis.clients.jedis.util.JedisClusterHashTag;
1821

1922
public class RedisClusterCommandObjects extends RedisCommandObjects {
@@ -25,6 +28,11 @@ protected ClusterCommandArguments commandArguments(ProtocolCommand command) {
2528

2629
private static final String CLUSTER_UNSUPPORTED_MESSAGE = "Not supported in cluster mode.";
2730

31+
@Override
32+
public CommandObject<Long> dbSize() {
33+
throw new UnsupportedOperationException(CLUSTER_UNSUPPORTED_MESSAGE);
34+
}
35+
2836
private static final String KEYS_PATTERN_MESSAGE = "Cluster mode only supports KEYS command"
2937
+ " with pattern containing hash-tag ( curly-brackets enclosed string )";
3038

@@ -105,23 +113,106 @@ private <T> CommandObject<T> processSearchCommand(String indexName, CommandObjec
105113
return command;
106114
}
107115

108-
private <T> CommandObject<T> processSearchCommand(byte[] indexName, CommandObject<T> command) {
116+
@Override
117+
public final CommandObject<String> ftCreate(String indexName, IndexOptions indexOptions, Schema schema) {
118+
return processSearchCommand(indexName, super.ftCreate(indexName, indexOptions, schema));
119+
}
120+
121+
@Override
122+
public final CommandObject<String> ftAlter(String indexName, Schema schema) {
123+
return processSearchCommand(indexName, super.ftAlter(indexName, schema));
124+
}
125+
126+
@Override
127+
public final CommandObject<SearchResult> ftSearch(String indexName, Query query) {
128+
return processSearchCommand(indexName, super.ftSearch(indexName, query));
129+
}
130+
131+
@Override
132+
public final CommandObject<SearchResult> ftSearch(byte[] indexName, Query query) {
133+
CommandObject<SearchResult> command = super.ftSearch(indexName, query);
109134
if (searchLite) command.getArguments().processKey(indexName);
110135
return command;
111136
}
112137

113138
@Override
114-
public CommandObject<String> ftCreate(String indexName, IndexOptions indexOptions, Schema schema) {
115-
return processSearchCommand(indexName, super.ftCreate(indexName, indexOptions, schema));
139+
public CommandObject<String> ftExplain(String indexName, Query query) {
140+
return processSearchCommand(indexName, super.ftExplain(indexName, query));
116141
}
117142

118143
@Override
119-
public CommandObject<SearchResult> ftSearch(String indexName, Query query) {
120-
return processSearchCommand(indexName, super.ftSearch(indexName, query));
144+
public CommandObject<List<String>> ftExplainCLI(String indexName, Query query) {
145+
return processSearchCommand(indexName, super.ftExplainCLI(indexName, query));
121146
}
122147

123148
@Override
124-
public CommandObject<SearchResult> ftSearch(byte[] indexName, Query query) {
125-
return processSearchCommand(indexName, super.ftSearch(indexName, query));
149+
public CommandObject<AggregationResult> ftAggregate(String indexName, AggregationBuilder aggr) {
150+
return processSearchCommand(indexName, super.ftAggregate(indexName, aggr));
151+
}
152+
153+
@Override
154+
public CommandObject<AggregationResult> ftCursorRead(String indexName, long cursorId, int count) {
155+
return processSearchCommand(indexName, super.ftCursorRead(indexName, cursorId, count));
156+
}
157+
158+
@Override
159+
public CommandObject<String> ftCursorDel(String indexName, long cursorId) {
160+
return processSearchCommand(indexName, super.ftCursorDel(indexName, cursorId));
161+
}
162+
163+
@Override
164+
public CommandObject<String> ftDropIndex(String indexName) {
165+
return processSearchCommand(indexName, super.ftDropIndex(indexName));
166+
}
167+
168+
@Override
169+
public CommandObject<String> ftDropIndexDD(String indexName) {
170+
return processSearchCommand(indexName, super.ftDropIndexDD(indexName));
171+
}
172+
173+
@Override
174+
public CommandObject<String> ftSynUpdate(String indexName, String synonymGroupId, String... terms) {
175+
return processSearchCommand(indexName, super.ftSynUpdate(indexName, synonymGroupId, terms));
176+
}
177+
178+
@Override
179+
public CommandObject<Map<String, List<Object>>> ftSynDump(String indexName) {
180+
return processSearchCommand(indexName, super.ftSynDump(indexName));
181+
}
182+
183+
@Override
184+
public CommandObject<Map<String, Object>> ftInfo(String indexName) {
185+
return processSearchCommand(indexName, super.ftInfo(indexName));
186+
}
187+
188+
@Override
189+
public CommandObject<String> ftAliasAdd(String aliasName, String indexName) {
190+
CommandObject<String> command = super.ftAliasAdd(aliasName, indexName);
191+
if (searchLite) command.getArguments().processKey(aliasName).processKey(indexName);
192+
return command;
193+
}
194+
195+
@Override
196+
public CommandObject<String> ftAliasUpdate(String aliasName, String indexName) {
197+
CommandObject<String> command = super.ftAliasUpdate(aliasName, indexName);
198+
if (searchLite) command.getArguments().processKey(aliasName).processKey(indexName);
199+
return command;
200+
}
201+
202+
@Override
203+
public CommandObject<String> ftAliasDel(String aliasName) {
204+
CommandObject<String> command = super.ftAliasDel(aliasName);
205+
if (searchLite) command.getArguments().processKey(aliasName);
206+
return command;
207+
}
208+
209+
@Override
210+
public CommandObject<Map<String, String>> ftConfigGet(String indexName, String option) {
211+
return processSearchCommand(indexName, super.ftConfigGet(indexName, option));
212+
}
213+
214+
@Override
215+
public CommandObject<String> ftConfigSet(String indexName, String option, String value) {
216+
return processSearchCommand(indexName, super.ftConfigSet(indexName, option, value));
126217
}
127218
}

src/main/java/redis/clients/jedis/RedisCommandObjects.java

+64-6
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ public final CommandObject<Long> renamenx(byte[] oldkey, byte[] newkey) {
258258
return new CommandObject<>(commandArguments(RENAMENX).key(oldkey).key(newkey), BuilderFactory.LONG);
259259
}
260260

261+
public CommandObject<Long> dbSize() {
262+
return new CommandObject<>(commandArguments(DBSIZE), BuilderFactory.LONG);
263+
}
264+
261265
public CommandObject<Set<String>> keys(String pattern) {
262266
CommandArguments args = commandArguments(Command.KEYS).key(pattern);
263267
return new CommandObject<>(args, BuilderFactory.STRING_SET);
@@ -2445,7 +2449,7 @@ public CommandObject<String> ftCreate(String indexName, IndexOptions indexOption
24452449
return new CommandObject<>(args, BuilderFactory.STRING);
24462450
}
24472451

2448-
public final CommandObject<String> ftAlter(String indexName, Schema schema) {
2452+
public CommandObject<String> ftAlter(String indexName, Schema schema) {
24492453
CommandArguments args = commandArguments(SearchCommand.ALTER).add(indexName)
24502454
.add(SearchKeyword.SCHEMA).add(SearchKeyword.ADD);
24512455
schema.fields.forEach(field -> field.addParams(args));
@@ -2462,28 +2466,82 @@ public CommandObject<SearchResult> ftSearch(byte[] indexName, Query query) {
24622466
new SearchResultBuilder(!query.getNoContent(), query.getWithScores(), query.getWithPayloads(), false));
24632467
}
24642468

2465-
public final CommandObject<AggregationResult> ftAggregate(String indexName, AggregationBuilder aggr) {
2469+
public CommandObject<String> ftExplain(String indexName, Query query) {
2470+
return new CommandObject<>(commandArguments(SearchCommand.EXPLAIN).add(indexName).addParams(query), BuilderFactory.STRING);
2471+
}
2472+
2473+
public CommandObject<List<String>> ftExplainCLI(String indexName, Query query) {
2474+
return new CommandObject<>(commandArguments(SearchCommand.EXPLAINCLI).add(indexName).addParams(query), BuilderFactory.STRING_LIST);
2475+
}
2476+
2477+
public CommandObject<AggregationResult> ftAggregate(String indexName, AggregationBuilder aggr) {
24662478
return new CommandObject<>(commandArguments(SearchCommand.AGGREGATE).add(indexName).addObjects(aggr.getArgs()),
24672479
!aggr.isWithCursor() ? BuilderFactory.SEARCH_AGGREGATION_RESULT : BuilderFactory.SEARCH_AGGREGATION_RESULT_WITH_CURSOR);
24682480
}
24692481

2470-
public final CommandObject<String> ftDropIndex(String indexName) {
2482+
public CommandObject<AggregationResult> ftCursorRead(String indexName, long cursorId, int count) {
2483+
return new CommandObject<>(commandArguments(SearchCommand.CURSOR).add(SearchKeyword.READ)
2484+
.add(indexName).add(cursorId).add(count), BuilderFactory.SEARCH_AGGREGATION_RESULT_WITH_CURSOR);
2485+
}
2486+
2487+
public CommandObject<String> ftCursorDel(String indexName, long cursorId) {
2488+
return new CommandObject<>(commandArguments(SearchCommand.CURSOR).add(SearchKeyword.DEL)
2489+
.add(indexName).add(cursorId), BuilderFactory.STRING);
2490+
}
2491+
2492+
public CommandObject<String> ftDropIndex(String indexName) {
24712493
return new CommandObject<>(commandArguments(SearchCommand.DROPINDEX).add(indexName), BuilderFactory.STRING);
24722494
}
24732495

2474-
public final CommandObject<String> ftDropIndexDD(String indexName) {
2496+
public CommandObject<String> ftDropIndexDD(String indexName) {
24752497
return new CommandObject<>(commandArguments(SearchCommand.DROPINDEX).add(indexName).add(SearchKeyword.DD), BuilderFactory.STRING);
24762498
}
24772499

2478-
public final CommandObject<String> ftSynUpdate(String indexName, String synonymGroupId, String... terms) {
2500+
public CommandObject<String> ftSynUpdate(String indexName, long synonymGroupId, String... terms) {
24792501
return new CommandObject<>(commandArguments(SearchCommand.SYNUPDATE).add(indexName)
24802502
.add(synonymGroupId).addObjects((Object[]) terms), BuilderFactory.STRING);
24812503
}
24822504

2483-
public final CommandObject<Map<String, List<Object>>> ftSynDump(String indexName) {
2505+
public CommandObject<String> ftSynUpdate(String indexName, String synonymGroupId, String... terms) {
2506+
return new CommandObject<>(commandArguments(SearchCommand.SYNUPDATE).add(indexName)
2507+
.add(synonymGroupId).addObjects((Object[]) terms), BuilderFactory.STRING);
2508+
}
2509+
2510+
public CommandObject<Map<String, List<Object>>> ftSynDump(String indexName) {
24842511
return new CommandObject<>(commandArguments(SearchCommand.SYNDUMP).add(indexName), BuilderFactory.SEARCH_SYNONYM_GROUPS);
24852512
}
24862513

2514+
public CommandObject<Map<String, Object>> ftInfo(String indexName) {
2515+
return new CommandObject<>(commandArguments(SearchCommand.INFO).add(indexName), BuilderFactory.ENCODED_OBJECT_MAP_FROM_PLAIN_LIST);
2516+
}
2517+
2518+
public CommandObject<String> ftAliasAdd(String aliasName, String indexName) {
2519+
return new CommandObject<>(commandArguments(SearchCommand.ALIASADD).add(aliasName).add(indexName), BuilderFactory.STRING);
2520+
}
2521+
2522+
public CommandObject<String> ftAliasUpdate(String aliasName, String indexName) {
2523+
return new CommandObject<>(commandArguments(SearchCommand.ALIASUPDATE).add(aliasName).add(indexName), BuilderFactory.STRING);
2524+
}
2525+
2526+
public CommandObject<String> ftAliasDel(String aliasName) {
2527+
return new CommandObject<>(commandArguments(SearchCommand.ALIASDEL).add(aliasName), BuilderFactory.STRING);
2528+
}
2529+
2530+
public final CommandObject<Map<String, String>> ftConfigGet(String option) {
2531+
return new CommandObject<>(commandArguments(SearchCommand.CONFIG).add(SearchKeyword.GET).add(option), BuilderFactory.STRING_MAP_FROM_PAIR_ARRAY);
2532+
}
2533+
2534+
public CommandObject<Map<String, String>> ftConfigGet(String indexName, String option) {
2535+
return ftConfigGet(option);
2536+
}
2537+
2538+
public final CommandObject<String> ftConfigSet(String option, String value) {
2539+
return new CommandObject<>(commandArguments(SearchCommand.CONFIG).add(SearchKeyword.SET).add(option).add(value), BuilderFactory.STRING);
2540+
}
2541+
2542+
public CommandObject<String> ftConfigSet(String indexName, String option, String value) {
2543+
return ftConfigSet(option, value);
2544+
}
24872545
// RediSearch commands
24882546

24892547
// RedisJSON commands

0 commit comments

Comments
 (0)