Navigation Menu

Skip to content

Commit

Permalink
Add Groonga::LessOperator#exec
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Apr 13, 2015
1 parent 827ba1f commit 0c91f82
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 1 deletion.
85 changes: 85 additions & 0 deletions ext/groonga/rb-grn-less-operator.c
@@ -0,0 +1,85 @@
/* -*- coding: utf-8; mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
Copyright (C) 2015 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
License version 2.1 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "rb-grn.h"

VALUE rb_cGrnLessOperator;

/*
* Executes a less operation.
*
* @example Executes less operations with the default context
* Groonga::Operator::LESS.exec(1, 2) # => true
* Groonga::Operator::LESS.exec(2, 1) # => false
*
* @example Executes less operations with the specified context
* context = Groonga::Context.new
* Groonga::Operator::LESS.exec(1, 2,
* :context => context) # => true
* Groonga::Operator::LESS.exec(2, 1,
* :context => context) # => false
*
* @overload exec(x, y, options={})
* @param x [::Object] The left hand side value.
* @param y [::Object] The right hand side value.
* @param options [::Hash] The options.
* @option options [Groonga::Context] (Groonga::Context.default)
* The context to executes the operation.
* @return [Boolean] `true` if `x` is less than `y`, `false`
* otherwise.
*/
static VALUE
rb_grn_less_operator_exec (int argc, VALUE *argv, VALUE self)
{
grn_bool less;
VALUE rb_x;
VALUE rb_y;
VALUE rb_options;
VALUE rb_context;
grn_ctx *context;
grn_obj x;
grn_obj y;

rb_scan_args(argc, argv, "21", &rb_x, &rb_y, &rb_options);

rb_grn_scan_options(rb_options,
"context", &rb_context,
NULL);
context = rb_grn_context_ensure(&rb_context);

GRN_VOID_INIT(&x);
GRN_VOID_INIT(&y);
RVAL2GRNBULK(rb_x, context, &x);
RVAL2GRNBULK(rb_y, context, &y);
less = grn_operator_exec_less(context, &x, &y);
GRN_OBJ_FIN(context, &x);
GRN_OBJ_FIN(context, &y);

return CBOOL2RVAL(less);
}

void
rb_grn_init_less_operator (VALUE mGrn)
{
rb_cGrnLessOperator = rb_define_class_under(mGrn,
"LessOperator",
rb_cGrnOperator);

rb_define_method(rb_cGrnLessOperator, "exec",
rb_grn_less_operator_exec, -1);
}
3 changes: 2 additions & 1 deletion ext/groonga/rb-grn-operator.c
Expand Up @@ -303,6 +303,7 @@ rb_grn_init_operator (VALUE mGrn)

rb_grn_init_equal_operator(mGrn);
rb_grn_init_not_equal_operator(mGrn);
rb_grn_init_less_operator(mGrn);

rb_define_const(rb_cGrnOperator, "PUSH",
rb_funcall(rb_cGrnOperator, rb_intern("new"), 2,
Expand Down Expand Up @@ -434,7 +435,7 @@ rb_grn_init_operator (VALUE mGrn)
rb_str_new_cstr("not-equal"),
UINT2NUM(GRN_OP_NOT_EQUAL)));
rb_define_const(rb_cGrnOperator, "LESS",
rb_funcall(rb_cGrnOperator, rb_intern("new"), 2,
rb_funcall(rb_cGrnLessOperator, rb_intern("new"), 2,
rb_str_new_cstr("less"),
UINT2NUM(GRN_OP_LESS)));
rb_define_const(rb_cGrnOperator, "GREATER",
Expand Down
2 changes: 2 additions & 0 deletions ext/groonga/rb-grn.h
Expand Up @@ -288,6 +288,7 @@ RB_GRN_VAR VALUE rb_cGrnVariable;
RB_GRN_VAR VALUE rb_cGrnOperator;
RB_GRN_VAR VALUE rb_cGrnEqualOperator;
RB_GRN_VAR VALUE rb_cGrnNotEqualOperator;
RB_GRN_VAR VALUE rb_cGrnLessOperator;
RB_GRN_VAR VALUE rb_cGrnExpression;
RB_GRN_VAR VALUE rb_cGrnRecordExpressionBuilder;
RB_GRN_VAR VALUE rb_cGrnColumnExpressionBuilder;
Expand Down Expand Up @@ -329,6 +330,7 @@ void rb_grn_init_variable (VALUE mGrn);
void rb_grn_init_operator (VALUE mGrn);
void rb_grn_init_equal_operator (VALUE mGrn);
void rb_grn_init_not_equal_operator (VALUE mGrn);
void rb_grn_init_less_operator (VALUE mGrn);
void rb_grn_init_expression (VALUE mGrn);
void rb_grn_init_expression_builder (VALUE mGrn);
void rb_grn_init_logger (VALUE mGrn);
Expand Down
18 changes: 18 additions & 0 deletions test/test-operator.rb
Expand Up @@ -62,4 +62,22 @@ class OperatorTest < Test::Unit::TestCase
end
end
end

sub_test_case "less" do
sub_test_case "#exec" do
test "less" do
assert_true(Groonga::Operator::LESS.exec(1, 2))
end

test "greater" do
assert_false(Groonga::Operator::LESS.exec(2, 1))
end

test ":context" do
context = Groonga::Context.new
assert_true(Groonga::Operator::LESS.exec(1, 2,
:context => context))
end
end
end
end

0 comments on commit 0c91f82

Please sign in to comment.