Kouhei Sutou
null+****@clear*****
Thu Sep 25 21:48:52 JST 2014
Kouhei Sutou 2014-09-25 21:48:52 +0900 (Thu, 25 Sep 2014) New Revision: 854b8e2089324325080190fdee390799a26466f2 https://github.com/groonga/groonga/commit/854b8e2089324325080190fdee390799a26466f2 Message: mruby: support similar search with custom threshold Modified files: lib/mrb/mrb_expr.c lib/mrb/scripts/scan_info.rb lib/mrb/scripts/scan_info_data.rb Modified: lib/mrb/mrb_expr.c (+27 -0) =================================================================== --- lib/mrb/mrb_expr.c 2014-09-25 21:40:28 +0900 (2c4b5c5) +++ lib/mrb/mrb_expr.c 2014-09-25 21:48:52 +0900 (3d0499c) @@ -233,6 +233,29 @@ mrb_grn_scan_info_get_max_interval(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_grn_scan_info_set_similarity_threshold(mrb_state *mrb, mrb_value self) +{ + scan_info *si; + int similarity_threshold; + + mrb_get_args(mrb, "i", &similarity_threshold); + si = DATA_PTR(self); + grn_scan_info_set_similarity_threshold(si, similarity_threshold); + return self; +} + +static mrb_value +mrb_grn_scan_info_get_similarity_threshold(mrb_state *mrb, mrb_value self) +{ + scan_info *si; + int similarity_threshold; + + si = DATA_PTR(self); + similarity_threshold = grn_scan_info_get_similarity_threshold(si); + return mrb_fixnum_value(similarity_threshold); +} + +static mrb_value mrb_grn_scan_info_get_arg(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; @@ -420,6 +443,10 @@ grn_mrb_expr_init(grn_ctx *ctx) mrb_grn_scan_info_get_max_interval, MRB_ARGS_NONE()); mrb_define_method(mrb, klass, "max_interval=", mrb_grn_scan_info_set_max_interval, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, klass, "similarity_threshold", + mrb_grn_scan_info_get_similarity_threshold, MRB_ARGS_NONE()); + mrb_define_method(mrb, klass, "similarity_threshold=", + mrb_grn_scan_info_set_similarity_threshold, MRB_ARGS_REQ(1)); mrb_define_method(mrb, klass, "get_arg", mrb_grn_scan_info_get_arg, MRB_ARGS_REQ(1)); mrb_define_method(mrb, klass, "push_arg", Modified: lib/mrb/scripts/scan_info.rb (+3 -0) =================================================================== --- lib/mrb/scripts/scan_info.rb 2014-09-25 21:40:28 +0900 (9977d9b) +++ lib/mrb/scripts/scan_info.rb 2014-09-25 21:48:52 +0900 (cf0056d) @@ -16,6 +16,9 @@ module Groonga if data.max_interval self.max_interval = data.max_interval end + if data.similarity_threshold + self.similarity_threshold = data.similarity_threshold + end data.args.each do |arg| push_arg(arg) end Modified: lib/mrb/scripts/scan_info_data.rb (+27 -0) =================================================================== --- lib/mrb/scripts/scan_info_data.rb 2014-09-25 21:40:28 +0900 (87eb9ed) +++ lib/mrb/scripts/scan_info_data.rb 2014-09-25 21:48:52 +0900 (67d0bc3) @@ -9,6 +9,7 @@ module Groonga attr_accessor :indexes attr_accessor :flags attr_accessor :max_interval + attr_accessor :similarity_threshold def initialize(start) @start = start @end = 0 @@ -19,11 +20,14 @@ module Groonga @indexes = [] @flags = ScanInfo::Flags::PUSH @max_interval = nil + @similarity_threshold = nil end def match_resolve_index if near_search? match_near_resolve_index + elsif similar_search? + match_similar_resolve_index else match_generic_resolve_index end @@ -60,6 +64,29 @@ module Groonga self.max_interval = @args[2].value end + def similar_search? + @op == Operator::SIMILAR and****@args***** == 3 + end + + def match_similar_resolve_index + arg = @args[0] + case arg + when Expression + match_resolve_index_expression(arg) + when Accessor + match_resolve_index_accessor(arg) + when Object + match_resolve_index_db_obj(arg) + else + message = + "The first argument of SIMILAR must be Expression, Accessor or Object: #{arg.class}" + raise message + end + + self.query = @args[1] + self.similarity_threshold = @args[2].value + end + def match_generic_resolve_index @args.each do |arg| case arg -------------- next part -------------- HTML����������������������������...Download