static void rb_grn_add_vector_element (VALUE rb_element, grn_ctx *context, grn_obj *vector, grn_obj *value_buffer) { unsigned int weight = 0; if (RVAL2CBOOL(rb_obj_is_kind_of(rb_element, rb_cHash))) { VALUE rb_value; VALUE rb_weight; ID id_value; ID id_weight; CONST_ID(id_value, "value"); CONST_ID(id_weight, "weight"); rb_value = rb_hash_aref(rb_element, ID2SYM(id_value)); rb_weight = rb_hash_aref(rb_element, ID2SYM(id_weight)); RVAL2GRNOBJ(rb_value, context, &value_buffer); if (!NIL_P(rb_weight)) { weight = NUM2UINT(rb_weight); } } else { RVAL2GRNOBJ(rb_element, context, &value_buffer); } grn_vector_add_element(context, vector, GRN_BULK_HEAD(value_buffer), GRN_BULK_VSIZE(value_buffer), weight, value_buffer->header.domain); }
/* * _constant_ を追加し、 _n_arguments_ 個の引数を取る _operation_ を追加する。 * * @overload append_constant(constant, operation=Groonga::Operator::PUSH, n_arguments=1) * @param [Object] constant 追加する _constant_ * @param [Groonga::Operator::XXX] operation 追加する _operation_ * @param [Integer] n_arguments _operation_ の取る引数 * @return [Self] self */ static VALUE rb_grn_expression_append_constant (int argc, VALUE *argv, VALUE self) { VALUE rb_constant, rb_operator, rb_n_arguments; VALUE exception; grn_ctx *context = NULL; grn_obj *expression, *constant = NULL; grn_operator operator = GRN_OP_PUSH; int n_arguments = 1; rb_scan_args(argc, argv, "12", &rb_constant, &rb_operator, &rb_n_arguments); if (!NIL_P(rb_operator)) operator = RVAL2GRNOPERATOR(rb_operator); 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); RVAL2GRNOBJ(rb_constant, context, &constant); grn_expr_append_const(context, expression, constant, operator, n_arguments); exception = rb_grn_context_to_exception(context, self); grn_obj_unlink(context, constant); if (!NIL_P(exception)) rb_exc_raise(exception); return self; }
grn_obj * rb_grn_vector_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *vector) { VALUE *values; grn_obj value; int i, n; if (vector) GRN_OBJ_INIT(vector, GRN_VECTOR, 0, GRN_ID_NIL); else vector = grn_obj_open(context, GRN_VECTOR, 0, 0); if (NIL_P(object)) return vector; GRN_VOID_INIT(&value); n = RARRAY_LEN(object); values = RARRAY_PTR(object); for (i = 0; i < n; i++) { grn_obj *_value = &value; RVAL2GRNOBJ(values[i], context, &_value); grn_vector_add_element(context, vector, GRN_BULK_HEAD(&value), GRN_BULK_VSIZE(&value), 0, value.header.domain); } GRN_OBJ_FIN(context, &value); return vector; }