[Groonga-commit] groonga/groonga [master] suggest: pack learn related info to a struct

Back to archive index

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);
   }




Groonga-commit メーリングリストの案内
Back to archive index