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