ext/rb-grn-column.c in groonga-0.0.1 vs ext/rb-grn-column.c in groonga-0.0.2
- old
+ new
@@ -16,17 +16,40 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "rb-grn.h"
-#define SELF(object, context) (RVAL2GRNCOLUMN(object, context))
+#define SELF(object) ((RbGrnColumn *)DATA_PTR(object))
VALUE rb_cGrnColumn;
-VALUE rb_cGrnFixSizeColumn;
VALUE rb_cGrnVarSizeColumn;
-VALUE rb_cGrnIndexColumn;
+/*
+ * Document-class: Groonga::Column < Groonga::Object
+ *
+ * テーブルに情報を付加するためのオブジェクト。テーブルに複
+ * 数のカラムを定義することによりレコード毎に複数の情報を付
+ * 加することができる。
+ *
+ * カラムには大きく分けて3種類ある。
+ * [Groonga::FixSizeColumn]
+ * 固定長のデータを格納するカラム。
+ * [Groonga::VarSizeColumn]
+ * 可変長のデータを格納するカラム。
+ * [Groonga::IndexColumn]
+ * 転置インデックスを格納するカラム。全文検索や参照元レコー
+ * ドの検索を行う場合はこのカラムを使用する。
+ *
+ * 固定長データ用カラム・可変長データ用カラムは1つのデータだ
+ * けを格納するか複数のデータを格納するかを選ぶことができる。
+ * 1つのデータの場合はスカラ値、複数のデータの場合はスカラー
+ * 値を格納するという。
+ *
+ * カラムは名前を持ち、1つのテーブルでは同じカラム名を持つカ
+ * ラムを複数定義することはできない。
+ */
+
grn_obj *
rb_grn_column_from_ruby_object (VALUE object, grn_ctx **context)
{
if (!RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnColumn))) {
rb_raise(rb_eTypeError, "not a groonga column");
@@ -40,234 +63,40 @@
rb_grn_boolean owner)
{
return GRNOBJECT2RVAL(klass, context, column, owner);
}
+/*
+ * call-seq:
+ * column.table -> Groonga::Table
+ *
+ * カラムが所属するテーブルを返す。
+ */
static VALUE
-rb_grn_fix_size_column_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
-{
- grn_ctx *context = NULL;
- grn_obj *column;
- grn_id range;
- grn_obj *range_object = NULL;
- grn_rc rc;
- grn_id id;
- grn_obj value;
-
- column = SELF(self, &context);
- id = NUM2UINT(rb_id);
-
- range = grn_obj_get_range(context, column);
- if (range != GRN_ID_NIL)
- range_object = grn_ctx_get(context, range);
-
- if (RVAL2CBOOL(rb_obj_is_kind_of(rb_value, rb_cGrnRecord))) {
- VALUE rb_id, rb_table;
- grn_obj *table;
-
- if (!range_object)
- rb_raise(rb_eArgError,
- "%s isn't associated with any table: %s",
- rb_grn_inspect(self), rb_grn_inspect(rb_value));
-
- rb_id = rb_funcall(rb_value, rb_intern("id"), 0);
- rb_table = rb_funcall(rb_value, rb_intern("table"), 0);
- table = RVAL2GRNTABLE(rb_table, &context);
- if (grn_obj_id(context, table) != range)
- rb_raise(rb_eArgError,
- "%s isn't associated with passed record's table: %s",
- rb_grn_inspect(self),
- rb_grn_inspect(rb_value));
-
- RVAL2GRNUVECTOR(rb_ary_new3(1, rb_id), context, &value);
- } else if (range_object &&
- RVAL2CBOOL(rb_obj_is_kind_of(rb_value, rb_cInteger))) {
- switch (range_object->header.type) {
- case GRN_TABLE_PAT_KEY:
- case GRN_TABLE_HASH_KEY:
- case GRN_TABLE_NO_KEY:
- RVAL2GRNUVECTOR(rb_ary_new3(1, rb_value), context, &value);
- break;
- default:
- RVAL2GRNBULK(rb_value, context, &value);
- break;
- }
- } else {
- RVAL2GRNBULK(rb_value, context, &value);
- }
-
- rc = grn_obj_set_value(context, column, id, &value, GRN_OBJ_SET);
- grn_obj_close(context, &value);
- rb_grn_rc_check(rc, self);
-
- return Qnil;
-}
-
-static VALUE
-rb_grn_index_column_array_set (VALUE self, VALUE rb_id, VALUE rb_value)
-{
- grn_ctx *context = NULL;
- grn_obj *column;
- grn_rc rc;
- grn_id id;
- unsigned int section;
- grn_obj old_value, new_value;
- VALUE rb_section, rb_old_value, rb_new_value;
-
- column = SELF(self, &context);
-
- id = NUM2UINT(rb_id);
-
- if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_value, rb_cHash))) {
- VALUE hash_value;
- hash_value = rb_hash_new();
- rb_hash_aset(hash_value, RB_GRN_INTERN("value"), rb_value);
- rb_value = hash_value;
- }
-
- rb_grn_scan_options(rb_value,
- "section", &rb_section,
- "old_value", &rb_old_value,
- "value", &rb_new_value,
- NULL);
-
- if (NIL_P(rb_section))
- section = 1;
- else
- section = NUM2UINT(rb_section);
-
- RVAL2GRNBULK(rb_old_value, context, &old_value);
- RVAL2GRNBULK(rb_new_value, context, &new_value);
-
- rc = grn_column_index_update(context, column,
- id, section, &old_value, &new_value);
- grn_obj_close(context, &old_value);
- grn_obj_close(context, &new_value);
-
- rb_grn_rc_check(rc, self);
-
- return Qnil;
-}
-
-static VALUE
rb_grn_column_get_table (VALUE self)
{
grn_ctx *context = NULL;
grn_obj *column;
grn_obj *table;
- column = SELF(self, &context);
+ rb_grn_object_deconstruct((RbGrnObject *)(SELF(self)), &column, &context,
+ NULL, NULL,
+ NULL, NULL);
table = grn_column_table(context, column);
rb_grn_context_check(context, self);
return GRNOBJECT2RVAL(Qnil, context, table, RB_GRN_FALSE);
}
-static VALUE
-rb_grn_index_column_get_sources (VALUE self)
-{
- grn_ctx *context = NULL;
- grn_obj *column;
- grn_obj sources;
- grn_id *source_ids;
- VALUE rb_sources;
- int i, n;
-
- column = SELF(self, &context);
-
- grn_obj_get_info(context, column, GRN_INFO_SOURCE, &sources);
- rb_grn_context_check(context, self);
-
- n = GRN_BULK_VSIZE(&sources) / sizeof(grn_id);
- source_ids = (grn_id *)GRN_BULK_HEAD(&sources);
- rb_sources = rb_ary_new2(n);
- for (i = 0; i < n; i++) {
- grn_obj *source;
- VALUE rb_source;
-
- source = grn_ctx_get(context, *source_ids);
- rb_source = GRNOBJECT2RVAL(Qnil, context, source, RB_GRN_FALSE);
- rb_ary_push(rb_sources, rb_source);
- source_ids++;
- }
-
- return rb_sources;
-}
-
-static VALUE
-rb_grn_index_column_set_sources (VALUE self, VALUE rb_sources)
-{
- grn_ctx *context = NULL;
- grn_obj *column;
- int i, n;
- VALUE *rb_source_values;
- grn_id *sources;
- grn_rc rc;
-
- column = SELF(self, &context);
-
- n = RARRAY_LEN(rb_sources);
- rb_source_values = RARRAY_PTR(rb_sources);
- sources = ALLOCA_N(grn_id, n);
- for (i = 0; i < n; i++) {
- VALUE rb_source_id;
- grn_obj *source;
- grn_id source_id;
-
- rb_source_id = rb_source_values[i];
- if (CBOOL2RVAL(rb_obj_is_kind_of(rb_source_id, rb_cInteger))) {
- source_id = NUM2UINT(rb_source_id);
- } else {
- source = RVAL2GRNOBJECT(rb_source_id, &context);
- rb_grn_context_check(context, rb_source_id);
- source_id = grn_obj_id(context, source);
- }
- sources[i] = source_id;
- }
-
- {
- grn_obj source;
- GRN_OBJ_INIT(&source, GRN_BULK, GRN_OBJ_DO_SHALLOW_COPY);
- GRN_BULK_SET(context, &source, sources, n * sizeof(grn_id));
- rc = grn_obj_set_info(context, column, GRN_INFO_SOURCE, &source);
- }
-
- rb_grn_context_check(context, self);
- rb_grn_rc_check(rc, self);
-
- return Qnil;
-}
-
-static VALUE
-rb_grn_index_column_set_source (VALUE self, VALUE rb_source)
-{
- if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_source, rb_cArray)))
- rb_source = rb_ary_new3(1, rb_source);
-
- return rb_grn_index_column_set_sources(self, rb_source);
-}
-
void
rb_grn_init_column (VALUE mGrn)
{
rb_cGrnColumn = rb_define_class_under(mGrn, "Column", rb_cGrnObject);
- rb_cGrnFixSizeColumn =
- rb_define_class_under(mGrn, "FixSizeColumn", rb_cGrnColumn);
+
rb_cGrnVarSizeColumn =
rb_define_class_under(mGrn, "VarSizeColumn", rb_cGrnColumn);
- rb_cGrnIndexColumn =
- rb_define_class_under(mGrn, "IndexColumn", rb_cGrnColumn);
- rb_define_method(rb_cGrnFixSizeColumn, "[]=",
- rb_grn_fix_size_column_array_set, 2);
- rb_define_method(rb_cGrnIndexColumn, "[]=",
- rb_grn_index_column_array_set, 2);
-
rb_define_method(rb_cGrnColumn, "table", rb_grn_column_get_table, 0);
- rb_define_method(rb_cGrnIndexColumn, "sources",
- rb_grn_index_column_get_sources, 0);
- rb_define_method(rb_cGrnIndexColumn, "sources=",
- rb_grn_index_column_set_sources, 1);
- rb_define_method(rb_cGrnIndexColumn, "source=",
- rb_grn_index_column_set_source, 1);
+ rb_grn_init_fix_size_column(mGrn);
+ rb_grn_init_index_column(mGrn);
}