void SpellCheck_SendReplyOnTerm(RedisModuleCtx *ctx, char *term, size_t len, RS_Suggestions *s, uint64_t totalDocNumber) { #define TERM "TERM" RedisModule_ReplyWithArray(ctx, 3); RedisModule_ReplyWithStringBuffer(ctx, TERM, strlen(TERM)); RedisModule_ReplyWithStringBuffer(ctx, term, len); RS_Suggestion **suggestions = spellCheck_GetSuggestions(s); for (int i = 0; i < array_len(suggestions); ++i) { if (suggestions[i]->score == -1) { suggestions[i]->score = 0; } else { if (totalDocNumber > 0) { suggestions[i]->score = (suggestions[i]->score) / totalDocNumber; } } } qsort(suggestions, array_len(suggestions), sizeof(RS_Suggestion *), RS_SuggestionCompare); if (array_len(suggestions) == 0) { // no results found, we return an empty array RedisModule_ReplyWithArray(ctx, 0); } else { RedisModule_ReplyWithArray(ctx, array_len(suggestions)); for (int i = 0; i < array_len(suggestions); ++i) { RedisModule_ReplyWithArray(ctx, 2); RedisModule_ReplyWithDouble(ctx, suggestions[i]->score); RedisModule_ReplyWithStringBuffer(ctx, suggestions[i]->suggestion, suggestions[i]->len); } } array_free_ex(suggestions, RS_SuggestionFree(*(RS_Suggestion **)ptr)); }
/* HELLO.ZSUMRANGE key startscore endscore * Return the sum of all the scores elements between startscore and endscore. * * The computation is performed two times, one time from start to end and * another time backward. The two scores, returned as a two element array, * should match.*/ int HelloZsumRange_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) { double score_start, score_end; if (argc != 4) return RedisModule_WrongArity(ctx); if (RedisModule_StringToDouble(argv[2],&score_start) != REDISMODULE_OK || RedisModule_StringToDouble(argv[3],&score_end) != REDISMODULE_OK) { return RedisModule_ReplyWithError(ctx,"ERR invalid range"); } RedisModuleKey *key = RedisModule_OpenKey(ctx,argv[1], REDISMODULE_READ|REDISMODULE_WRITE); if (RedisModule_KeyType(key) != REDISMODULE_KEYTYPE_ZSET) { return RedisModule_ReplyWithError(ctx,REDISMODULE_ERRORMSG_WRONGTYPE); } double scoresum_a = 0; double scoresum_b = 0; RedisModule_ZsetFirstInScoreRange(key,score_start,score_end,0,0); while(!RedisModule_ZsetRangeEndReached(key)) { double score; RedisModuleString *ele = RedisModule_ZsetRangeCurrentElement(key,&score); RedisModule_FreeString(ctx,ele); scoresum_a += score; RedisModule_ZsetRangeNext(key); } RedisModule_ZsetRangeStop(key); RedisModule_ZsetLastInScoreRange(key,score_start,score_end,0,0); while(!RedisModule_ZsetRangeEndReached(key)) { double score; RedisModuleString *ele = RedisModule_ZsetRangeCurrentElement(key,&score); RedisModule_FreeString(ctx,ele); scoresum_b += score; RedisModule_ZsetRangePrev(key); } RedisModule_ZsetRangeStop(key); RedisModule_CloseKey(key); RedisModule_ReplyWithArray(ctx,2); RedisModule_ReplyWithDouble(ctx,scoresum_a); RedisModule_ReplyWithDouble(ctx,scoresum_b); return REDISMODULE_OK; }