[Groonga-commit] groonga/groonga at ee65611 [master] Fix a bug that wrong scorer function is used for multiple scorer

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Mar 23 18:00:20 JST 2015


Kouhei Sutou	2015-03-23 18:00:20 +0900 (Mon, 23 Mar 2015)

  New Revision: ee65611f9df39d6dddf68de240870ec32ea8a67f
  https://github.com/groonga/groonga/commit/ee65611f9df39d6dddf68de240870ec32ea8a67f

  Message:
    Fix a bug that wrong scorer function is used for multiple scorer

  Added files:
    test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.expected
    test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.test
  Modified files:
    lib/expr.c

  Modified: lib/expr.c (+4 -3)
===================================================================
--- lib/expr.c    2015-03-23 17:58:44 +0900 (96aa63c)
+++ lib/expr.c    2015-03-23 18:00:20 +0900 (f4df713)
@@ -5152,7 +5152,8 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si,
     case GRN_OP_REGEXP :
       {
         grn_obj wv, **ip = &GRN_PTR_VALUE(&si->index);
-        int j = GRN_BULK_VSIZE(&si->index)/sizeof(grn_obj *);
+        int j;
+        int n_indexes = GRN_BULK_VSIZE(&si->index)/sizeof(grn_obj *);
         int32_t *wp = &GRN_INT32_VALUE(&si->wv);
         grn_search_optarg optarg;
         GRN_INT32_INIT(&wv, GRN_OBJ_VECTOR);
@@ -5180,7 +5181,7 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si,
         optarg.proc = NULL;
         optarg.max_size = 0;
         ctx->flags |= GRN_CTX_TEMPORARY_DISABLE_II_RESOLVE_SEL_AND;
-        for (; j--; ip++, wp += 2) {
+        for (j = 0; j < n_indexes; j++, ip++, wp += 2) {
           uint32_t sid = (uint32_t) wp[0];
           int32_t weight = wp[1];
           if (sid) {
@@ -5203,7 +5204,7 @@ grn_table_select_index(grn_ctx *ctx, grn_obj *table, scan_info *si,
             GRN_PTR_VALUE_AT(&(si->scorer_args_exprs), j);
           optarg.scorer_args_expr_offset =
             GRN_UINT32_VALUE_AT(&(si->scorer_args_expr_offsets), j);
-          if (j) {
+          if (j < n_indexes - 1) {
             if (sid && ip[0] == ip[1]) { continue; }
           } else {
             ctx->flags &= ~GRN_CTX_TEMPORARY_DISABLE_II_RESOLVE_SEL_AND;

  Added: test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.expected (+28 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.expected    2015-03-23 18:00:20 +0900 (8d72cd1)
@@ -0,0 +1,28 @@
+table_create Logs TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Logs message1 COLUMN_SCALAR Text
+[[0,0.0,0.0],true]
+column_create Logs message2 COLUMN_SCALAR Text
+[[0,0.0,0.0],true]
+column_create Logs message3 COLUMN_SCALAR Text
+[[0,0.0,0.0],true]
+column_create Logs message4 COLUMN_SCALAR Text
+[[0,0.0,0.0],true]
+table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenDelimit
+[[0,0.0,0.0],true]
+column_create Lexicon index1 COLUMN_INDEX|WITH_POSITION Logs message1
+[[0,0.0,0.0],true]
+column_create Lexicon index2 COLUMN_INDEX|WITH_POSITION Logs message2
+[[0,0.0,0.0],true]
+column_create Lexicon index3 COLUMN_INDEX|WITH_POSITION Logs message3
+[[0,0.0,0.0],true]
+column_create Lexicon index4 COLUMN_INDEX|WITH_POSITION Logs message4
+[[0,0.0,0.0],true]
+load --table Logs
+[
+["message1", "message2", "message3", "message4"],
+["a a a a a a a a", "a a a a a a a a", "a a a a a a a a", "a a a a a a a a"]
+]
+[[0,0.0,0.0],1]
+select Logs   --match_columns 'scorer_tf_at_most(message1, 3.0) * 10 ||                    scorer_tf_at_most(message2, 4.0) ||                    scorer_tf_at_most(message3, 5.0) ||                    scorer_tf_at_most(message4, 7.0)'   --query 'a'   --output_columns '_score'
+[[0,0.0,0.0],[[[1],[["_score","Int32"]],[46]]]]

  Added: test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.test (+25 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/select/match_columns/scorer/tf_at_most/multiple/weight_first.test    2015-03-23 18:00:20 +0900 (d456aaf)
@@ -0,0 +1,25 @@
+table_create Logs TABLE_NO_KEY
+column_create Logs message1 COLUMN_SCALAR Text
+column_create Logs message2 COLUMN_SCALAR Text
+column_create Logs message3 COLUMN_SCALAR Text
+column_create Logs message4 COLUMN_SCALAR Text
+
+table_create Lexicon TABLE_PAT_KEY ShortText --default_tokenizer TokenDelimit
+column_create Lexicon index1 COLUMN_INDEX|WITH_POSITION Logs message1
+column_create Lexicon index2 COLUMN_INDEX|WITH_POSITION Logs message2
+column_create Lexicon index3 COLUMN_INDEX|WITH_POSITION Logs message3
+column_create Lexicon index4 COLUMN_INDEX|WITH_POSITION Logs message4
+
+load --table Logs
+[
+["message1", "message2", "message3", "message4"],
+["a a a a a a a a", "a a a a a a a a", "a a a a a a a a", "a a a a a a a a"]
+]
+
+select Logs \
+  --match_columns 'scorer_tf_at_most(message1, 3.0) * 10 || \
+                   scorer_tf_at_most(message2, 4.0) || \
+                   scorer_tf_at_most(message3, 5.0) || \
+                   scorer_tf_at_most(message4, 7.0)' \
+  --query 'a' \
+  --output_columns '_score'
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index