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
|
#### 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
|
||||||
|
15
src/dbx.c
15
src/dbx.c
@ -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, ®ex, setName, vWhere) > 0) {
|
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
|
// 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, ®ex, vSelect, NULL, intoKey, top);
|
n += processRecords(ctx, rep, ®ex, 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, ®ex, vSelect, vWhere, intoKey, &top);
|
||||||
|
|
||||||
n += processRecords(ctx, rkeys, ®ex, 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user