static mrb_value mrb_grn_expression_take_object(mrb_state *mrb, mrb_value self) { grn_ctx *ctx = (grn_ctx *)mrb->ud; grn_obj *expr; mrb_value mrb_object; grn_obj *grn_object; mrb_get_args(mrb, "o", &mrb_object); expr = DATA_PTR(self); grn_object = DATA_PTR(mrb_object); grn_expr_take_obj(ctx, expr, grn_object); return mrb_object; }
/* * _object_ を追加し、 _n_arguments_ 個の引数を取る _operation_ を追加する。 * * @overload append_object(object, operation=Groonga::Operator::PUSH, n_arguments=1) * @param [Object] object 追加するオブジェクト * @param [Groonga::Operator::XXX] operation 追加する _operation_ * @param [Integer] n_arguments _operation_ の取る引数 * @return [Self] self * */ static VALUE rb_grn_expression_append_object (int argc, VALUE *argv, VALUE self) { VALUE rb_object, rb_operation, rb_n_arguments; grn_ctx *context = NULL; grn_obj *expression, *object; grn_operator operation = GRN_OP_PUSH; int n_arguments = 1; rb_scan_args(argc, argv, "12", &rb_object, &rb_operation, &rb_n_arguments); if (!NIL_P(rb_operation)) operation = RVAL2GRNOPERATOR(rb_operation); if (!NIL_P(rb_n_arguments)) n_arguments = NUM2INT(rb_n_arguments); rb_grn_expression_deconstruct(SELF(self), &expression, &context, NULL, NULL, NULL, NULL, NULL); if (RB_TYPE_P(rb_object, RUBY_T_HASH)) { RbGrnHashFromRubyHashData data; data.context = context; data.hash = grn_hash_create(context, NULL, GRN_TABLE_MAX_KEY_SIZE, sizeof(grn_obj), GRN_OBJ_KEY_VAR_SIZE | GRN_OBJ_TEMPORARY | GRN_HASH_TINY); grn_expr_take_obj(context, expression, (grn_obj *)(data.hash)); data.rb_hash = rb_object; rb_hash_foreach(rb_object, rb_grn_hash_from_ruby_hash_body, (VALUE)&data); grn_expr_append_obj(context, expression, (grn_obj *)(data.hash), operation, n_arguments); } else { object = RVAL2GRNOBJECT(rb_object, &context); grn_expr_append_obj(context, expression, object, operation, n_arguments); } rb_grn_context_check(context, self); rb_ary_push(rb_iv_get(self, "@objects"), rb_object); return self; }