summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2020-04-02 13:37:35 +0200
committerantirez <antirez@gmail.com>2020-04-02 13:37:35 +0200
commit3f96e1623d5270714dc94c75ca8d5daab336912c (patch)
tree7d10a90270b2944b1e0db00b5fd8c79ee76d86db
parent88e66ecf946f720db76b06dfb1a27834d16b7d61 (diff)
downloadredis-3f96e1623d5270714dc94c75ca8d5daab336912c.tar.gz
LCS: MINMATCHLEN and WITHMATCHLEN options.
-rw-r--r--src/t_string.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/t_string.c b/src/t_string.c
index b715e144a..6b30c9751 100644
--- a/src/t_string.c
+++ b/src/t_string.c
@@ -482,11 +482,13 @@ void strlenCommand(client *c) {
/* LCS -- Longest common subsequence.
*
- * LCS [IDX] [STOREIDX <key>] STRINGS <string> <string> | KEYS <keya> <keyb> */
+ * LCS [IDX] [STOREIDX <key>] [MINMATCHLEN <len>]
+ * STRINGS <string> <string> | KEYS <keya> <keyb> */
void lcsCommand(client *c) {
uint32_t i, j;
+ long long minmatchlen = 0;
sds a = NULL, b = NULL;
- int getlen = 0, getidx = 0;
+ int getlen = 0, getidx = 0, withmatchlen = 0;
robj *idxkey = NULL; /* STOREIDX will set this and getidx to 1. */
robj *obja = NULL, *objb = NULL;
@@ -498,10 +500,17 @@ void lcsCommand(client *c) {
getidx = 1;
} else if (!strcasecmp(opt,"LEN")) {
getlen = 1;
+ } else if (!strcasecmp(opt,"WITHMATCHLEN")) {
+ withmatchlen = 1;
} else if (!strcasecmp(opt,"STOREIDX") && moreargs) {
getidx = 1;
idxkey = c->argv[j+1];
j++;
+ } else if (!strcasecmp(opt,"MINMATCHLEN") && moreargs) {
+ if (getLongLongFromObjectOrReply(c,c->argv[j+1],&minmatchlen,NULL)
+ != C_OK) return;
+ if (minmatchlen < 0) minmatchlen = 0;
+ j++;
} else if (!strcasecmp(opt,"STRINGS")) {
if (moreargs != 2) {
addReplyError(c,"LCS requires exactly two strings");
@@ -637,18 +646,22 @@ void lcsCommand(client *c) {
}
/* Emit the current range if needed. */
+ uint32_t match_len = arange_end - arange_start + 1;
if (emit_range) {
- if (arraylenptr) {
- addReplyArrayLen(c,2);
- addReplyArrayLen(c,2);
- addReplyLongLong(c,arange_start);
- addReplyLongLong(c,arange_end);
- addReplyArrayLen(c,2);
- addReplyLongLong(c,brange_start);
- addReplyLongLong(c,brange_end);
+ if (minmatchlen == 0 || match_len >= minmatchlen) {
+ if (arraylenptr) {
+ addReplyArrayLen(c,2+withmatchlen);
+ addReplyArrayLen(c,2);
+ addReplyLongLong(c,arange_start);
+ addReplyLongLong(c,arange_end);
+ addReplyArrayLen(c,2);
+ addReplyLongLong(c,brange_start);
+ addReplyLongLong(c,brange_end);
+ if (withmatchlen) addReplyLongLong(c,match_len);
+ arraylen++;
+ }
}
arange_start = alen; /* Restart at the next match. */
- arraylen++;
}
}