add top clause
This commit is contained in:
parent
730886651a
commit
c585348adb
49
README.md
49
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
|
||||
|
15
src/dbx.c
15
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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user