ext/rb-grn-column.c in groonga-0.0.2 vs ext/rb-grn-column.c in groonga-0.0.3

- old
+ new

@@ -19,11 +19,10 @@ #include "rb-grn.h" #define SELF(object) ((RbGrnColumn *)DATA_PTR(object)) VALUE rb_cGrnColumn; -VALUE rb_cGrnVarSizeColumn; /* * Document-class: Groonga::Column < Groonga::Object * * テーブルに情報を付加するためのオブジェクト。テーブルに複 @@ -31,11 +30,11 @@ * 加することができる。 * * カラムには大きく分けて3種類ある。 * [Groonga::FixSizeColumn] * 固定長のデータを格納するカラム。 - * [Groonga::VarSizeColumn] + * [Groonga::VariableSizeColumn] * 可変長のデータを格納するカラム。 * [Groonga::IndexColumn] * 転置インデックスを格納するカラム。全文検索や参照元レコー * ドの検索を行う場合はこのカラムを使用する。 * @@ -63,10 +62,53 @@ rb_grn_boolean owner) { return GRNOBJECT2RVAL(klass, context, column, owner); } +void +rb_grn_column_bind (RbGrnColumn *rb_column, + grn_ctx *context, grn_obj *column) +{ + RbGrnObject *rb_grn_object; + + rb_grn_object = RB_GRN_OBJECT(rb_column); + + rb_column->value = grn_obj_open(context, GRN_BULK, 0, + rb_grn_object->range_id); +} + +void +rb_grn_column_finalizer (grn_ctx *context, grn_obj *grn_object, + RbGrnColumn *rb_column) +{ + if (context && rb_column->value) + grn_obj_close(context, rb_column->value); + rb_column->value = NULL; +} + +void +rb_grn_column_deconstruct (RbGrnColumn *rb_column, + grn_obj **column, + grn_ctx **context, + grn_id *domain_id, + grn_obj **domain, + grn_obj **value, + grn_id *range_id, + grn_obj **range) +{ + RbGrnObject *rb_grn_object; + + rb_grn_object = RB_GRN_OBJECT(rb_column); + rb_grn_object_deconstruct(rb_grn_object, column, context, + domain_id, domain, + range_id, range); + + if (value) + *value = rb_column->value; +} + + /* * call-seq: * column.table -> Groonga::Table * * カラムが所属するテーブルを返す。 @@ -85,18 +127,103 @@ rb_grn_context_check(context, self); return GRNOBJECT2RVAL(Qnil, context, table, RB_GRN_FALSE); } +/* + * call-seq: + * column.local_name + * + * テーブル名を除いたカラム名を返す。 + * + * items = Groonga::Array.create(:name => "<items>") + * title = items.define_column("title", "<shorttext>") + * title.name # => "<items>.title" + * title.local_name # => "title" + */ +static VALUE +rb_grn_column_get_local_name (VALUE self) +{ + grn_ctx *context = NULL; + grn_obj *column; + int name_size; + VALUE rb_name; + + rb_grn_object_deconstruct((RbGrnObject *)(SELF(self)), &column, &context, + NULL, NULL, + NULL, NULL); + name_size = grn_column_name(context, column, NULL, 0); + if (name_size == 0) + return Qnil; + + rb_name = rb_str_buf_new(name_size); + rb_str_set_len(rb_name, name_size); + grn_column_name(context, column, RSTRING_PTR(rb_name), name_size); + return rb_name; +} + +static VALUE +rb_grn_column_select (int argc, VALUE *argv, VALUE self) +{ + grn_ctx *context; + grn_obj *table, *column, *result, *expression; + grn_operator operator = GRN_OP_OR; + grn_rc rc; + VALUE options; + VALUE rb_query, rb_name, rb_operator, rb_result; + VALUE rb_expression, builder; + + rb_scan_args(argc, argv, "11", &rb_query, &options); + + rb_grn_column_deconstruct(SELF(self), &column, &context, + NULL, NULL, + NULL, NULL, NULL); + table = grn_column_table(context, column); + + rb_grn_scan_options(options, + "operator", &rb_operator, + "result", &rb_result, + "name", &rb_name, + NULL); + + if (!NIL_P(rb_operator)) + operator = NUM2INT(rb_operator); + + if (NIL_P(rb_result)) { + result = grn_table_create(context, NULL, 0, NULL, + GRN_TABLE_HASH_KEY | GRN_OBJ_WITH_SUBREC, + table, + 0); + rb_result = GRNTABLE2RVAL(context, result, RB_GRN_TRUE); + } else { + result = RVAL2GRNTABLE(rb_result, &context); + } + + builder = rb_grn_column_expression_builder_new(self, rb_name, rb_query); + rb_expression = rb_grn_column_expression_builder_build(builder); + + rb_grn_object_deconstruct(RB_GRN_OBJECT(DATA_PTR(rb_expression)), + &expression, NULL, + NULL, NULL, NULL, NULL); + + rc = grn_table_select(context, table, expression, result, operator); + rb_grn_context_check(context, self); + rb_grn_rc_check(rc, self); + + return rb_result; +} + void rb_grn_init_column (VALUE mGrn) { rb_cGrnColumn = rb_define_class_under(mGrn, "Column", rb_cGrnObject); - rb_cGrnVarSizeColumn = - rb_define_class_under(mGrn, "VarSizeColumn", rb_cGrnColumn); - rb_define_method(rb_cGrnColumn, "table", rb_grn_column_get_table, 0); + rb_define_method(rb_cGrnColumn, "local_name", + rb_grn_column_get_local_name, 0); + rb_define_method(rb_cGrnColumn, "select", rb_grn_column_select, -1); + rb_grn_init_fix_size_column(mGrn); + rb_grn_init_variable_size_column(mGrn); rb_grn_init_index_column(mGrn); }