HorimotoYasuhiro
null+****@clear*****
Mon Apr 24 19:02:52 JST 2017
HorimotoYasuhiro 2017-04-24 19:02:52 +0900 (Mon, 24 Apr 2017) New Revision: 73e4bd0649ea682def62770cc3a5592b3645c8cc https://github.com/ranguba/groonga-client/commit/73e4bd0649ea682def62770cc3a5592b3645c8cc Merged 82bc9ae: Merge pull request #16 from komainu8/feature/add_new_method Message: Add between method in `select.rb` and tests. Modified files: lib/groonga/client/request/select.rb test/request/test-select.rb Modified: lib/groonga/client/request/select.rb (+56 -0) =================================================================== --- lib/groonga/client/request/select.rb 2017-04-24 13:40:23 +0900 (683dcd8) +++ lib/groonga/client/request/select.rb 2017-04-24 19:02:52 +0900 (f5d0203) @@ -97,6 +97,16 @@ module Groonga # The new request object for setting a filter condition. # # @since 0.4.3 + # + # @example: Use between function + # request. + # filter.between("tags", "min", "min_border", "max", "max_border") + # # -> --filter 'between(tags, min, "min_border", max, "max_border")' + # + # @return [Groonga::Client::Request::Select::Filter] + # The new request object for setting a filter condition. + # + # @since 0.4.4 def filter(expression_or_column_name=nil, values_or_value=nil) if expression_or_column_name.nil? and values_or_value.nil? return Filter.new(self) @@ -182,6 +192,31 @@ module Groonga @request = request end + # Adds a `between` condition then return a new `select` + # request object. + # + # @example: Multiple conditions + # request. + # filter.between("tags", "min", "min_border", "max", "max_border"). + # # -> --filter 'between(tags, min, "min_border", max, "max_border")' + # + # @example: Ignore no values case + # request. + # filter.between("tags") + # # -> --filter '' + # + # @param column_name_or_value [String, Symbol, Integer] The target column name + # or target num. + # + # @param values [Object] Range of values. + # + # @return [Groonga::Client::Request::Select] + # The new request with the given condition. + def between(column_name_or_value, *values) + parameter = FilterBetweenParameter.new(column_name_or_value, *values) + add_parameter(FilterMerger, parameter) + end + # Adds a `in_values` condition then return a new `select` # request object. # @@ -458,6 +493,27 @@ module Groonga end # @private + class FilterBetweenParameter + include ScriptSyntaxValueEscapable + NUM_OF_ARGUMENTS = 4 + + def initialize(column_name_or_value, *values) + @column_name_or_value = column_name_or_value + @values = values + end + + def to_parameters + return {} if****@value*****? or****@value***** != NUM_OF_ARGUMENTS + + escaped_values =****@value***** do |value| + escape_script_syntax_value(value) + end + { + filter: "between(#{@column_name_or_value}, #{escaped_values.join(", ")})", + } + end + end + class FilterInValuesParameter include ScriptSyntaxValueEscapable Modified: test/request/test-select.rb (+52 -0) =================================================================== --- test/request/test-select.rb 2017-04-24 13:40:23 +0900 (e282f00) +++ test/request/test-select.rb 2017-04-24 19:02:52 +0900 (dfb0af6) @@ -92,6 +92,58 @@ class TestRequestSelect < Test::Unit::TestCase })) end + sub_test_case("#between") do + def between(column_name_or_value, *values) + @request.filter.between(column_name_or_value, *values).to_parameters + end + + test("column_name_include") do + assert_equal({ + :table => "posts", + :filter => "between(ages, 2, \"include\", 29, \"include\")", + }, + between("ages", 2, "include", 29, "include")) + end + + test("column_name_exclude") do + assert_equal({ + :table => "posts", + :filter => "between(ages, 2, \"exclude\", 29, \"exclude\")", + }, + between("ages", 2, "exclude", 29, "exclude")) + end + + test("number_include") do + assert_equal({ + :table => "posts", + :filter => "between(10, 2, \"include\", 29, \"include\")", + }, + between(10, 2, "include", 29, "include")) + end + + test("number_exclude") do + assert_equal({ + :table => "posts", + :filter => "between(10, 2, \"exclude\", 29, \"exclude\")", + }, + between(10, 2, "exclude", 29, "exclude")) + end + + test("no values") do + assert_equal({ + :table => "posts", + }, + between("tags")) + end + + test("too much values") do + assert_equal({ + :table => "posts", + }, + between("ages", 2, "include", 29, "include", 3)) + end + end + sub_test_case("#in_values") do def in_values(column_name, *values) @request.filter.in_values(column_name, *values).to_parameters -------------- next part -------------- HTML����������������������������...Download