mirror of https://github.com/redis/redis.git
				
				
				
			LCS -> STRALGO LCS.
STRALGO should be a container for mostly read-only string algorithms in Redis. The algorithms should have two main characteristics: 1. They should be non trivial to compute, and often not part of programming language standard libraries. 2. They should be fast enough that it is a good idea to have optimized C implementations. Next thing I would love to see? A small strings compression algorithm.
This commit is contained in:
		
							parent
							
								
									57a0c9c98d
								
							
						
					
					
						commit
						8a7f255cd0
					
				|  | @ -1006,7 +1006,7 @@ struct redisCommand redisCommandTable[] = { | |||
|      "admin no-script no-slowlog ok-loading ok-stale", | ||||
|      0,NULL,0,0,0,0,0,0}, | ||||
| 
 | ||||
|     {"lcs",lcsCommand,-4, | ||||
|     {"stralgo",stralgoCommand,-2, | ||||
|      "write use-memory @string", | ||||
|      0,lcsGetKeys,0,0,0,0,0,0} | ||||
| }; | ||||
|  |  | |||
|  | @ -2389,7 +2389,7 @@ void xdelCommand(client *c); | |||
| void xtrimCommand(client *c); | ||||
| void lolwutCommand(client *c); | ||||
| void aclCommand(client *c); | ||||
| void lcsCommand(client *c); | ||||
| void stralgoCommand(client *c); | ||||
| 
 | ||||
| #if defined(__GNUC__) | ||||
| void *calloc(size_t count, size_t size) __attribute__ ((deprecated)); | ||||
|  |  | |||
|  | @ -480,18 +480,31 @@ void strlenCommand(client *c) { | |||
|     addReplyLongLong(c,stringObjectLen(o)); | ||||
| } | ||||
| 
 | ||||
| /* LCS -- Longest common subsequence.
 | ||||
| 
 | ||||
| /* STRALGO -- Implement complex algorithms on strings.
 | ||||
|  * | ||||
|  * LCS [IDX] [MINMATCHLEN <len>] | ||||
|  *     STRINGS <string> <string> | KEYS <keya> <keyb> */ | ||||
| void lcsCommand(client *c) { | ||||
|  * STRALGO <algorithm> ... arguments ... */ | ||||
| void stralgoLCS(client *c);     /* This implements the LCS algorithm. */ | ||||
| void stralgoCommand(client *c) { | ||||
|     /* Select the algorithm. */ | ||||
|     if (!strcasecmp(c->argv[1]->ptr,"lcs")) { | ||||
|         stralgoLCS(c); | ||||
|     } else { | ||||
|         addReply(c,shared.syntaxerr); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /* STRALGO <algo> [IDX] [MINMATCHLEN <len>] [WITHMATCHLEN]
 | ||||
|  *     STRINGS <string> <string> | KEYS <keya> <keyb> | ||||
|  */ | ||||
| void stralgoLCS(client *c) { | ||||
|     uint32_t i, j; | ||||
|     long long minmatchlen = 0; | ||||
|     sds a = NULL, b = NULL; | ||||
|     int getlen = 0, getidx = 0, withmatchlen = 0; | ||||
|     robj *obja = NULL, *objb = NULL; | ||||
| 
 | ||||
|     for (j = 1; j < (uint32_t)c->argc; j++) { | ||||
|     for (j = 2; j < (uint32_t)c->argc; j++) { | ||||
|         char *opt = c->argv[j]->ptr; | ||||
|         int moreargs = (c->argc-1) - j; | ||||
| 
 | ||||
|  |  | |||
|  | @ -424,29 +424,29 @@ start_server {tags {"string"}} { | |||
|     set rna2 {ATTAAAGGTTTATACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT} | ||||
|     set rnalcs {ACCTTCCCAGGTAACAAACCAACCAACTTTCGATCTCTTGTAGATCTGTTCTCTAAACGAACTTTAAAATCTGTGTGGCTGTCACTCGGCTGCATGCTTAGTGCACTCACGCAGTATAATTAATAACTAATTACTGTCGTTGACAGGACACGAGTAACTCGTCTATCTTCTGCAGGCTGCTTACGGTTTCGTCCGTGTTGCAGCCGATCATCAGCACATCTAGGTTT} | ||||
| 
 | ||||
|     test {LCS string output with STRINGS option} { | ||||
|         r LCS STRINGS $rna1 $rna2 | ||||
|     test {STRALGO LCS string output with STRINGS option} { | ||||
|         r STRALGO LCS STRINGS $rna1 $rna2 | ||||
|     } $rnalcs | ||||
| 
 | ||||
|     test {LCS len} { | ||||
|         r LCS LEN STRINGS $rna1 $rna2 | ||||
|     test {STRALGO LCS len} { | ||||
|         r STRALGO LCS LEN STRINGS $rna1 $rna2 | ||||
|     } [string length $rnalcs] | ||||
| 
 | ||||
|     test {LCS with KEYS option} { | ||||
|         r set virus1 $rna1 | ||||
|         r set virus2 $rna2 | ||||
|         r LCS KEYS virus1 virus2 | ||||
|         r STRALGO LCS KEYS virus1 virus2 | ||||
|     } $rnalcs | ||||
| 
 | ||||
|     test {LCS indexes} { | ||||
|         dict get [r LCS IDX KEYS virus1 virus2] matches | ||||
|         dict get [r STRALGO LCS IDX KEYS virus1 virus2] matches | ||||
|     } {{{238 238} {239 239}} {{236 236} {238 238}} {{229 230} {236 237}} {{224 224} {235 235}} {{1 222} {13 234}}} | ||||
| 
 | ||||
|     test {LCS indexes with match len} { | ||||
|         dict get [r LCS IDX KEYS virus1 virus2 WITHMATCHLEN] matches | ||||
|         dict get [r STRALGO LCS IDX KEYS virus1 virus2 WITHMATCHLEN] matches | ||||
|     } {{{238 238} {239 239} 1} {{236 236} {238 238} 1} {{229 230} {236 237} 2} {{224 224} {235 235} 1} {{1 222} {13 234} 222}} | ||||
| 
 | ||||
|     test {LCS indexes with match len and minimum match len} { | ||||
|         dict get [r LCS IDX KEYS virus1 virus2 WITHMATCHLEN MINMATCHLEN 5] matches | ||||
|         dict get [r STRALGO LCS IDX KEYS virus1 virus2 WITHMATCHLEN MINMATCHLEN 5] matches | ||||
|     } {{{1 222} {13 234} 222}} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue