diff --git a/README.md b/README.md index 3eb6b28..0827a93 100644 --- a/README.md +++ b/README.md @@ -136,10 +136,51 @@ Your could specify =, >, <, >=, <=, <>, != or like conditions in where clause. N #### Order Clause in Select Statement Ordering can be ascending or descending. All sortings are alpha-sort. ```sql -127.0.0.1:6379> dbx select * from phonebook order by pos asc -... -127.0.0.1:6379> dbx select * from phonebook order by pos desc -... +127.0.0.1:6379> dbx select name, pos from phonebook order by pos asc +1) 1) name + 2) "Betty Joan" + 3) pos + 4) "1" +2) 1) name + 2) "Bloody Mary" + 3) pos + 4) "2" +3) 1) name + 2) "Peter Nelson" + 3) pos + 4) "3" +4) 1) name + 2) "Mattias Swensson" + 3) pos + 4) "4" +127.0.0.1:6379> dbx select name from phonebook order by pos desc +1) 1) name + 2) "Mattias Swensson" +2) 1) name + 2) "Peter Nelson" +3) 1) name + 2) "Bloody Mary" +4) 1) name + 2) "Betty Joan" +``` + +#### Top Clause in Select Statement +```sql +127.0.0.1:6379> dbx select top 3 name, tel from phonebook order by pos desc +1) 1) name + 2) "Mattias Swensson" + 3) tel + 4) "1-888-3333-1412" +2) 1) name + 2) "Peter Nelson" + 3) tel + 4) "1-456-1246-3421" +3) 1) name + 2) "Bloody Mary" + 3) tel + 4) "1-666-1234-9812" +127.0.0.1:6379> dbx select top 0 * from phonebook +(empty list or set) ``` #### Into Clause in Select Statement diff --git a/src/dbx.c b/src/dbx.c index 16d40a4..b8ae798 100644 --- a/src/dbx.c +++ b/src/dbx.c @@ -220,7 +220,7 @@ Vector* splitWhereString(char *s) { return v; } -size_t processRecords(RedisModuleCtx *ctx, RedisModuleCallReply *keys, regex_t *r, Vector *vSelect, Vector *vWhere, char *intoKey, long top) { +size_t processRecords(RedisModuleCtx *ctx, RedisModuleCallReply *keys, regex_t *r, Vector *vSelect, Vector *vWhere, char *intoKey, long *top) { size_t nKeys = RedisModule_CallReplyLength(keys); size_t affected = 0; for (size_t i = 0; i < nKeys; i++) { @@ -234,11 +234,11 @@ size_t processRecords(RedisModuleCtx *ctx, RedisModuleCallReply *keys, regex_t * else showRecord(ctx, key, vSelect); affected++; - top--; - printf("%zu\n", affected); + (*top)--; } } RedisModule_FreeString(ctx, key); + if (*top == 0) return affected; } return affected; } @@ -456,6 +456,7 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { RedisModuleCallReply *rep; if (buildSetByPattern(ctx, ®ex, setName, vWhere) > 0) { + size_t n = 0; // Sort the fields under the key and send the resulting array to processRecords module char *field; Vector_Get(vOrder, 0, &field); @@ -468,7 +469,8 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { sprintf(stmt, "*->%s", field); rep = RedisModule_Call(ctx, "SORT", "cccc", setName, "by", stmt, "alpha"); } - size_t n = processRecords(ctx, rep, ®ex, vSelect, NULL, intoKey, top); + n += processRecords(ctx, rep, ®ex, vSelect, NULL, intoKey, &top); + RedisModule_FreeCallReply(rep); // set number of output @@ -493,10 +495,11 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { /* Filter by pattern matching. */ RedisModuleCallReply *rkeys = RedisModule_CallReplyArrayElement(rep, 1); + n += processRecords(ctx, rkeys, ®ex, vSelect, vWhere, intoKey, &top); - n += processRecords(ctx, rkeys, ®ex, vSelect, vWhere, intoKey, top); - + RedisModule_FreeCallReply(rkeys); RedisModule_FreeCallReply(rep); + if (top == 0) break; } while (lcursor); RedisModule_ReplySetArrayLength(ctx, n);