Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #16 from komainu8/feature/add_new_method
Browse files Browse the repository at this point in the history
Add between method in `select.rb` and tests.

Patch by komainu8. Thanks!!!
  • Loading branch information
kou committed Apr 26, 2017
2 parents fff9160 + 8cc1385 commit 82bc9ae
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
61 changes: 61 additions & 0 deletions lib/groonga/client/request/select.rb
Expand Up @@ -93,6 +93,11 @@ def query(value)
# filter.in_values("tags", "tag1", "tag2")
# # -> --filter 'in_values(tags, "tag1", "tag2")'
#
# @example: Use between function
# request.
# filter.between("tags", 19, "include", 32, "include")
# # -> --filter 'between(tags, 19, "include", 32, "include")'
#
# @return [Groonga::Client::Request::Select::Filter]
# The new request object for setting a filter condition.
#
Expand Down Expand Up @@ -182,6 +187,42 @@ def initialize(request)
@request = request
end

# Adds a `between` condition then return a new `select`
# request object.
#
# @example: Single condition
# request.
# filter.between("tags", "min", "min_border", "max", "max_border").
# # -> --filter 'between(tags, min, "min_border", max, "max_border")'
#
# @example: Error no values case
# request.
# filter.between("tags")
# # -> ArgumentError
#
# @param column_name [String, Symbol] The target column name.
#
# @param min [Integer] Specifies the minimal border value of the range.
#
# @param min_border [String] Specifies whether the specified range contains the value
# of min or not.
# If it is "include", min value is include.
# If it is "exclude", min value is not include.
#
# @param max [Integer] Specifies the maximum border value of the range.
#
# @param max_border [String] Specifies whether the specified range contains the value
# of max or not.
# If it is "include", max value is include.
# If it is "exclude", max value is not include.
#
# @return [Groonga::Client::Request::Select]
# The new request with the given condition.
def between(column_name, min, min_border, max, max_border)
parameter = FilterBetweenParameter.new(column_name, min, min_border, max, max_border)
add_parameter(FilterMerger, parameter)
end

# Adds a `in_values` condition then return a new `select`
# request object.
#
Expand Down Expand Up @@ -458,6 +499,26 @@ def initialize(expression, values)
end

# @private
class FilterBetweenParameter
include ScriptSyntaxValueEscapable

def initialize(column_name, *values)
@column_name = column_name
@values = values
end

def to_parameters
return {} if @values.empty?

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

class FilterInValuesParameter
include ScriptSyntaxValueEscapable

Expand Down
46 changes: 46 additions & 0 deletions test/request/test-select.rb
Expand Up @@ -92,6 +92,52 @@ 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_raise(ArgumentError){ between("tags") }
end

test("too much values") do
assert_raise(ArgumentError){ 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 82bc9ae

Please sign in to comment.