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