Navigation Menu

Skip to content

Commit

Permalink
Add between method in select.rb and tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
komainu8 committed Apr 24, 2017
1 parent fff9160 commit 73e4bd0
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
56 changes: 56 additions & 0 deletions lib/groonga/client/request/select.rb
Expand Up @@ -97,6 +97,16 @@ def query(value)
# 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)
Expand Down Expand Up @@ -182,6 +192,31 @@ def initialize(request)
@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.
#
Expand Down Expand Up @@ -458,6 +493,27 @@ def initialize(expression, values)
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 @values.empty? or @values.length != NUM_OF_ARGUMENTS

escaped_values = @values.collect do |value|
escape_script_syntax_value(value)
end
{
filter: "between(#{@column_name_or_value}, #{escaped_values.join(", ")})",
}
end
end

class FilterInValuesParameter
include ScriptSyntaxValueEscapable

Expand Down
52 changes: 52 additions & 0 deletions test/request/test-select.rb
Expand Up @@ -92,6 +92,58 @@ def filter(*args)
}))
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
Expand Down

0 comments on commit 73e4bd0

Please sign in to comment.