[Groonga-commit] ranguba/groonga-client at b5cce82 [master] select: support columns[label]

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Jan 6 16:09:58 JST 2017


Kouhei Sutou	2017-01-06 16:09:58 +0900 (Fri, 06 Jan 2017)

  New Revision: b5cce8278bc3426d84755d58a527cf859f0fceeb
  https://github.com/ranguba/groonga-client/commit/b5cce8278bc3426d84755d58a527cf859f0fceeb

  Message:
    select: support columns[label]

  Copied files:
    test/request/select/test-backward-compatible-sort-keys-parameter.rb
      (from test/request/select/test-sort-keys-columns-parameter.rb)
  Modified files:
    lib/groonga/client/request/select.rb
    test/request/test-select.rb
  Renamed files:
    test/request/select/test-sort-keys-parameter.rb
      (from test/request/select/test-sort-keys-columns-parameter.rb)

  Modified: lib/groonga/client/request/select.rb (+105 -13)
===================================================================
--- lib/groonga/client/request/select.rb    2016-12-22 11:25:15 +0900 (2de851d)
+++ lib/groonga/client/request/select.rb    2017-01-06 16:09:58 +0900 (4fb1ee7)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016  Kouhei Sutou <kou �� clear-code.com>
+# Copyright (C) 2016-2017  Kouhei Sutou <kou �� clear-code.com>
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -98,7 +98,7 @@ module Groonga
 
         def sort_keys(value)
           add_parameter(OverwriteMerger,
-                        SortKeysParameter.new("", value))
+                        BackwardCompatibleSortKeysParameter.new("", value))
         end
         alias_method :sortby, :sort_keys
         alias_method :sort, :sort_keys
@@ -126,6 +126,10 @@ module Groonga
           LabeledDrilldown.new(self, label)
         end
 
+        def columns(label)
+          DynamicColumn.new(self, label)
+        end
+
         def each(&block)
           response.records.each(&block)
         end
@@ -158,7 +162,7 @@ module Groonga
 
           def sort_keys(value)
             add_parameter(OverwriteMerger,
-                          SortKeysParameter.new(prefix, value))
+                          BackwardCompatibleSortKeysParameter.new(prefix, value))
           end
           alias_method :sortby, :sort_keys
           alias_method :sort, :sort_keys
@@ -195,6 +199,71 @@ module Groonga
           end
         end
 
+        class DynamicColumn
+          def initialize(request, label)
+            @request = request
+            @label = label
+          end
+
+          def stage(value)
+            add_parameter(OverwriteMerger,
+                          RequestParameter.new(:"#{prefix}stage", value))
+          end
+
+          def type(value)
+            add_parameter(OverwriteMerger,
+                          RequestParameter.new(:"#{prefix}type", value))
+          end
+
+          def flags(value)
+            add_parameter(OverwriteMerger,
+                          FlagsParameter.new([:"#{prefix}flags"], value))
+          end
+
+          def value(expression, values=nil)
+            add_parameter(OverwriteMerger,
+                          ScriptSyntaxExpressionParameter.new(:"#{prefix}value",
+                                                              expression,
+                                                              values))
+          end
+
+          def window
+            DynamicColumnWindow.new(@request, @label)
+          end
+
+          private
+          def prefix
+            "columns[#{@label}]."
+          end
+
+          def add_parameter(merger, parameter)
+            @request.__send__(:add_parameter, merger, parameter)
+          end
+        end
+
+        class DynamicColumnWindow
+          def initialize(request, label)
+            @request = request
+            @label = label
+          end
+
+          def sort_keys(value)
+            add_parameter(OverwriteMerger,
+                          SortKeysParameter.new(prefix, value))
+          end
+          alias_method :sortby, :sort_keys
+          alias_method :sort, :sort_keys
+
+          private
+          def prefix
+            "columns[#{@label}].window."
+          end
+
+          def add_parameter(merger, parameter)
+            @request.__send__(:add_parameter, merger, parameter)
+          end
+        end
+
         # @private
         class QueryMerger < ParameterMerger
           def to_parameters
@@ -230,9 +299,9 @@ module Groonga
         end
 
         # @private
-        module FilterValueEscapable
+        module ScriptSyntaxValueEscapable
           private
-          def escape_filter_value(value)
+          def escape_script_syntax_value(value)
             case value
             when Numeric
               value
@@ -269,10 +338,11 @@ module Groonga
         end
 
         # @private
-        class FilterExpressionParameter
-          include FilterValueEscapable
+        class ScriptSyntaxExpressionParameter
+          include ScriptSyntaxValueEscapable
 
-          def initialize(expression, values)
+          def initialize(name, expression, values)
+            @name = name
             @expression = expression
             @values = values
           end
@@ -288,23 +358,35 @@ module Groonga
               expression = @expression
             end
 
-            if****@value*****_a?(::Hash) and not****@value*****?
+            case @values
+            when ::Hash
               escaped_values = {}
               @values.each do |key, value|
-                escaped_values[key] = escape_filter_value(value)
+                escaped_values[key] = escape_script_syntax_value(value)
+              end
+              expression = expression % escaped_values
+            when ::Array
+              escaped_values =****@value***** do |value|
+                escape_script_syntax_value(value)
               end
               expression = expression % escaped_values
             end
 
             {
-              filter: expression,
+              @name => expression,
             }
           end
         end
 
+        class FilterExpressionParameter < ScriptSyntaxExpressionParameter
+          def initialize(expression, values)
+            super(:filter, expression, values)
+          end
+        end
+
         # @private
         class FilterEqualParameter
-          include FilterValueEscapable
+          include ScriptSyntaxValueEscapable
 
           def initialize(column_name, value)
             @column_name = column_name
@@ -313,7 +395,7 @@ module Groonga
 
           def to_parameters
             {
-              filter: "#{@column_name} == #{escape_filter_value(@value)}",
+              filter: "#{@column_name} == #{escape_script_syntax_value(@value)}",
             }
           end
         end
@@ -342,6 +424,16 @@ module Groonga
           def initialize(prefix, output_columns)
             names = [
               :"#{prefix}sort_keys",
+            ]
+            super(names, output_columns)
+          end
+        end
+
+        # @private
+        class BackwardCompatibleSortKeysParameter < ValuesParameter
+          def initialize(prefix, output_columns)
+            names = [
+              :"#{prefix}sort_keys",
               :"#{prefix}sortby", # for backward compatibility
             ]
             super(names, output_columns)

  Copied: test/request/select/test-backward-compatible-sort-keys-parameter.rb (+3 -3) 89%
===================================================================
--- test/request/select/test-sort-keys-columns-parameter.rb    2016-12-22 11:25:15 +0900 (2771a1e)
+++ test/request/select/test-backward-compatible-sort-keys-parameter.rb    2017-01-06 16:09:58 +0900 (e30d3b1)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016  Kouhei Sutou <kou �� clear-code.com>
+# Copyright (C) 2017  Kouhei Sutou <kou �� clear-code.com>
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,9 +14,9 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-class TestRequestSelectSortKeysParmater < Test::Unit::TestCase
+class TestRequestSelectBackwardCompatibleSortKeysParmater < Test::Unit::TestCase
   def sort_keys_parameter(prefix, sort_keys)
-    Groonga::Client::Request::Select::SortKeysParameter.new(prefix, sort_keys)
+    Groonga::Client::Request::Select::BackwardCompatibleSortKeysParameter.new(prefix, sort_keys)
   end
 
   def to_parameters(sort_keys)

  Renamed: test/request/select/test-sort-keys-parameter.rb (+1 -5) 88%
===================================================================
--- test/request/select/test-sort-keys-columns-parameter.rb    2016-12-22 11:25:15 +0900 (2771a1e)
+++ test/request/select/test-sort-keys-parameter.rb    2017-01-06 16:09:58 +0900 (4a418ea)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016  Kouhei Sutou <kou �� clear-code.com>
+# Copyright (C) 2016-2017  Kouhei Sutou <kou �� clear-code.com>
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -31,7 +31,6 @@ class TestRequestSelectSortKeysParmater < Test::Unit::TestCase
   def test_string
     assert_equal({
                    :sort_keys => "-_score, _id",
-                   :sortby    => "-_score, _id",
                  },
                  to_parameters("-_score, _id"))
   end
@@ -44,7 +43,6 @@ class TestRequestSelectSortKeysParmater < Test::Unit::TestCase
   def test_symbol
     assert_equal({
                    :sort_keys => "_score",
-                   :sortby    => "_score",
                  },
                  to_parameters(:_score))
   end
@@ -52,7 +50,6 @@ class TestRequestSelectSortKeysParmater < Test::Unit::TestCase
   def test_array
     assert_equal({
                    :sort_keys => "-_score, _id",
-                   :sortby    => "-_score, _id",
                  },
                  to_parameters(["-_score", :_id]))
   end
@@ -67,7 +64,6 @@ class TestRequestSelectSortKeysParmater < Test::Unit::TestCase
 
     assert_equal({
                    :"slices[tag].sort_keys" => "-_score, _id",
-                   :"slices[tag].sortby"    => "-_score, _id",
                  },
                  parameter.to_parameters)
   end

  Modified: test/request/test-select.rb (+49 -1)
===================================================================
--- test/request/test-select.rb    2016-12-22 11:25:15 +0900 (68e56a4)
+++ test/request/test-select.rb    2017-01-06 16:09:58 +0900 (6e01434)
@@ -1,4 +1,4 @@
-# Copyright (C) 2016  Kouhei Sutou <kou �� clear-code.com>
+# Copyright (C) 2016-2017  Kouhei Sutou <kou �� clear-code.com>
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -128,4 +128,52 @@ class TestRequestSelect < Test::Unit::TestCase
       end
     end
   end
+
+  sub_test_case("#columns") do
+    def column
+      @request.columns("label")
+    end
+
+    test "#stage" do
+      assert_equal({
+                     :table => "posts",
+                     :"columns[label].stage" => "output",
+                   },
+                   column.stage("output").to_parameters)
+    end
+
+    test "#type" do
+      assert_equal({
+                     :table => "posts",
+                     :"columns[label].type" => "Text",
+                   },
+                   column.type("Text").to_parameters)
+    end
+
+    test "#flags" do
+      assert_equal({
+                     :table => "posts",
+                     :"columns[label].flags" => "COLUMN_SCALAR|COMPRESS_LZ4",
+                   },
+                   column.flags(["COLUMN_SCALAR", "COMPRESS_LZ4"]).to_parameters)
+    end
+
+    test "#value" do
+      assert_equal({
+                     :table => "posts",
+                     :"columns[label].value" => "highlight_html(\"xxx\")",
+                   },
+                   column.value("highlight_html(%{text})", text: "xxx").to_parameters)
+    end
+
+    sub_test_case("#window") do
+      test "#sort_keys" do
+        assert_equal({
+                       :table => "posts",
+                       :"columns[label].window.sort_keys" => "_id",
+                     },
+                     column.window.sort_keys("_id").to_parameters)
+      end
+    end
+  end
 end
-------------- next part --------------
HTML����������������������������...
Download 



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