null+****@clear*****
null+****@clear*****
2010年 7月 23日 (金) 16:36:41 JST
Kouhei Sutou 2010-07-23 07:36:41 +0000 (Fri, 23 Jul 2010) New Revision: 6dda9b050a2ba7d069987a9ada500c819e8390b8 Log: support pat key cursor inspection. Modified files: lib/pat.c lib/pat.h lib/util.c lib/util.h test/unit/core/test-inspect.c Modified: lib/pat.c (+95 -12) =================================================================== --- lib/pat.c 2010-07-23 05:03:58 +0000 (338c98d) +++ lib/pat.c 2010-07-23 07:36:41 +0000 (0efe1fd) @@ -1751,12 +1751,15 @@ set_cursor_near(grn_ctx *ctx, grn_pat *pat, grn_pat_cursor *c, } } check = ch; - if (nth_bit((uint8_t *)key, check, pat->key_size)) { - if (check >= min) { push(c, node->lr[0], check); } - id = node->lr[1]; + if (check == 0) { } else { - if (check >= min) { push(c, node->lr[1], check); } - id = node->lr[0]; + if (nth_bit((uint8_t *)key, check, pat->key_size)) { + if (check >= min) { push(c, node->lr[0], check); } + id = node->lr[1]; + } else { + if (check >= min) { push(c, node->lr[1], check); } + id = node->lr[0]; + } } } return GRN_SUCCESS; @@ -2218,6 +2221,18 @@ grn_pat_check(grn_ctx *ctx, grn_pat *pat) } static void +grn_pat_inspect_check(grn_ctx *ctx, grn_obj *buf, int check) +{ + GRN_TEXT_PUTS(ctx, buf, "{"); + grn_text_lltoa(ctx, buf, check >> 4); + GRN_TEXT_PUTS(ctx, buf, ","); + grn_text_lltoa(ctx, buf, (check >> 1) & 7); + GRN_TEXT_PUTS(ctx, buf, ","); + grn_text_lltoa(ctx, buf, check & 1); + GRN_TEXT_PUTS(ctx, buf, "}"); +} + +static void grn_pat_inspect_node(grn_ctx *ctx, grn_pat *pat, grn_id id, int check, grn_obj *key_buf, int indent, const char *prefix, grn_obj *buf) @@ -2246,13 +2261,7 @@ grn_pat_inspect_node(grn_ctx *ctx, grn_pat *pat, grn_id id, int check, grn_inspect(ctx, buf, key_buf); GRN_TEXT_PUTS(ctx, buf, ")"); - GRN_TEXT_PUTS(ctx, buf, "{"); - grn_text_lltoa(ctx, buf, c >> 4); - GRN_TEXT_PUTS(ctx, buf, ","); - grn_text_lltoa(ctx, buf, (c >> 1) & 7); - GRN_TEXT_PUTS(ctx, buf, ","); - grn_text_lltoa(ctx, buf, c & 1); - GRN_TEXT_PUTS(ctx, buf, "}"); + grn_pat_inspect_check(ctx, buf, c); GRN_TEXT_PUTS(ctx, buf, "["); key = pat_node_get_key(ctx, pat, node); @@ -2296,3 +2305,77 @@ grn_pat_inspect_nodes(grn_ctx *ctx, grn_pat *pat, grn_obj *buf) } GRN_TEXT_PUTS(ctx, buf, "}"); } + +static void +grn_pat_cursor_inspect_entries(grn_ctx *ctx, grn_pat_cursor *c, grn_obj *buf) +{ + int i; + GRN_TEXT_PUTS(ctx, buf, "["); + for (i = 0; i < c->sp; i++) { + grn_pat_cursor_entry *e = c->ss + i; + if (i != 0) { + GRN_TEXT_PUTS(ctx, buf, ", "); + } + GRN_TEXT_PUTS(ctx, buf, "["); + grn_text_lltoa(ctx, buf, e->id); + GRN_TEXT_PUTS(ctx, buf, ","); + grn_pat_inspect_check(ctx, buf, e->check); + GRN_TEXT_PUTS(ctx, buf, "]"); + } + GRN_TEXT_PUTS(ctx, buf, "]"); +} + +void +grn_pat_cursor_inspect(grn_ctx *ctx, grn_pat_cursor *c, grn_obj *buf) +{ + GRN_TEXT_PUTS(ctx, buf, "#<cursor:pat:"); + grn_inspect_name(ctx, buf, (grn_obj *)(c->pat)); + + GRN_TEXT_PUTS(ctx, buf, " "); + GRN_TEXT_PUTS(ctx, buf, "current:"); + grn_text_lltoa(ctx, buf, c->curr_rec); + + GRN_TEXT_PUTS(ctx, buf, " "); + GRN_TEXT_PUTS(ctx, buf, "tail:"); + grn_text_lltoa(ctx, buf, c->tail); + + GRN_TEXT_PUTS(ctx, buf, " "); + GRN_TEXT_PUTS(ctx, buf, "flags:"); + if (c->obj.header.flags & GRN_CURSOR_PREFIX) { + GRN_TEXT_PUTS(ctx, buf, "prefix"); + } else { + if (c->obj.header.flags & GRN_CURSOR_DESCENDING) { + GRN_TEXT_PUTS(ctx, buf, "descending"); + } else { + GRN_TEXT_PUTS(ctx, buf, "ascending"); + } + GRN_TEXT_PUTS(ctx, buf, "|"); + if (c->obj.header.flags & GRN_CURSOR_GT) { + GRN_TEXT_PUTS(ctx, buf, "greater-than"); + } else { + GRN_TEXT_PUTS(ctx, buf, "greater"); + } + GRN_TEXT_PUTS(ctx, buf, "|"); + if (c->obj.header.flags & GRN_CURSOR_LT) { + GRN_TEXT_PUTS(ctx, buf, "less-than"); + } else { + GRN_TEXT_PUTS(ctx, buf, "less"); + } + if (c->obj.header.flags & GRN_CURSOR_BY_ID) { + GRN_TEXT_PUTS(ctx, buf, "|by-id"); + } + if (c->obj.header.flags & GRN_CURSOR_BY_KEY) { + GRN_TEXT_PUTS(ctx, buf, "|by-key"); + } + } + + GRN_TEXT_PUTS(ctx, buf, " "); + GRN_TEXT_PUTS(ctx, buf, "rest:"); + grn_text_lltoa(ctx, buf, c->rest); + + GRN_TEXT_PUTS(ctx, buf, " "); + GRN_TEXT_PUTS(ctx, buf, "entries:"); + grn_pat_cursor_inspect_entries(ctx, c, buf); + + GRN_TEXT_PUTS(ctx, buf, ">"); +} Modified: lib/pat.h (+1 -0) =================================================================== --- lib/pat.h 2010-07-23 05:03:58 +0000 (b98507b) +++ lib/pat.h 2010-07-23 07:36:41 +0000 (62e8db5) @@ -97,6 +97,7 @@ const char *grn_pat_get_value_(grn_ctx *ctx, grn_pat *pat, grn_id id, uint32_t * grn_id grn_pat_at(grn_ctx *ctx, grn_pat *pat, grn_id id); void grn_pat_check(grn_ctx *ctx, grn_pat *pat); void grn_pat_inspect_nodes(grn_ctx *ctx, grn_pat *pat, grn_obj *buf); +void grn_pat_cursor_inspect(grn_ctx *ctx, grn_pat_cursor *c, grn_obj *buf); #ifdef __cplusplus } Modified: lib/util.c (+15 -12) =================================================================== --- lib/util.c 2010-07-23 05:03:58 +0000 (c234e83) +++ lib/util.c 2010-07-23 07:36:41 +0000 (57d762d) @@ -62,8 +62,8 @@ grn_normalize_offset_and_limit(grn_ctx *ctx, int size, int *p_offset, int *p_lim return GRN_SUCCESS; } -static grn_rc -grn_name_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) +grn_obj * +grn_inspect_name(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) { int name_size; @@ -75,7 +75,7 @@ grn_name_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) GRN_TEXT_PUTS(ctx, buf, "(nil)"); } - return GRN_SUCCESS; + return buf; } static grn_rc @@ -90,7 +90,7 @@ grn_type_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) grn_id range_id; GRN_TEXT_PUTS(ctx, buf, "#<type "); - grn_name_inspect(ctx, buf, obj); + grn_inspect_name(ctx, buf, obj); range_id = grn_obj_get_range(ctx, obj); GRN_TEXT_PUTS(ctx, buf, " size:"); @@ -127,14 +127,14 @@ grn_column_inspect_common(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) { grn_id range_id; - grn_name_inspect(ctx, buf, obj); + grn_inspect_name(ctx, buf, obj); range_id = grn_obj_get_range(ctx, obj); if (range_id) { grn_obj *range = grn_ctx_at(ctx, range_id); GRN_TEXT_PUTS(ctx, buf, " range:"); if (range) { - grn_name_inspect(ctx, buf, range); + grn_inspect_name(ctx, buf, range); grn_obj_unlink(ctx, range); } else { grn_text_lltoa(ctx, buf, range_id); @@ -218,7 +218,7 @@ grn_ii_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) source_id = source_ids[i]; source = grn_ctx_at(ctx, source_id); if (source) { - grn_name_inspect(ctx, buf, source); + grn_inspect_name(ctx, buf, source); } else { grn_text_lltoa(ctx, buf, source_id); } @@ -279,7 +279,7 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) grn_table_type_inspect(ctx, buf, obj); GRN_TEXT_PUTS(ctx, buf, " "); - grn_name_inspect(ctx, buf, obj); + grn_inspect_name(ctx, buf, obj); if (obj->header.type != GRN_TABLE_NO_KEY) { grn_obj *domain; @@ -288,7 +288,7 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) domain_id = obj->header.domain; domain = grn_ctx_at(ctx, domain_id); if (domain) { - grn_name_inspect(ctx, buf, domain); + grn_inspect_name(ctx, buf, domain); grn_obj_unlink(ctx, domain); } else if (domain_id) { grn_text_lltoa(ctx, buf, domain_id); @@ -301,7 +301,7 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) range_id = grn_obj_get_range(ctx, obj); range = grn_ctx_at(ctx, range_id); if (range) { - grn_name_inspect(ctx, buf, range); + grn_inspect_name(ctx, buf, range); } else if (range_id) { grn_text_lltoa(ctx, buf, range_id); } else { @@ -353,7 +353,7 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) default_tokenizer = grn_obj_get_info(ctx, obj, GRN_INFO_DEFAULT_TOKENIZER, NULL); if (default_tokenizer) { - grn_name_inspect(ctx, buf, default_tokenizer); + grn_inspect_name(ctx, buf, default_tokenizer); } else { GRN_TEXT_PUTS(ctx, buf, "(nil)"); } @@ -399,7 +399,7 @@ grn_record_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj) GRN_TEXT_PUTS(ctx, buf, "#<record:"); grn_table_type_inspect(ctx, buf, table); GRN_TEXT_PUTS(ctx, buf, ":"); - grn_name_inspect(ctx, buf, table); + grn_inspect_name(ctx, buf, table); GRN_TEXT_PUTS(ctx, buf, " id:"); id = GRN_RECORD_VALUE(obj); @@ -534,6 +534,9 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj) case GRN_COLUMN_INDEX : grn_ii_inspect(ctx, buffer, obj); return buffer; + case GRN_CURSOR_TABLE_PAT_KEY : + grn_pat_cursor_inspect(ctx, (grn_pat_cursor *)obj, buffer); + return buffer; case GRN_TABLE_HASH_KEY : case GRN_TABLE_PAT_KEY : case GRN_TABLE_NO_KEY : Modified: lib/util.h (+1 -0) =================================================================== --- lib/util.h 2010-07-23 05:03:58 +0000 (42c1126) +++ lib/util.h 2010-07-23 07:36:41 +0000 (7be8081) @@ -32,6 +32,7 @@ extern "C" { grn_rc grn_normalize_offset_and_limit(grn_ctx *ctx, int size, int *offset, int *limit); grn_obj *grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj); +grn_obj *grn_inspect_name(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj); void grn_p(grn_ctx *ctx, grn_obj *obj); #ifdef __cplusplus Modified: test/unit/core/test-inspect.c (+51 -0) =================================================================== --- test/unit/core/test-inspect.c 2010-07-23 05:03:58 +0000 (39c25f4) +++ test/unit/core/test-inspect.c 2010-07-23 07:36:41 +0000 (16e5e24) @@ -49,6 +49,8 @@ void test_hash_empty(void); void test_hash_with_records(void); void test_patricia_trie_empty(void); void test_patricia_trie_with_records(void); +void test_patricia_trie_cursor_empty(void); +void test_patricia_trie_cursor_with_records(void); void test_uvector_empty(void); void test_uvector_with_records(void); void test_uvector_bool(void); @@ -84,6 +86,7 @@ static grn_obj *uvector; static grn_obj *pvector; static grn_obj *vector; static grn_obj *record; +static grn_table_cursor *cursor; void cut_startup(void) @@ -120,6 +123,7 @@ setup_values(void) pvector = NULL; vector = NULL; record = NULL; + cursor = NULL; } void @@ -162,6 +166,7 @@ teardown_values(void) grn_obj_unlink(context, pvector); grn_obj_unlink(context, vector); grn_obj_unlink(context, record); + grn_table_cursor_close(context, cursor); } void @@ -492,6 +497,52 @@ test_patricia_trie_with_records(void) } void +test_patricia_trie_cursor_empty(void) +{ + assert_send_command("table_create Sites TABLE_PAT_KEY ShortText"); + cursor = grn_table_cursor_open(context, get("Sites"), + NULL, 0, + NULL, 0, + 0, -1, GRN_CURSOR_ASCENDING); + inspected = grn_inspect(context, NULL, cursor); + cut_assert_equal_string("#<cursor:pat:Sites " + "current:0 " + "tail:0 " + "flags:ascending|greater|less " + "rest:0 " + "entries:[]" + ">", + inspected_string()); +} + +void +test_patricia_trie_cursor_with_records(void) +{ + assert_send_command("table_create Sites TABLE_PAT_KEY ShortText"); + assert_send_command("column_create Sites name COLUMN_SCALAR Text"); + assert_send_command("load " + "'[" + "[\"_key\",\"name\"]," + "[\"groonga.org\",\"groonga\"]," + "[\"razil.jp\",\"Brazil\"]" + "]' " + "Sites"); + cursor = grn_table_cursor_open(context, get("Sites"), + NULL, 0, + NULL, 0, + 0, -1, GRN_CURSOR_ASCENDING); + inspected = grn_inspect(context, NULL, cursor); + cut_assert_equal_string("#<cursor:pat:Sites " + "current:0 " + "tail:0 " + "flags:ascending|greater|less " + "rest:2 " + "entries:[[2,{0,3,0}], [1,{0,3,0}]]" + ">", + inspected_string()); +} + +void test_uvector_empty(void) { assert_send_command("table_create Sites TABLE_PAT_KEY ShortText");