[Groonga-commit] groonga/groonga [master] support record inspection.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 7月 15日 (木) 17:10:04 JST


Kouhei Sutou	2010-07-15 08:10:04 +0000 (Thu, 15 Jul 2010)

  New Revision: 5426f5c0626bd4db7c7f71bbcfbaf07ce993507e

  Log:
    support record inspection.

  Modified files:
    lib/util.c
    test/unit/core/test-inspect.c

  Modified: lib/util.c (+94 -12)
===================================================================
--- lib/util.c    2010-07-15 07:37:24 +0000 (226db73)
+++ lib/util.c    2010-07-15 08:10:04 +0000 (5a3c7f9)
@@ -250,13 +250,8 @@ grn_ii_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
 }
 
 static grn_rc
-grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
+grn_table_type_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
 {
-  grn_hash *cols;
-  grn_id range_id;
-  grn_obj *range;
-
-  GRN_TEXT_PUTS(ctx, buf, "#<table:");
   switch (obj->header.type) {
   case GRN_TABLE_HASH_KEY:
     GRN_TEXT_PUTS(ctx, buf, "hash");
@@ -268,6 +263,19 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
     GRN_TEXT_PUTS(ctx, buf, "no_key");
     break;
   }
+
+  return GRN_SUCCESS;
+}
+
+static grn_rc
+grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
+{
+  grn_hash *cols;
+  grn_id range_id;
+  grn_obj *range;
+
+  GRN_TEXT_PUTS(ctx, buf, "#<table:");
+  grn_table_type_inspect(ctx, buf, obj);
   GRN_TEXT_PUTS(ctx, buf, " ");
 
   grn_name_inspect(ctx, buf, obj);
@@ -309,12 +317,13 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
       int i = 0;
       grn_id *key;
       GRN_HASH_EACH(ctx, cols, id, &key, NULL, NULL, {
-        grn_obj *col = grn_ctx_at(ctx, *key);
-        if (col) {
-          if (i++ > 0) { GRN_TEXT_PUTS(ctx, buf, ", "); }
-          grn_column_name_(ctx, col, buf);
-        }
-      });
+          grn_obj *col = grn_ctx_at(ctx, *key);
+          if (col) {
+            if (i++ > 0) { GRN_TEXT_PUTS(ctx, buf, ", "); }
+            grn_column_name_(ctx, col, buf);
+            grn_obj_unlink(ctx, col);
+          }
+        });
     }
     grn_hash_close(ctx, cols);
   }
@@ -373,9 +382,66 @@ grn_table_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
   return GRN_SUCCESS;
 }
 
+static grn_rc
+grn_record_inspect(grn_ctx *ctx, grn_obj *buf, grn_obj *obj)
+{
+  grn_id id;
+  grn_obj *table;
+  grn_hash *cols;
+
+  table = grn_ctx_at(ctx, obj->header.domain);
+  GRN_TEXT_PUTS(ctx, buf, "#<record:");
+  grn_table_type_inspect(ctx, buf, table);
+
+  GRN_TEXT_PUTS(ctx, buf, " id:");
+  id = GRN_RECORD_VALUE(obj);
+  grn_text_lltoa(ctx, buf, id);
+
+  if (grn_table_at(ctx, table, id)) {
+    if (table->header.type != GRN_TABLE_NO_KEY) {
+      grn_obj key;
+      GRN_TEXT_PUTS(ctx, buf, " key:");
+      GRN_OBJ_INIT(&key, GRN_BULK, 0, table->header.domain);
+      grn_table_get_key2(ctx, table, id, &key);
+      grn_inspect(ctx, buf, &key);
+      GRN_OBJ_FIN(ctx, &key);
+    }
+    if ((cols = grn_hash_create(ctx, NULL, sizeof(grn_id), 0,
+                                GRN_OBJ_TABLE_HASH_KEY|GRN_HASH_TINY))) {
+      if (grn_table_columns(ctx, table, "", 0, (grn_obj *)cols)) {
+        grn_id *key;
+        GRN_HASH_EACH(ctx, cols, id, &key, NULL, NULL, {
+            grn_obj *col = grn_ctx_at(ctx, *key);
+            if (col) {
+              grn_obj value;
+              GRN_TEXT_INIT(&value, 0);
+              GRN_TEXT_PUTS(ctx, buf, " ");
+              grn_column_name_(ctx, col, buf);
+              GRN_TEXT_PUTS(ctx, buf, ":");
+              grn_obj_get_value(ctx, col, id, &value);
+              grn_inspect(ctx, buf, &value);
+              GRN_OBJ_FIN(ctx, &value);
+              grn_obj_unlink(ctx, col);
+            }
+          });
+      }
+      grn_hash_close(ctx, cols);
+    }
+  } else {
+    GRN_TEXT_PUTS(ctx, buf, "(nonexistent)");
+  }
+  GRN_TEXT_PUTS(ctx, buf, ">");
+
+  grn_obj_unlink(ctx, table);
+
+  return GRN_SUCCESS;
+}
+
 grn_obj *
 grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj)
 {
+  grn_obj *domain;
+
   if (!buffer) {
     buffer = grn_obj_open(ctx, GRN_BULK, 0, GRN_DB_TEXT);
   }
@@ -386,6 +452,22 @@ grn_inspect(grn_ctx *ctx, grn_obj *buffer, grn_obj *obj)
   }
 
   switch (obj->header.type) {
+  case GRN_BULK :
+    domain = grn_ctx_at(ctx, obj->header.domain);
+    if (domain) {
+      grn_id type = domain->header.type;
+      grn_obj_unlink(ctx, domain);
+      switch (type) {
+      case GRN_TABLE_HASH_KEY :
+      case GRN_TABLE_PAT_KEY :
+      case GRN_TABLE_NO_KEY :
+        grn_record_inspect(ctx, buffer, obj);
+        return buffer;
+      default :
+        break;
+      }
+    }
+    break;
   case GRN_EXPR :
     grn_expr_inspect(ctx, buffer, obj);
     return buffer;

  Modified: test/unit/core/test-inspect.c (+29 -0)
===================================================================
--- test/unit/core/test-inspect.c    2010-07-15 07:37:24 +0000 (c9ce4b5)
+++ test/unit/core/test-inspect.c    2010-07-15 08:10:04 +0000 (e6dd6ed)
@@ -63,6 +63,7 @@ void test_column_fix_size(void);
 void test_column_var_size(void);
 void test_column_index(void);
 void test_type(void);
+void test_record(void);
 
 static gchar *tmp_directory;
 
@@ -82,6 +83,7 @@ static grn_obj *geo_point_tokyo, *geo_point_wgs84;
 static grn_obj *uvector;
 static grn_obj *pvector;
 static grn_obj *vector;
+static grn_obj *record;
 
 void
 cut_startup(void)
@@ -118,6 +120,7 @@ setup_values(void)
   uvector = NULL;
   pvector = NULL;
   vector = NULL;
+  record = NULL;
 }
 
 void
@@ -159,6 +162,7 @@ teardown_values(void)
   grn_obj_unlink(context, uvector);
   grn_obj_unlink(context, pvector);
   grn_obj_unlink(context, vector);
+  grn_obj_unlink(context, record);
 }
 
 void
@@ -703,3 +707,28 @@ test_type(void)
                           ">",
                           inspected_string());
 }
+
+void
+test_record(void)
+{
+  assert_send_command("table_create Sites TABLE_HASH_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");
+
+  record = grn_obj_open(context, GRN_BULK, 0,
+                        grn_obj_id(context, get_object("Sites")));
+  GRN_RECORD_SET(context, record, 1);
+  inspected = grn_inspect(context, NULL, record);
+  cut_assert_equal_string("#<record:hash "
+                          "id:1 "
+                          "key:\"groonga.org\" "
+                          "name:\"groonga\""
+                          ">",
+                          inspected_string());
+}




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