From null at cozmixng.org Fri Jan 8 02:35:30 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Fri, 08 Jan 2010 16:35:30 +0900 Subject: [groonga-commit:861] groonga [groonga (trunk) r907] * implement Groonga::PatriciaTrie#prefix_search. Message-ID: <20100108073530.99A981D1CE8@mail.cozmixng.org> retro 2010-01-08 16:35:30 +0900 (Fri, 08 Jan 2010) New Revision: 907 Log: * implement Groonga::PatriciaTrie#prefix_search. Modified files: groonga/trunk/ext/rb-grn-patricia-trie.c groonga/trunk/test/test-patricia-trie.rb Modified: groonga/trunk/ext/rb-grn-patricia-trie.c (+40 -0) =================================================================== --- groonga/trunk/ext/rb-grn-patricia-trie.c 2009-12-22 14:35:08 +09:00 (rev 906) +++ groonga/trunk/ext/rb-grn-patricia-trie.c 2010-01-08 16:35:30 +09:00 (rev 907) @@ -1,4 +1,5 @@ /* -*- c-file-style: "ruby" -*- */ +/* vim: set sts=4 sw=4 ts=8 noet: */ /* Copyright (C) 2009 Kouhei Sutou @@ -430,6 +431,43 @@ return rb_result; } +/* + * call-seq: + * patricia_trie.prefix_search(prefix) -> Groonga::Hash + * + * ???_prefix_????????????ID????????? + * Groonga::Hash????????????????????? + * Groonga::Hash???? + * + */ +static VALUE +rb_grn_patricia_trie_prefix_search (VALUE self, VALUE rb_prefix) +{ + grn_ctx *context; + grn_obj *table, *key, *domain, *result; + grn_id domain_id; + VALUE rb_result; + + rb_grn_table_key_support_deconstruct(SELF(self), &table, &context, + &key, &domain_id, &domain, + NULL, NULL, NULL); + + result = grn_table_create(context, NULL, 0, NULL, + GRN_OBJ_TABLE_HASH_KEY, + table, 0); + rb_grn_context_check(context, self); + rb_result = GRNOBJECT2RVAL(Qnil, context, result, RB_GRN_TRUE); + + GRN_BULK_REWIND(key); + RVAL2GRNKEY(rb_prefix, context, key, domain_id, domain, self); + grn_pat_prefix_search(context, (grn_pat *)table, + GRN_BULK_HEAD(key), GRN_BULK_VSIZE(key), + (grn_hash *)result); + rb_grn_context_check(context, self); + + return rb_result; +} + void rb_grn_init_patricia_trie (VALUE mGrn) { @@ -444,4 +482,6 @@ rb_grn_patricia_trie_search, -1); rb_define_method(rb_cGrnPatriciaTrie, "scan", rb_grn_patricia_trie_scan, 1); + rb_define_method(rb_cGrnPatriciaTrie, "prefix_search", + rb_grn_patricia_trie_prefix_search, 1); } Modified: groonga/trunk/test/test-patricia-trie.rb (+21 -0) =================================================================== --- groonga/trunk/test/test-patricia-trie.rb 2009-12-22 14:35:08 +09:00 (rev 906) +++ groonga/trunk/test/test-patricia-trie.rb 2010-01-08 16:35:30 +09:00 (rev 907) @@ -158,4 +158,25 @@ end assert_equal(text, actual) end + + def test_prefix_search + paths = Groonga::PatriciaTrie.create(:name => "Paths", + :key_type => 'ShortText') + root_path = paths.add('/') + tmp_path = paths.add('/tmp') + usr_bin_path = paths.add('/usr/bin') + usr_local_bin_path = paths.add('/usr/local/bin') + + records = paths.prefix_search('/') + assert_equal(["/usr/local/bin", "/usr/bin", "/tmp", "/"], + records.records.collect {|record| record["._key"]}) + + records = paths.prefix_search('/usr') + assert_equal(["/usr/local/bin", "/usr/bin"], + records.records.collect {|record| record["._key"]}) + + records = paths.prefix_search('/usr/local') + assert_equal(["/usr/local/bin"], + records.records.collect {|record| record["._key"]}) + end end From null at cozmixng.org Fri Jan 8 19:20:27 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Sat, 09 Jan 2010 09:20:27 +0900 Subject: [groonga-commit:862] groonga [groonga (trunk) r908] * add a prefix search test for no match case. Message-ID: <20100109002027.09FBB1D1CE4@mail.cozmixng.org> retro 2010-01-09 09:20:26 +0900 (Sat, 09 Jan 2010) New Revision: 908 Log: * add a prefix search test for no match case. Modified files: groonga/trunk/test/test-patricia-trie.rb Modified: groonga/trunk/test/test-patricia-trie.rb (+4 -0) =================================================================== --- groonga/trunk/test/test-patricia-trie.rb 2010-01-08 16:27:50 +09:00 (rev 907) +++ groonga/trunk/test/test-patricia-trie.rb 2010-01-09 09:20:26 +09:00 (rev 908) @@ -178,5 +178,9 @@ records = paths.prefix_search('/usr/local') assert_equal(["/usr/local/bin"], records.records.collect {|record| record["._key"]}) + + records = paths.prefix_search('nonexistent') + assert_equal([], + records.records.collect {|record| record["._key"]}) end end From null at cozmixng.org Fri Jan 8 20:05:24 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Sat, 09 Jan 2010 10:05:24 +0900 Subject: [groonga-commit:863] groonga [groonga (trunk) r909] * support Bool. Message-ID: <20100109010524.36B6C1D1CE4@mail.cozmixng.org> retro 2010-01-09 10:05:23 +0900 (Sat, 09 Jan 2010) New Revision: 909 Log: * support Bool. Patched by Tasuku SUENAGA. Thanks!!! Modified files: groonga/trunk/ext/rb-grn-utils.c groonga/trunk/test/test-column.rb Modified: groonga/trunk/ext/rb-grn-utils.c (+22 -3) =================================================================== --- groonga/trunk/ext/rb-grn-utils.c 2010-01-09 09:19:45 +09:00 (rev 908) +++ groonga/trunk/ext/rb-grn-utils.c 2010-01-09 10:05:23 +09:00 (rev 909) @@ -1,4 +1,5 @@ /* -*- c-file-style: "ruby" -*- */ +/* vim: set sts=4 sw=4 ts=8 noet: */ /* Copyright (C) 2009 Kouhei Sutou @@ -96,6 +97,9 @@ case GRN_DB_VOID: *rb_value = rb_str_new(GRN_TEXT_VALUE(bulk), GRN_TEXT_LEN(bulk)); break; + case GRN_DB_BOOL: + *rb_value = GRN_BOOL_VALUE(bulk) ? Qtrue : Qfalse; + break; case GRN_DB_INT32: *rb_value = INT2NUM(GRN_INT32_VALUE(bulk)); break; @@ -239,6 +243,12 @@ grn_obj_reinit(context, bulk, GRN_DB_FLOAT, 0); GRN_FLOAT_SET(context, bulk, NUM2DBL(object)); break; + case T_TRUE: + GRN_BOOL_SET(context, bulk, GRN_TRUE); + break; + case T_FALSE: + GRN_BOOL_SET(context, bulk, GRN_FALSE); + break; default: if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cTime))) { VALUE sec, usec; @@ -269,7 +279,8 @@ } else { rb_raise(rb_eTypeError, "bulked object should be one of " - "[nil, String, Integer, Float, Time, Groonga::Object]: %s", + "[nil, true, false, String, Integer, Float, Time, " + "Groonga::Object]: %s", rb_grn_inspect(object)); } break; @@ -679,6 +690,14 @@ grn_obj_reinit(context, obj, GRN_DB_FLOAT, 0); GRN_FLOAT_SET(context, obj, NUM2DBL(rb_object)); break; + case T_TRUE: + grn_obj_reinit(context, obj, GRN_DB_BOOL, 0); + GRN_BOOL_SET(context, obj, GRN_TRUE); + break; + case T_FALSE: + grn_obj_reinit(context, obj, GRN_DB_BOOL, 0); + GRN_BOOL_SET(context, obj, GRN_FALSE); + break; default: if (RVAL2CBOOL(rb_obj_is_kind_of(rb_object, rb_cTime))) { VALUE sec, usec; @@ -709,8 +728,8 @@ } else { rb_raise(rb_eTypeError, "should be one of " - "[nil, String, Integer, Float, Time, Groonga::Object, " - "Groonga::Record]: <%s>", + "[nil, true, false, String, Integer, Float, Time, " + "Groonga::Object, Groonga::Record]: <%s>", rb_grn_inspect(rb_object)); } break; Modified: groonga/trunk/test/test-column.rb (+15 -1) =================================================================== --- groonga/trunk/test/test-column.rb 2010-01-09 09:19:45 +09:00 (rev 908) +++ groonga/trunk/test/test-column.rb 2010-01-09 10:05:23 +09:00 (rev 909) @@ -177,7 +177,7 @@ def test_select_query populate_table_for_select - + result = @body.select("drive") assert_equal(["Drive and Eat"], result.records.collect do |record| @@ -254,6 +254,20 @@ assert_equal(Time.at(0), post["issued"]) end + def test_bool + posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText") + hidden = posts.define_column("hidden", "Bool") + + post = posts.add("hello") + assert_false(post["hidden"]) + + post["hidden"] = true + assert_true(post["hidden"]) + + post["hidden"] = false + assert_false(post["hidden"]) + end + private def assert_content_search(expected_records, term) records = @bookmarks_index_content.search(term).records From null at cozmixng.org Fri Jan 8 20:35:24 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Sat, 09 Jan 2010 10:35:24 +0900 Subject: [groonga-commit:864] groonga [groonga (trunk) r910] * unify groonga -> Ruby conversion routine. Message-ID: <20100109013524.A00C91D1CE5@mail.cozmixng.org> retro 2010-01-09 10:35:24 +0900 (Sat, 09 Jan 2010) New Revision: 910 Log: * unify groonga -> Ruby conversion routine. Modified files: groonga/trunk/ext/rb-grn-utils.c Modified: groonga/trunk/ext/rb-grn-utils.c (+13 -78) =================================================================== --- groonga/trunk/ext/rb-grn-utils.c 2010-01-09 09:52:29 +09:00 (rev 909) +++ groonga/trunk/ext/rb-grn-utils.c 2010-01-09 10:35:24 +09:00 (rev 910) @@ -219,7 +219,7 @@ grn_obj_reinit(context, bulk, GRN_DB_VOID, 0); break; case T_STRING: - grn_obj_reinit(context, bulk, GRN_DB_TEXT, GRN_OBJ_DO_SHALLOW_COPY); + grn_obj_reinit(context, bulk, GRN_DB_TEXT, 0); GRN_TEXT_SET(context, bulk, RSTRING_PTR(object), RSTRING_LEN(object)); break; case T_FIXNUM: @@ -244,9 +244,11 @@ GRN_FLOAT_SET(context, bulk, NUM2DBL(object)); break; case T_TRUE: + grn_obj_reinit(context, bulk, GRN_DB_BOOL, 0); GRN_BOOL_SET(context, bulk, GRN_TRUE); break; case T_FALSE: + grn_obj_reinit(context, bulk, GRN_DB_BOOL, 0); GRN_BOOL_SET(context, bulk, GRN_FALSE); break; default: @@ -254,10 +256,10 @@ VALUE sec, usec; int64_t time_value; - grn_obj_reinit(context, bulk, GRN_DB_TIME, 0); sec = rb_funcall(object, rb_intern("to_i"), 0); usec = rb_funcall(object, rb_intern("usec"), 0); time_value = GRN_TIME_PACK(NUM2LL(sec), NUM2LL(usec)); + grn_obj_reinit(context, bulk, GRN_DB_TIME, 0); GRN_TIME_SET(context, bulk, time_value); } else if (RVAL2CBOOL(rb_obj_is_kind_of(object, rb_cGrnObject))) { grn_obj *grn_object; @@ -273,14 +275,14 @@ table = RVAL2GRNOBJECT(rb_funcall(object, rb_intern("table"), 0), &context); - grn_obj_reinit(context, bulk, grn_obj_id(context, table), 0); id_value = NUM2UINT(rb_funcall(object, rb_intern("id"), 0)); + grn_obj_reinit(context, bulk, grn_obj_id(context, table), 0); GRN_RECORD_SET(context, bulk, id_value); } else { rb_raise(rb_eTypeError, "bulked object should be one of " "[nil, true, false, String, Integer, Float, Time, " - "Groonga::Object]: %s", + "Groonga::Object, Groonga::Record]: %s", rb_grn_inspect(object)); } break; @@ -659,83 +661,16 @@ grn_obj * rb_grn_obj_from_ruby_object (VALUE rb_object, grn_ctx *context, grn_obj **_obj) { - grn_obj *obj; - - if (*_obj) { - obj = *_obj; - grn_obj_close(context, obj); /* FIXME: grn_obj_reinit() */ + if (RVAL2CBOOL(rb_obj_is_kind_of(rb_object, rb_cGrnObject))) { + if (*_obj) { + grn_obj_close(context, *_obj); /* TODO: reduce memory allocation */ + } + *_obj = RVAL2GRNOBJECT(rb_object, &context); } else { - *_obj = grn_obj_open(context, GRN_VOID, 0, GRN_ID_NIL); - obj = *_obj; + *_obj = RVAL2GRNBULK(rb_object, context, *_obj); } - switch (TYPE(rb_object)) { - case T_NIL: - grn_obj_reinit(context, obj, GRN_DB_VOID, 0); - break; - case T_STRING: - grn_obj_reinit(context, obj, GRN_DB_TEXT, 0); - GRN_TEXT_SET(context, obj, - RSTRING_PTR(rb_object), RSTRING_LEN(rb_object)); - break; - case T_FIXNUM: - grn_obj_reinit(context, obj, GRN_DB_INT32, 0); - GRN_INT32_SET(context, obj, NUM2INT(rb_object)); - break; - case T_BIGNUM: - grn_obj_reinit(context, obj, GRN_DB_INT64, 0); - GRN_INT64_SET(context, obj, NUM2LL(rb_object)); - break; - case T_FLOAT: - grn_obj_reinit(context, obj, GRN_DB_FLOAT, 0); - GRN_FLOAT_SET(context, obj, NUM2DBL(rb_object)); - break; - case T_TRUE: - grn_obj_reinit(context, obj, GRN_DB_BOOL, 0); - GRN_BOOL_SET(context, obj, GRN_TRUE); - break; - case T_FALSE: - grn_obj_reinit(context, obj, GRN_DB_BOOL, 0); - GRN_BOOL_SET(context, obj, GRN_FALSE); - break; - default: - if (RVAL2CBOOL(rb_obj_is_kind_of(rb_object, rb_cTime))) { - VALUE sec, usec; - int64_t time_value; - - sec = rb_funcall(rb_object, rb_intern("to_i"), 0); - usec = rb_funcall(rb_object, rb_intern("usec"), 0); - time_value = GRN_TIME_PACK(NUM2LL(sec), NUM2LL(usec)); - grn_obj_reinit(context, obj, GRN_DB_TIME, 0); - GRN_TIME_SET(context, obj, time_value); - } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_object, rb_cGrnObject))) { - grn_obj_close(context, obj); /* TODO: reduce memory allocation */ - *_obj = RVAL2GRNOBJECT(rb_object, &context); - obj = *_obj; - } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_object, rb_cGrnRecord))) { - grn_id id, table_id; - VALUE rb_table; - grn_obj *table = NULL; - - id = NUM2UINT(rb_funcall(rb_object, rb_intern("id"), 0)); - rb_table = rb_funcall(rb_object, rb_intern("table"), 0); - rb_grn_table_deconstruct(RB_GRN_TABLE(DATA_PTR(rb_table)), - &table, NULL, - NULL, NULL, NULL, NULL, NULL); - table_id = grn_obj_id(context, table); - grn_obj_reinit(context, obj, table_id, 0); - GRN_RECORD_SET(context, obj, id); - } else { - rb_raise(rb_eTypeError, - "should be one of " - "[nil, true, false, String, Integer, Float, Time, " - "Groonga::Object, Groonga::Record]: <%s>", - rb_grn_inspect(rb_object)); - } - break; - } - - return obj; + return *_obj; } VALUE From null at cozmixng.org Fri Jan 8 20:35:26 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Sat, 09 Jan 2010 10:35:26 +0900 Subject: [groonga-commit:865] groonga [groonga (trunk) r911] * use the current groonga type name. Message-ID: <20100109013526.1451A1D1CE8@mail.cozmixng.org> retro 2010-01-09 10:35:25 +0900 (Sat, 09 Jan 2010) New Revision: 911 Log: * use the current groonga type name. Modified files: groonga/trunk/test/test-array.rb Modified: groonga/trunk/test/test-array.rb (+11 -11) =================================================================== --- groonga/trunk/test/test-array.rb 2010-01-09 10:24:35 +09:00 (rev 910) +++ groonga/trunk/test/test-array.rb 2010-01-09 10:35:25 +09:00 (rev 911) @@ -41,21 +41,21 @@ end def test_add - users = Groonga::Array.create(:name => "") - users.define_column("name", "") + users = Groonga::Array.create(:name => "Users") + users.define_column("name", "Text") me = users.add(:name => "me") assert_equal("me", me[:name]) end def test_define_index_column - users = Groonga::Array.create(:name => "") - users.define_column("name", "") - bookmarks = Groonga::Array.create(:name => "") - bookmarks.define_column("title", "") + users = Groonga::Array.create(:name => "Users") + users.define_column("name", "Text") + bookmarks = Groonga::Array.create(:name => "Bookmarks") + bookmarks.define_column("title", "Text") bookmarks.define_column("user", users) index = users.define_index_column("bookmarks", bookmarks, - :source => ".user") + :source => "Bookmarks.user") morita = users.add(:name => "morita") gunyara_kun = users.add(:name => "gunyara-kun") groonga = bookmarks.add(:title => "groonga", :user => morita) @@ -67,15 +67,15 @@ end def test_create_duplicated_name - Groonga::Array.create(:name => "") + Groonga::Array.create(:name => "Users") assert_raise(Groonga::InvalidArgument) do - Groonga::Array.create(:name => "") + Groonga::Array.create(:name => "Users") end end def test_open_same_name - users_created = Groonga::Array.create(:name => "") - users_opened = Groonga::Array.open(:name => "") + users_created = Groonga::Array.create(:name => "Users") + users_opened = Groonga::Array.open(:name => "Users") users_opened.add assert_equal(1, users_created.size) end From null at cozmixng.org Sat Jan 9 00:50:37 2010 From: null at cozmixng.org (null at cozmixng.org) Date: Sat, 09 Jan 2010 14:50:37 +0900 Subject: [groonga-commit:866] groonga [groonga (trunk) r912] * use the current groonga type name. Message-ID: <20100109055037.A9EF41D1CE5@mail.cozmixng.org> retro 2010-01-09 14:50:37 +0900 (Sat, 09 Jan 2010) New Revision: 912 Log: * use the current groonga type name. Modified files: groonga/trunk/test/test-column.rb Modified: groonga/trunk/test/test-column.rb (+31 -31) =================================================================== --- groonga/trunk/test/test-column.rb 2010-01-09 10:34:12 +09:00 (rev 911) +++ groonga/trunk/test/test-column.rb 2010-01-09 14:50:37 +09:00 (rev 912) @@ -26,31 +26,31 @@ def setup_users_table @users_path = @tables_dir + "users" - @users = Groonga::Array.create(:name => "users", + @users = Groonga::Array.create(:name => "Users", :path => @users_path.to_s) @users_name_column_path = @columns_dir + "name" @users_name_column = - @users.define_column("name", "", + @users.define_column("name", "ShortText", :path => @users_name_column_path.to_s) end def setup_bookmarks_table @bookmarks_path = @tables_dir + "bookmarks" - @bookmarks = Groonga::Array.create(:name => "bookmarks", + @bookmarks = Groonga::Array.create(:name => "Bookmarks", :path => @bookmarks_path.to_s) @uri_column_path = @columns_dir + "uri" - @bookmarks_uri = @bookmarks.define_column("uri", "", + @bookmarks_uri = @bookmarks.define_column("uri", "ShortText", :path => @uri_column_path.to_s) @comment_column_path = @columns_dir + "comment" @bookmarks_comment = - @bookmarks.define_column("comment", "", + @bookmarks.define_column("comment", "Text", :path => @comment_column_path.to_s) @content_column_path = @columns_dir + "content" - @bookmarks_content = @bookmarks.define_column("content", "") + @bookmarks_content = @bookmarks.define_column("content", "LongText") @user_column_path = @columns_dir + "user" @bookmarks_user = @bookmarks.define_column("user", @users) @@ -117,16 +117,16 @@ end def test_accessor - posts = Groonga::Hash.create(:name => "", :key_type => "") - posts.define_column("body", "") - comments = Groonga::Hash.create(:name => "", - :key_type => "") - content = comments.define_column("content", "") + posts = Groonga::Hash.create(:name => "Posts", :key_type => "ShortText") + posts.define_column("body", "Text") + comments = Groonga::Hash.create(:name => "Comments", + :key_type => "ShortText") + content = comments.define_column("content", "ShortText") comments.define_column("post", posts) - index = Groonga::PatriciaTrie.create(:name => "", - :key_type => "") - index.default_tokenizer = "" + index = Groonga::PatriciaTrie.create(:name => "Terms", + :key_type => "ShortText") + index.default_tokenizer = "TokenBigram" content_index = index.define_index_column("content_index", comments, :with_position => true) content_index.source = content @@ -158,20 +158,20 @@ end def test_array_set_with_key_of_table - users = Groonga::Hash.create(:name => "", - :key_type => "ShortText") - bookmarks = Groonga::Hash.create(:name => "") - bookmarks.define_column("user", users) + languages = Groonga::Hash.create(:name => "Languages", + :key_type => "ShortText") + sites = Groonga::Hash.create(:name => "Sites") + sites.define_column("language", languages) - users.add("morita") - groonga = bookmarks.add("http://groonga.org/", :user => "morita") - assert_equal("morita", groonga[:user].key) + languages.add("Ruby") + taiyaki_ru = sites.add("http://taiyaki.ru/", :language => "Ruby") + assert_equal("Ruby", taiyaki_ru[:language].key) end def test_local_name - items = Groonga::Array.create(:name => "") - title = items.define_column("title", "") - assert_equal(".title", title.name) + items = Groonga::Array.create(:name => "Items") + title = items.define_column("title", "ShortText") + assert_equal("Items.title", title.name) assert_equal("title", title.local_name) end @@ -235,8 +235,8 @@ end def test_set_time - posts = Groonga::Hash.create(:name => "", :key_type => "") - body = posts.define_column("issued", "