[Groonga-commit] groonga/groonga [master] uint32 -> int32 in cooccur_search().

Back to archive index

null+****@clear***** null+****@clear*****
2010年 9月 3日 (金) 19:42:54 JST


Daijiro MORI	2010-09-03 10:42:54 +0000 (Fri, 03 Sep 2010)

  New Revision: f6f682a55cecbb6573d655f45fee0b333b18d82e

  Log:
    uint32 -> int32 in cooccur_search().

  Modified files:
    modules/suggest/suggest.c

  Modified: modules/suggest/suggest.c (+16 -14)
===================================================================
--- modules/suggest/suggest.c    2010-08-30 07:39:19 +0000 (48d02c5)
+++ modules/suggest/suggest.c    2010-09-03 10:42:54 +0000 (e7d5a8e)
@@ -62,10 +62,10 @@ grn_parse_suggest_types(const char *nptr, const char *end)
   return types;
 }
 
-static uint32_t
+static int32_t
 cooccur_search(grn_ctx *ctx, grn_obj *table, grn_id id, grn_obj *res, int query_type)
 {
-  uint32_t max_score = 0;
+  int32_t max_score = 0;
   if (id) {
     grn_ii_cursor *c;
     grn_obj *co = grn_obj_column(ctx, table, CONST_STR_LEN("co"));
@@ -106,7 +106,7 @@ cooccur_search(grn_ctx *ctx, grn_obj *table, grn_id id, grn_obj *res, int query_
         ifreq = GRN_INT32_VALUE(&item_freq);
         if (pfreq && ifreq) {
           grn_rset_recinfo *ri;
-          uint32_t score = pfreq;
+          int32_t score = pfreq;
           if (max_score < score) { max_score = score; }
           /* put any formula if desired */
           if (grn_hash_add(ctx, (grn_hash *)res,
@@ -205,7 +205,7 @@ complete(grn_ctx *ctx, grn_obj *table, grn_obj *col, grn_obj *query)
                                              GRN_ID_NIL, GRN_ID_MAX, 1, 0))) {
                 grn_ii_posting *p;
                 while ((p = grn_ii_cursor_next(ctx, icur))) {
-                  uint32_t score;
+                  int32_t score;
                   grn_rset_recinfo *ri;
                   grn_hash_add(ctx, (grn_hash *)res,
                                &p->rid, sizeof(grn_id), (void **)&ri, NULL);
@@ -234,7 +234,7 @@ complete(grn_ctx *ctx, grn_obj *table, grn_obj *col, grn_obj *query)
                                        NULL, 0, 0, -1, GRN_CURSOR_PREFIX))) {
         grn_id id;
         while ((id = grn_table_cursor_next(ctx, cur))) {
-          uint32_t score;
+          int32_t score;
           grn_rset_recinfo *ri;
           grn_hash_add(ctx, (grn_hash *)res, &id, sizeof(grn_id), (void **)&ri, NULL);
           GRN_BULK_REWIND(&item_freq);
@@ -260,15 +260,15 @@ static void
 correct(grn_ctx *ctx, grn_obj *table, grn_obj *query)
 {
   grn_obj *res;
-  grn_obj *items_freq = grn_obj_column(ctx, table, CONST_STR_LEN("freq"));
+  grn_obj *items_freq2 = grn_obj_column(ctx, table, CONST_STR_LEN("freq2"));
   grn_obj *items_boost = grn_obj_column(ctx, table, CONST_STR_LEN("boost"));
-  grn_obj item_freq, item_boost;
-  GRN_INT32_INIT(&item_freq, 0);
+  grn_obj item_freq2, item_boost;
+  GRN_INT32_INIT(&item_freq2, 0);
   GRN_INT32_INIT(&item_boost, 0);
   if ((res = grn_table_create(ctx, NULL, 0, NULL,
                               GRN_TABLE_HASH_KEY|GRN_OBJ_WITH_SUBREC, table, NULL))) {
     grn_id tid = grn_table_get(ctx, table, TEXT_VALUE_LEN(query));
-    uint32_t max_score = cooccur_search(ctx, table, tid, res, CORRECT);
+    int32_t orig_score, max_score = cooccur_search(ctx, table, tid, res, CORRECT);
     LAP("cooccur", max_score);
     if (GRN_TEXT_LEN(query) && max_score < 100) {
       grn_obj *key, *index;
@@ -286,17 +286,17 @@ correct(grn_ctx *ctx, grn_obj *table, grn_obj *query)
             grn_hash_cursor *hc = grn_hash_cursor_open(ctx, (grn_hash *)res, NULL,
                                                        0, NULL, 0, 0, -1, 0);
             if (hc) {
-              uint32_t score;
+              int32_t score;
               grn_id *rp;
               grn_rset_recinfo *ri;
               while (grn_hash_cursor_next(ctx, hc)) {
                 if (grn_hash_cursor_get_key_value(ctx, hc, (void **)(&rp), NULL,
                                                   (void **)(&ri))) {
-                  GRN_BULK_REWIND(&item_freq);
+                  GRN_BULK_REWIND(&item_freq2);
                   GRN_BULK_REWIND(&item_boost);
-                  grn_obj_get_value(ctx, items_freq, *rp, &item_freq);
+                  grn_obj_get_value(ctx, items_freq2, *rp, &item_freq2);
                   grn_obj_get_value(ctx, items_boost, *rp, &item_boost);
-                  score = GRN_INT32_VALUE(&item_freq) + GRN_INT32_VALUE(&item_boost);
+                  score = (GRN_INT32_VALUE(&item_freq2) >> 4) + GRN_INT32_VALUE(&item_boost);
                   ri->score += score;
                   if (score < 100) { grn_hash_cursor_delete(ctx, hc, NULL); }
                 }
@@ -352,7 +352,7 @@ correct(grn_ctx *ctx, grn_obj *table, grn_obj *query)
     ERR(GRN_UNKNOWN_ERROR, "cannot create temporary table.");
   }
   GRN_OBJ_FIN(ctx, &item_boost);
-  GRN_OBJ_FIN(ctx, &item_freq);
+  GRN_OBJ_FIN(ctx, &item_freq2);
 }
 
 static void
@@ -416,6 +416,7 @@ func_suggest_preparer(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *us
     if (post_event && post_item && seq) {
       grn_obj *items = grn_ctx_at(ctx, GRN_OBJ_GET_DOMAIN(args[2]));
       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(args[3]));
       grn_obj *seqs_events = grn_obj_column(ctx, seqs, CONST_STR_LEN("events"));
@@ -438,6 +439,7 @@ func_suggest_preparer(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *us
         grn_id pid, tid, *ep, *es;
         grn_obj pre_type, pre_time, pre_item;
         uint64_t key, key_ = ((uint64_t)post_item) << 32;
+        grn_obj_set_value(ctx, items_freq2, post_item, &v1, GRN_OBJ_INCR);
         grn_obj_get_value(ctx, seqs_events, seq, &pre_events);
         ep = (grn_id *)GRN_BULK_CURR(&pre_events);
         es = (grn_id *)GRN_BULK_HEAD(&pre_events);




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