[Groonga-commit] groonga/groonga [master] suggest: split learn code for complete and correct

Back to archive index

null+****@clear***** null+****@clear*****
2012年 3月 9日 (金) 17:10:29 JST


Kouhei Sutou	2012-03-09 17:10:29 +0900 (Fri, 09 Mar 2012)

  New Revision: 208eb9bab17254d5cdf4809d857bdfc4350ef553

  Log:
    suggest: split learn code for complete and correct

  Modified files:
    plugins/suggest/suggest.c

  Modified: plugins/suggest/suggest.c (+70 -42)
===================================================================
--- plugins/suggest/suggest.c    2012-03-09 16:44:38 +0900 (72c9fe8)
+++ plugins/suggest/suggest.c    2012-03-09 17:10:29 +0900 (643d4c9)
@@ -531,6 +531,64 @@ command_suggest(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
   return NULL;
 }
 
+static int
+learn_for_complete_and_correcnt(grn_ctx *ctx, grn_obj *events,
+                                grn_obj *pairs,
+                                grn_obj *pairs_pre, grn_obj *pairs_post,
+                                grn_obj *post_item,
+                                grn_obj *pre_events, grn_obj *pre_item,
+                                grn_obj *events_item,
+                                uint64_t key_,
+                                int64_t post_time_value,
+                                grn_obj *v1)
+{
+  grn_obj pre_type, pre_time;
+  grn_id *ep, *es;
+  uint64_t key;
+  int r = 0;
+
+  grn_obj *events_type = grn_obj_column(ctx, events, CONST_STR_LEN("type"));
+  grn_obj *events_time = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
+  grn_obj *pairs_freq0 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0"));
+  grn_obj *pairs_freq1 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1"));
+
+  GRN_RECORD_INIT(&pre_type, 0, grn_obj_get_range(ctx, events_type));
+  GRN_TIME_INIT(&pre_time, 0);
+  ep = (grn_id *)GRN_BULK_CURR(pre_events);
+  es = (grn_id *)GRN_BULK_HEAD(pre_events);
+  while (es < ep--) {
+    grn_id pair_id;
+    int added;
+
+    GRN_BULK_REWIND(&pre_type);
+    GRN_BULK_REWIND(&pre_time);
+    GRN_BULK_REWIND(pre_item);
+    grn_obj_get_value(ctx, events_type, *ep, &pre_type);
+    grn_obj_get_value(ctx, events_time, *ep, &pre_time);
+    grn_obj_get_value(ctx, events_item, *ep, pre_item);
+    if (GRN_TIME_VALUE(&pre_time) + 60 * GRN_TIME_USEC_PER_SEC < post_time_value) {
+      r = (int)((post_time_value - GRN_TIME_VALUE(&pre_time))/GRN_TIME_USEC_PER_SEC);
+      break;
+    }
+    key = key_ + GRN_RECORD_VALUE(pre_item);
+    pair_id = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
+    if (added) {
+      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);
+    }
+    if (GRN_RECORD_VALUE(&pre_type)) {
+      grn_obj_set_value(ctx, pairs_freq1, pair_id, v1, GRN_OBJ_INCR);
+      break;
+    } else {
+      grn_obj_set_value(ctx, pairs_freq0, pair_id, v1, GRN_OBJ_INCR);
+    }
+  }
+  GRN_OBJ_FIN(ctx, &pre_type);
+  GRN_OBJ_FIN(ctx, &pre_time);
+
+  return r;
+}
+
 static void
 learn_for_suggest(grn_ctx *ctx, grn_obj *items, grn_id post_item_id,
                   uint64_t key_, grn_obj *pairs,
@@ -572,20 +630,16 @@ 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 *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 *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_type = grn_obj_column(ctx, events, CONST_STR_LEN("type"));
-    grn_obj *events_time = grn_obj_column(ctx, events, CONST_STR_LEN("time"));
     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_freq0 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq0"));
-    grn_obj *pairs_freq1 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq1"));
     grn_obj *pairs_freq2 = grn_obj_column(ctx, pairs, CONST_STR_LEN("freq2"));
     GRN_UINT32_INIT(&v1, 0);
     GRN_UINT32_SET(ctx, &v1, 1);
@@ -593,46 +647,20 @@ learn(grn_ctx *ctx, grn_obj *post_event, grn_obj *post_type, grn_obj *post_item,
     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);
     if (post_type_id) {
-      int added;
-      grn_id pair_id, *ep, *es;
-      grn_obj pre_type, pre_time, pre_item;
-      uint64_t key, key_ = ((uint64_t)post_item_id) << 32;
+      uint64_t key_ = ((uint64_t)post_item_id) << 32;
+      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);
-      ep = (grn_id *)GRN_BULK_CURR(&pre_events);
-      es = (grn_id *)GRN_BULK_HEAD(&pre_events);
-      GRN_RECORD_INIT(&pre_type, 0, grn_obj_get_range(ctx, events_type));
-      GRN_TIME_INIT(&pre_time, 0);
       GRN_RECORD_INIT(&pre_item, 0, grn_obj_get_range(ctx, events_item));
-      while (es < ep--) {
-        GRN_BULK_REWIND(&pre_type);
-        GRN_BULK_REWIND(&pre_time);
-        GRN_BULK_REWIND(&pre_item);
-        grn_obj_get_value(ctx, events_type, *ep, &pre_type);
-        grn_obj_get_value(ctx, events_time, *ep, &pre_time);
-        grn_obj_get_value(ctx, events_item, *ep, &pre_item);
-        if (GRN_TIME_VALUE(&pre_time) + 60 * GRN_TIME_USEC_PER_SEC < post_time_value) {
-          r = (int)((post_time_value - GRN_TIME_VALUE(&pre_time))/GRN_TIME_USEC_PER_SEC);
-          break;
-        }
-        key = key_ + GRN_RECORD_VALUE(&pre_item);
-        pair_id = grn_table_add(ctx, pairs, &key, sizeof(uint64_t), &added);
-        if (added) {
-          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);
-        }
-        if (GRN_RECORD_VALUE(&pre_type)) {
-          grn_obj_set_value(ctx, pairs_freq1, pair_id, &v1, GRN_OBJ_INCR);
-          break;
-        } else {
-          grn_obj_set_value(ctx, pairs_freq0, pair_id, &v1, GRN_OBJ_INCR);
-        }
-      }
+      r = learn_for_complete_and_correcnt(ctx, events,
+                                          pairs, pairs_pre, pairs_post,
+                                          post_item,
+                                          &pre_events, &pre_item,
+                                          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);
-      GRN_OBJ_FIN(ctx, &pre_type);
-      GRN_OBJ_FIN(ctx, &pre_time);
       GRN_OBJ_FIN(ctx, &pre_item);
       GRN_BULK_REWIND(&pre_events);
     }




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