[Groonga-commit] ranguba/rroonga at aad61d3 [master] Support method style function call in "#select" block

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Mar 6 12:43:26 JST 2016


Kouhei Sutou	2016-03-06 12:43:26 +0900 (Sun, 06 Mar 2016)

  New Revision: aad61d3cf0893a91820753c9b2f44f88cf43ba36
  https://github.com/ranguba/rroonga/commit/aad61d3cf0893a91820753c9b2f44f88cf43ba36

  Message:
    Support method style function call in "#select" block
    
    Example:
    
        @shops.select do |record|
          record.location.geo_in_rectangle("35.7185,139.7912",
                                           "35.7065,139.8069")
        end
    
    It's Rubyish API what we're looking for!

  Modified files:
    lib/groonga/expression-builder.rb
    test/test-expression-builder.rb

  Modified: lib/groonga/expression-builder.rb (+22 -5)
===================================================================
--- lib/groonga/expression-builder.rb    2016-03-06 00:12:16 +0900 (b99001f)
+++ lib/groonga/expression-builder.rb    2016-03-06 12:43:26 +0900 (18928bf)
@@ -282,14 +282,31 @@ module Groonga
         other
       end
 
+      def callable_object?(object)
+        return false unless object.respond_to?(:function_procedure?)
+
+        object.function_procedure?
+      end
+
       def method_missing(name, *args, &block)
         return super if block
-        return super unless args.empty?
-        if VALID_COLUMN_NAME_RE =~ name.to_s
-          RecordExpressionBuilder.new(@table, @name)["#{@column_name}.#{name}"]
-        else
-          super
+
+        if args.empty? and VALID_COLUMN_NAME_RE =~ name.to_s
+          accessor_name = "#{@column_name}.#{name}"
+          accessor =****@table*****(accessor_name)
+          if accessor
+            return self.class.new(accessor,
+                                  :table => @table,
+                                  :column_name => accessor_name)
+          end
+        end
+
+        object =****@table*****[name]
+        if callable_object?(object)
+          return CallExpressionBuilder.new(object, self, *args)
         end
+
+        super
       end
     end
 

  Modified: test/test-expression-builder.rb (+10 -1)
===================================================================
--- test/test-expression-builder.rb    2016-03-06 00:12:16 +0900 (17f7e00)
+++ test/test-expression-builder.rb    2016-03-06 12:43:26 +0900 (b3b135b)
@@ -555,7 +555,7 @@ EOC
         @shops.add("Taiyaki Sharaku", :location => "35.716969,139.794846")
       end
 
-      def test_search
+      def test_call_style
         result =****@shops***** do |record|
           record.call("geo_in_rectangle",
                       record.location,
@@ -565,6 +565,15 @@ EOC
         assert_equal(["Taiyaki Sharaku"],
                      result.collect(&:_key))
       end
+
+      def test_method_style
+        result =****@shops***** do |record|
+          record.location.geo_in_rectangle("35.7185,139.7912",
+                                           "35.7065,139.8069")
+        end
+        assert_equal(["Taiyaki Sharaku"],
+                     result.collect(&:_key))
+      end
     end
 
     class IntegerTest < self
-------------- next part --------------
HTML����������������������������...
Descargar 



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