Skip to content

Commit

Permalink
support pat key cursor inspection.
Browse files Browse the repository at this point in the history
  • Loading branch information
kou committed Jul 23, 2010
1 parent b6f1b5c commit 6dda9b0
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 24 deletions.
107 changes: 95 additions & 12 deletions lib/pat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -2217,6 +2220,18 @@ grn_pat_check(grn_ctx *ctx, grn_pat *pat)
GRN_OUTPUT_ARRAY_CLOSE();
}

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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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, ">");
}
1 change: 1 addition & 0 deletions lib/pat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
27 changes: 15 additions & 12 deletions lib/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -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:");
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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 {
Expand Down Expand Up @@ -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)");
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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 :
Expand Down
1 change: 1 addition & 0 deletions lib/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
51 changes: 51 additions & 0 deletions test/unit/core/test-inspect.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -120,6 +123,7 @@ setup_values(void)
pvector = NULL;
vector = NULL;
record = NULL;
cursor = NULL;
}

void
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -491,6 +496,52 @@ test_patricia_trie_with_records(void)
inspected_string());
}

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)
{
Expand Down

0 comments on commit 6dda9b0

Please sign in to comment.