Kouhei Sutou
null+****@clear*****
Fri Feb 10 16:03:52 JST 2017
Kouhei Sutou 2017-02-10 16:03:52 +0900 (Fri, 10 Feb 2017) New Revision: 578a1cc0ff2b6455288bd05b9500572e75d6abab https://github.com/ranguba/rroonga/commit/578a1cc0ff2b6455288bd05b9500572e75d6abab Message: IndexColumn#[]: accept token Modified files: ext/groonga/rb-grn-index-column.c ext/groonga/rb-grn-utils.c Modified: ext/groonga/rb-grn-index-column.c (+49 -22) =================================================================== --- ext/groonga/rb-grn-index-column.c 2017-02-10 15:33:35 +0900 (537f9ad) +++ ext/groonga/rb-grn-index-column.c 2017-02-10 16:03:52 +0900 (ff916d8) @@ -54,11 +54,18 @@ void rb_grn_index_column_bind (RbGrnIndexColumn *rb_grn_index_column, grn_ctx *context, grn_obj *column) { + RbGrnColumn *rb_grn_column; RbGrnObject *rb_grn_object; - rb_grn_column_bind(RB_GRN_COLUMN(rb_grn_index_column), context, column); - rb_grn_object = RB_GRN_OBJECT(rb_grn_index_column); + rb_grn_column = RB_GRN_COLUMN(rb_grn_index_column); + rb_grn_column_bind(rb_grn_column, context, column); + + grn_obj_reinit(context, + rb_grn_column->value, + GRN_DB_UINT32, + 0); + rb_grn_object = RB_GRN_OBJECT(rb_grn_index_column); rb_grn_index_column->old_value = grn_obj_open(context, GRN_BULK, 0, rb_grn_object->range_id); rb_grn_index_column->set_value = @@ -191,6 +198,38 @@ rb_grn_index_column_inspect (VALUE self) return inspected; } +static VALUE +rb_grn_index_column_array_reference (VALUE self, VALUE rb_token) +{ + grn_ctx *context = NULL; + grn_obj *column; + grn_obj *domain; + grn_id token_id; + grn_obj *value; + VALUE rb_value; + + rb_grn_index_column_deconstruct(SELF(self), + &column, + &context, + NULL, + &domain, + &value, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL); + + token_id = RVAL2GRNID(rb_token, context, domain, self); + GRN_BULK_REWIND(value); + grn_obj_get_value(context, column, token_id, value); + rb_grn_context_check(context, self); + rb_value = GRNVALUE2RVAL(context, value, NULL, self); + + return rb_value; +} + /* * Adds a record that has @value@ content to inverted index for fast * fulltext serach. Normally, this method is not used @@ -964,6 +1003,7 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self) grn_ctx *context; grn_obj *column; grn_column_flags column_flags; + grn_obj *domain_object; grn_obj *range_object; grn_table_cursor *table_cursor = NULL; grn_id token_id = GRN_ID_NIL; @@ -978,7 +1018,7 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self) VALUE rb_cursor; rb_grn_index_column_deconstruct(SELF(self), &column, &context, - NULL, NULL, + NULL, &domain_object, NULL, NULL, NULL, NULL, &range_object, NULL, NULL); @@ -996,26 +1036,9 @@ rb_grn_index_column_open_cursor (int argc, VALUE *argv, VALUE self) rb_cGrnTableCursor))) { VALUE rb_table_cursor = rb_table_cursor_or_token; table_cursor = RVAL2GRNTABLECURSOR(rb_table_cursor, NULL); - } else if (CBOOL2RVAL(rb_obj_is_kind_of(rb_table_cursor_or_token, - rb_cInteger))) { - VALUE rb_token_id = rb_table_cursor_or_token; - token_id = NUM2UINT(rb_token_id); - } else if (CBOOL2RVAL(rb_obj_is_kind_of(rb_table_cursor_or_token, - rb_cGrnRecord))) { - VALUE rb_token = rb_table_cursor_or_token; - token_id = NUM2UINT(rb_funcall(rb_token, rb_intern("id"), 0)); } else { - VALUE rb_token_key = rb_table_cursor_or_token; - VALUE rb_token; - - rb_token = rb_funcall(rb_lexicon, rb_intern("[]"), 1, rb_token_key); - if (NIL_P(rb_token)) { - rb_raise(rb_eArgError, - "nonexistent token key: %" PRIsVALUE ": %" PRIsVALUE, - rb_token_key, - self); - } - token_id = NUM2UINT(rb_funcall(rb_token, rb_intern("id"), 0)); + VALUE rb_token = rb_table_cursor_or_token; + token_id = RVAL2GRNID(rb_token, context, domain_object, self); } column_flags = grn_column_get_flags(context, column); @@ -1392,6 +1415,10 @@ rb_grn_init_index_column (VALUE mGrn) rb_define_method(rb_cGrnIndexColumn, "inspect", rb_grn_index_column_inspect, 0); + rb_define_method(rb_cGrnIndexColumn, "[]", + rb_grn_index_column_array_reference, 1); + rb_undef_method(rb_cGrnIndexColumn, "[]="); + rb_define_method(rb_cGrnIndexColumn, "add", rb_grn_index_column_add, -1); rb_define_method(rb_cGrnIndexColumn, "delete", Modified: ext/groonga/rb-grn-utils.c (+35 -7) =================================================================== --- ext/groonga/rb-grn-utils.c 2017-02-10 15:33:35 +0900 (434e174) +++ ext/groonga/rb-grn-utils.c 2017-02-10 16:03:52 +0900 (a55cace) @@ -1061,13 +1061,37 @@ rb_grn_value_to_ruby_object (grn_ctx *context, grn_id rb_grn_id_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *table, - VALUE related_object) + VALUE rb_related_object) { VALUE rb_id; if (NIL_P(object)) return Qnil; + if (!RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnRecord)) && + !RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cInteger))) { + VALUE rb_record; + if (table) { + VALUE rb_table; + rb_table = GRNOBJECT2RVAL(Qnil, context, table, GRN_FALSE); + if (!NIL_P(rb_table) && + RVAL2CBOOL(rb_obj_is_kind_of(rb_table, + rb_mGrnTableKeySupport))) { + rb_record = rb_funcall(rb_table, rb_intern("[]"), 1, object); + if (NIL_P(rb_record)) { + rb_raise(rb_eArgError, + "nonexistent key: %" PRIsVALUE + ": %" PRIsVALUE + ": %" PRIsVALUE, + object, + rb_table, + rb_related_object); + } + object = rb_record; + } + } + } + if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnRecord))) { VALUE rb_table; rb_table = rb_funcall(object, rb_intern("table"), 0); @@ -1077,9 +1101,12 @@ rb_grn_id_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *table, rb_expected_table = GRNOBJECT2RVAL(Qnil, context, table, GRN_FALSE); rb_raise(rb_eGrnError, - "wrong table: expected <%s>: actual <%s>", - rb_grn_inspect(rb_expected_table), - rb_grn_inspect(rb_table)); + "wrong table: expected %" PRIsVALUE + ": actual %" PRIsVALUE + ": %" PRIsVALUE, + rb_expected_table, + rb_table, + rb_related_object); } rb_id = rb_funcall(object, rb_intern("id"), 0); } else { @@ -1088,9 +1115,10 @@ rb_grn_id_from_ruby_object (VALUE object, grn_ctx *context, grn_obj *table, if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_id, rb_cInteger))) rb_raise(rb_eGrnError, - "should be unsigned integer or Groogna::Record: <%s>: <%s>", - rb_grn_inspect(object), - rb_grn_inspect(related_object)); + "should be unsigned integer or Groogna::Record: %" PRIsVALUE + ": %" PRIsVALUE, + object, + rb_related_object); return NUM2UINT(rb_id); } -------------- next part -------------- HTML����������������������������...Download