add top clause

This commit is contained in:
Kenneth Cheng 2020-05-02 17:36:09 +08:00
parent 730886651a
commit c585348adb
2 changed files with 54 additions and 10 deletions

View File

@ -136,10 +136,51 @@ Your could specify =, >, <, >=, <=, <>, != or like conditions in where clause. N
#### Order Clause in Select Statement #### Order Clause in Select Statement
Ordering can be ascending or descending. All sortings are alpha-sort. Ordering can be ascending or descending. All sortings are alpha-sort.
```sql ```sql
127.0.0.1:6379> dbx select * from phonebook order by pos asc 127.0.0.1:6379> dbx select name, pos from phonebook order by pos asc
... 1) 1) name
127.0.0.1:6379> dbx select * from phonebook order by pos desc 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 #### Into Clause in Select Statement

View File

@ -220,7 +220,7 @@ Vector* splitWhereString(char *s) {
return v; 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 nKeys = RedisModule_CallReplyLength(keys);
size_t affected = 0; size_t affected = 0;
for (size_t i = 0; i < nKeys; i++) { for (size_t i = 0; i < nKeys; i++) {
@ -234,11 +234,11 @@ size_t processRecords(RedisModuleCtx *ctx, RedisModuleCallReply *keys, regex_t *
else else
showRecord(ctx, key, vSelect); showRecord(ctx, key, vSelect);
affected++; affected++;
top--; (*top)--;
printf("%zu\n", affected);
} }
} }
RedisModule_FreeString(ctx, key); RedisModule_FreeString(ctx, key);
if (*top == 0) return affected;
} }
return affected; return affected;
} }
@ -456,6 +456,7 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModuleCallReply *rep; RedisModuleCallReply *rep;
if (buildSetByPattern(ctx, &regex, setName, vWhere) > 0) { if (buildSetByPattern(ctx, &regex, setName, vWhere) > 0) {
size_t n = 0;
// Sort the fields under the key and send the resulting array to processRecords module // Sort the fields under the key and send the resulting array to processRecords module
char *field; char *field;
Vector_Get(vOrder, 0, &field); Vector_Get(vOrder, 0, &field);
@ -468,7 +469,8 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
sprintf(stmt, "*->%s", field); sprintf(stmt, "*->%s", field);
rep = RedisModule_Call(ctx, "SORT", "cccc", setName, "by", stmt, "alpha"); rep = RedisModule_Call(ctx, "SORT", "cccc", setName, "by", stmt, "alpha");
} }
size_t n = processRecords(ctx, rep, &regex, vSelect, NULL, intoKey, top); n += processRecords(ctx, rep, &regex, vSelect, NULL, intoKey, &top);
RedisModule_FreeCallReply(rep); RedisModule_FreeCallReply(rep);
// set number of output // set number of output
@ -493,10 +495,11 @@ int SelectCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
/* Filter by pattern matching. */ /* Filter by pattern matching. */
RedisModuleCallReply *rkeys = RedisModule_CallReplyArrayElement(rep, 1); RedisModuleCallReply *rkeys = RedisModule_CallReplyArrayElement(rep, 1);
n += processRecords(ctx, rkeys, &regex, vSelect, vWhere, intoKey, &top);
n += processRecords(ctx, rkeys, &regex, vSelect, vWhere, intoKey, top); RedisModule_FreeCallReply(rkeys);
RedisModule_FreeCallReply(rep); RedisModule_FreeCallReply(rep);
if (top == 0) break;
} while (lcursor); } while (lcursor);
RedisModule_ReplySetArrayLength(ctx, n); RedisModule_ReplySetArrayLength(ctx, n);