Navigation Menu

Skip to content

Commit

Permalink
Add in_values method in select.rb
Browse files Browse the repository at this point in the history
  • Loading branch information
komainu8 committed Apr 13, 2017
1 parent 5c93fc1 commit b4a5176
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
40 changes: 39 additions & 1 deletion lib/groonga/client/request/select.rb
Expand Up @@ -78,7 +78,11 @@ def query(value)
# external should be escaped.
#
# Adds a `#{expression % values}` condition.
def filter(expression_or_column_name, values_or_value=nil)
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)
end

if expression_or_column_name.is_a?(Symbol)
parameter = FilterEqualParameter.new(expression_or_column_name,
values_or_value)
Expand Down Expand Up @@ -153,6 +157,22 @@ def paginated?
parameters.key?(:offset) and parameters.key?(:limit)
end

class Filter
def initialize(request)
@request = request
end

def in_values(column_name, *values)
add_parameter(FilterMerger,
FilterInValuesParameters.new(column_name, *values))
end

private
def add_parameter(merger, parameter)
@request.__send__(:add_parameter, merger, parameter)
end
end

class LabeledDrilldown
def initialize(request, label)
@request = request
Expand Down Expand Up @@ -396,6 +416,24 @@ def initialize(expression, values)
end

# @private
class FilterInValuesParameters
include ScriptSyntaxValueEscapable
def initialize(column_name, *values)
@column_name = column_name
@values = values
end

def to_parameters
escaped_values = []
@values.each{|value|
escaped_values << escape_script_syntax_value(value)
}
{
filter: "in_values(#{@column_name}, #{escaped_values.join(", ")})",
}
end
end

class FilterEqualParameter
include ScriptSyntaxValueEscapable

Expand Down
22 changes: 22 additions & 0 deletions test/request/test-select.rb
Expand Up @@ -384,5 +384,27 @@ def paginate(*args)
paginate(3, per_page: "29"))
end
end

sub_test_case("#in_values") do
def in_values(*args)
@request.filter.in_values(*args).to_parameters
end

test("numbers") do
assert_equal({
:table => "posts",
:filter => "in_values(ages, 2, 29)",
},
in_values("ages", 2, 29))
end

test("strings") do
assert_equal({
:table => "posts",
:filter => "in_values(tags, \"groonga\", \"have \\\"double\\\" quote\")",
},
in_values("tags", "groonga", "have \"double\" quote"))
end
end
end
end

0 comments on commit b4a5176

Please sign in to comment.