Example #1
0
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);
}
Example #2
0
/*
 * _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;
}
Example #3
0
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;
}