[Groonga-commit] ranguba/groonga-client at 73e4bd0 [master] Add between method in `select.rb` and tests.

Back to archive index

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 



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