null+****@clear*****
null+****@clear*****
2010年 8月 26日 (木) 17:00:17 JST
Daijiro MORI 2010-08-26 08:00:17 +0000 (Thu, 26 Aug 2010) New Revision: 1ee671505f42578e24f3c930fdf0218520db7743 Log: Added suggest_sub(). Modified files: modules/suggest/suggest.c Modified: modules/suggest/suggest.c (+56 -0) =================================================================== --- modules/suggest/suggest.c 2010-08-26 06:34:30 +0000 (994af46) +++ modules/suggest/suggest.c 2010-08-26 08:00:17 +0000 (aa34bdc) @@ -280,6 +280,62 @@ func_suggest_preparer(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *us return obj; } +static void +suggest_sub(grn_ctx *ctx, grn_obj *table, grn_obj *query, grn_obj *res, int query_type) +{ + grn_id id = grn_table_get(ctx, table, GRN_TEXT_VALUE(query), GRN_TEXT_LEN(query)); + if (id) { + grn_ii_cursor *c; + grn_obj *co = grn_obj_column(ctx, table, CONST_STR_LEN("co")); + grn_obj *pairs = grn_ctx_at(ctx, grn_obj_get_range(ctx, co)); + grn_obj *items_freq = grn_obj_column(ctx, table, CONST_STR_LEN("freq")); + grn_obj *pairs_freq, *pairs_post = grn_obj_column(ctx, pairs, CONST_STR_LEN("post")); + switch (query_type) { + case 0 : + pairs_freq = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0")); + break; + case 1 : + pairs_freq = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1")); + break; + case 2 : + pairs_freq = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2")); + break; + default : + return; + } + if ((c = grn_ii_cursor_open(ctx, (grn_ii *)co, id, GRN_ID_NIL, GRN_ID_MAX, + ((grn_ii *)co)->n_elements - 1, 0))) { + grn_ii_posting *p; + grn_obj post, pair_freq, item_freq; + GRN_RECORD_INIT(&post, 0, grn_obj_id(ctx, table)); + GRN_INT32_INIT(&pair_freq, 0); + GRN_INT32_INIT(&item_freq, 0); + while ((p = grn_ii_cursor_next(ctx, c))) { + grn_id post_id; + GRN_BULK_REWIND(&post); + GRN_BULK_REWIND(&pair_freq); + GRN_BULK_REWIND(&item_freq); + grn_obj_get_value(ctx, pairs_post, p->rid, &post); + grn_obj_get_value(ctx, pairs_freq, p->rid, &pair_freq); + post_id = GRN_RECORD_VALUE(&post); + grn_obj_get_value(ctx, items_freq, post_id, &item_freq); + if (GRN_INT32_VALUE(&pair_freq)) { + grn_rset_recinfo *ri; + uint32_t score = GRN_INT32_VALUE(&pair_freq) * 1000 / GRN_INT32_VALUE(&item_freq); + if (grn_hash_add(ctx, (grn_hash *)res, + &post_id, sizeof(grn_id), (void **)&ri, NULL)) { + ri->score += score; + } + } + } + GRN_OBJ_FIN(ctx, &post); + GRN_OBJ_FIN(ctx, &pair_freq); + GRN_OBJ_FIN(ctx, &item_freq); + grn_ii_cursor_close(ctx, c); + } + } +} + grn_rc grn_module_init_suggest(grn_ctx *ctx) {