null+****@clear*****
null+****@clear*****
2012年 3月 9日 (金) 19:06:05 JST
Kouhei Sutou 2012-03-09 19:06:05 +0900 (Fri, 09 Mar 2012)
New Revision: a55a6f77d840ea10453ed2670bbcb011bcd5f7d3
Log:
suggest: pack learn related info to a struct
Modified files:
plugins/suggest/suggest.c
Modified: plugins/suggest/suggest.c (+87 -34)
===================================================================
--- plugins/suggest/suggest.c 2012-03-09 17:10:29 +0900 (643d4c9)
+++ plugins/suggest/suggest.c 2012-03-09 19:06:05 +0900 (8e9eab3)
@@ -37,6 +37,26 @@ typedef enum {
GRN_SUGGEST_SEARCH_AUTO
} grn_suggest_search_mode;
+typedef struct {
+ grn_obj *seqs;
+ grn_obj *seqs_events;
+ grn_obj *events;
+ grn_obj *events_item;
+ grn_obj *events_type;
+ grn_obj *events_time;
+ grn_obj *event_types;
+ grn_obj *items;
+ grn_obj *items_freq;
+ grn_obj *items_freq2;
+ grn_obj *items_last;
+ grn_obj *pairs;
+ grn_obj *pairs_pre;
+ grn_obj *pairs_post;
+ grn_obj *pairs_freq0;
+ grn_obj *pairs_freq1;
+ grn_obj *pairs_freq2;
+} grn_suggest_learn_ctx;
+
static int
grn_parse_suggest_types(const char *nptr, const char *end)
{
@@ -531,6 +551,38 @@ command_suggest(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
return NULL;
}
+static void
+learn_ctx_init(grn_ctx *ctx, grn_suggest_learn_ctx *learn_ctx,
+ grn_obj *seq, grn_obj *post_item, grn_obj *pairs)
+{
+ grn_id events_id, event_types_id;
+ grn_obj *seqs, *events, *items;
+
+ learn_ctx->seqs = seqs = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(seq));
+ learn_ctx->seqs_events = grn_obj_column(ctx, seqs, CONST_STR_LEN("events"));
+
+ events_id = grn_obj_get_range(ctx, learn_ctx->seqs_events);
+ learn_ctx->events = events = grn_ctx_at(ctx, events_id);
+ learn_ctx->events_item = grn_obj_column(ctx, events, CONST_STR_LEN("item"));
+ learn_ctx->events_type = grn_obj_column(ctx, events, CONST_STR_LEN("type"));
+ learn_ctx->events_time = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
+
+ event_types_id = grn_obj_get_range(ctx, learn_ctx->events_type);
+ learn_ctx->event_types = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
+
+ learn_ctx->items = items = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(post_item));
+ learn_ctx->items_freq = grn_obj_column(ctx, items, CONST_STR_LEN("freq"));
+ learn_ctx->items_freq2 = grn_obj_column(ctx, items, CONST_STR_LEN("freq2"));
+ learn_ctx->items_last = grn_obj_column(ctx, items, CONST_STR_LEN("last"));
+
+ learn_ctx->pairs = pairs;
+ learn_ctx->pairs_pre = grn_obj_column(ctx, pairs, CONST_STR_LEN("pre"));
+ learn_ctx->pairs_post = grn_obj_column(ctx, pairs, CONST_STR_LEN("post"));
+ learn_ctx->pairs_freq0 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0"));
+ learn_ctx->pairs_freq1 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1"));
+ learn_ctx->pairs_freq2 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2"));
+}
+
static int
learn_for_complete_and_correcnt(grn_ctx *ctx, grn_obj *events,
grn_obj *pairs,
@@ -590,15 +642,15 @@ learn_for_complete_and_correcnt(grn_ctx *ctx, grn_obj *events,
}
static void
-learn_for_suggest(grn_ctx *ctx, grn_obj *items, grn_id post_item_id,
- uint64_t key_, grn_obj *pairs,
- grn_obj *pairs_pre, grn_obj *pairs_post, grn_obj *pre_item,
- grn_obj *post_item, grn_obj *pairs_freq2, grn_obj *v1)
+learn_for_suggest(grn_ctx *ctx, grn_suggest_learn_ctx *learn_ctx,
+ grn_id post_item_id,
+ uint64_t key_, grn_obj *pre_item,
+ grn_obj *post_item, grn_obj *v1)
{
char keybuf[GRN_TABLE_MAX_KEY_SIZE];
- int keylen = grn_table_get_key(ctx, items, post_item_id,
+ int keylen = grn_table_get_key(ctx, learn_ctx->items, post_item_id,
keybuf, GRN_TABLE_MAX_KEY_SIZE);
- grn_token *token = grn_token_open(ctx, items, keybuf, keylen, 1);
+ grn_token *token = grn_token_open(ctx, learn_ctx->items, keybuf, keylen, 1);
if (token) {
grn_id tid;
while ((tid = grn_token_next(ctx, token)) && tid != post_item_id) {
@@ -606,13 +658,16 @@ learn_for_suggest(grn_ctx *ctx, grn_obj *items, grn_id post_item_id,
int added;
grn_id pair_id;
key = key_ + tid;
- pair_id = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
+ pair_id = grn_table_add(ctx, learn_ctx->pairs, &key, sizeof(uint64_t),
+ &added);
if (added) {
GRN_RECORD_SET(ctx, pre_item, tid);
- grn_obj_set_value(ctx, pairs_pre, pair_id, pre_item, GRN_OBJ_SET);
- grn_obj_set_value(ctx, pairs_post, pair_id, post_item, GRN_OBJ_SET);
+ grn_obj_set_value(ctx, learn_ctx->pairs_pre, pair_id,
+ pre_item, GRN_OBJ_SET);
+ grn_obj_set_value(ctx, learn_ctx->pairs_post, pair_id,
+ post_item, GRN_OBJ_SET);
}
- grn_obj_set_value(ctx, pairs_freq2, pair_id, v1, GRN_OBJ_INCR);
+ grn_obj_set_value(ctx, learn_ctx->pairs_freq2, pair_id, v1, GRN_OBJ_INCR);
}
grn_token_close(ctx, token);
}
@@ -630,42 +685,40 @@ learn(grn_ctx *ctx, grn_obj *post_event, grn_obj *post_type, grn_obj *post_item,
grn_id seq_id = GRN_RECORD_VALUE(seq);
int64_t post_time_value = GRN_TIME_VALUE(post_time);
if (post_event_id && post_item_id && seq_id) {
- grn_obj *seqs = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(seq));
- grn_obj *seqs_events = grn_obj_column(ctx, seqs, CONST_STR_LEN("events"));
- grn_obj *events = grn_ctx_at(ctx, grn_obj_get_range(ctx, seqs_events));
- grn_obj *events_item = grn_obj_column(ctx, events, CONST_STR_LEN("item"));
- grn_obj *items = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(post_item));
- grn_obj *items_freq = grn_obj_column(ctx, items, CONST_STR_LEN("freq"));
- grn_obj *items_freq2 = grn_obj_column(ctx, items, CONST_STR_LEN("freq2"));
- grn_obj *items_last = grn_obj_column(ctx, items, CONST_STR_LEN("last"));
- grn_obj *pairs_pre = grn_obj_column(ctx, pairs, CONST_STR_LEN("pre"));
- grn_obj *pairs_post = grn_obj_column(ctx, pairs, CONST_STR_LEN("post"));
- grn_obj *pairs_freq2 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2"));
+ grn_suggest_learn_ctx learn_ctx;
+ learn_ctx_init(ctx, &learn_ctx, seq, post_item, pairs);
GRN_UINT32_INIT(&v1, 0);
GRN_UINT32_SET(ctx, &v1, 1);
- GRN_RECORD_INIT(&pre_events, 0, grn_obj_id(ctx, events));
- grn_obj_set_value(ctx, items_freq, post_item_id, &v1, GRN_OBJ_INCR);
- grn_obj_set_value(ctx, items_last, post_item_id, post_time, GRN_OBJ_SET);
+ GRN_RECORD_INIT(&pre_events, 0, grn_obj_id(ctx, learn_ctx.events));
+ grn_obj_set_value(ctx, learn_ctx.items_freq, post_item_id,
+ &v1, GRN_OBJ_INCR);
+ grn_obj_set_value(ctx, learn_ctx.items_last, post_item_id,
+ post_time, GRN_OBJ_SET);
if (post_type_id) {
uint64_t key_ = ((uint64_t)post_item_id) << 32;
+ grn_id items_id;
grn_obj pre_item;
- grn_obj_set_value(ctx, items_freq2, post_item_id, &v1, GRN_OBJ_INCR);
- grn_obj_get_value(ctx, seqs_events, seq_id, &pre_events);
- GRN_RECORD_INIT(&pre_item, 0, grn_obj_get_range(ctx, events_item));
- r = learn_for_complete_and_correcnt(ctx, events,
- pairs, pairs_pre, pairs_post,
+ grn_obj_set_value(ctx, learn_ctx.items_freq2, post_item_id,
+ &v1, GRN_OBJ_INCR);
+ grn_obj_get_value(ctx, learn_ctx.seqs_events, seq_id, &pre_events);
+ items_id = grn_obj_get_range(ctx, learn_ctx.events_item);
+ GRN_RECORD_INIT(&pre_item, 0, items_id);
+ r = learn_for_complete_and_correcnt(ctx, learn_ctx.events,
+ learn_ctx.pairs,
+ learn_ctx.pairs_pre,
+ learn_ctx.pairs_post,
post_item,
&pre_events, &pre_item,
- events_item, key_,
+ learn_ctx.events_item, key_,
post_time_value, &v1);
- learn_for_suggest(ctx, items, post_item_id, key_, pairs,
- pairs_pre, pairs_post, &pre_item, post_item,
- pairs_freq2, &v1);
+ learn_for_suggest(ctx, &learn_ctx,
+ post_item_id, key_, &pre_item, post_item, &v1);
GRN_OBJ_FIN(ctx, &pre_item);
GRN_BULK_REWIND(&pre_events);
}
GRN_RECORD_SET(ctx, &pre_events, post_event_id);
- grn_obj_set_value(ctx, seqs_events, seq_id, &pre_events, GRN_OBJ_APPEND);
+ grn_obj_set_value(ctx, learn_ctx.seqs_events, seq_id,
+ &pre_events, GRN_OBJ_APPEND);
GRN_OBJ_FIN(ctx, &pre_events);
GRN_OBJ_FIN(ctx, &v1);
}