[Groonga-commit] groonga/groonga [master] support pat key cursor inspection.

Back to archive index

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");




Groonga-commit メーリングリストの案内
Back to archive index