[Groonga-commit] groonga/groonga [master] Added suggest_sub().

Back to archive index

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)
 {




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