[Groonga-commit] groonga/groonga [master] table: implement add command.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 6月 14日 (木) 00:30:07 JST


Daijiro MORI	2012-06-14 00:30:07 +0900 (Thu, 14 Jun 2012)

  New Revision: df13553f0db7b498bfb36ef2c926b837c65b191a

  Log:
    table: implement add command.

  Added files:
    test/function/suite/table/add.expected
    test/function/suite/table/add.test
  Modified files:
    lib/ctx_impl.h
    lib/db.c
    lib/db.h
    plugins/table/table.c

  Modified: lib/ctx_impl.h (+1 -0)
===================================================================
--- lib/ctx_impl.h    2012-06-13 12:24:25 +0900 (0fb5155)
+++ lib/ctx_impl.h    2012-06-14 00:30:07 +0900 (64c15cd)
@@ -61,6 +61,7 @@ typedef struct {
   grn_obj values;
   grn_obj level;
   grn_obj columns;
+  uint32_t emit_level;
   int32_t key_offset;
   grn_obj *table;
   grn_obj *last;

  Modified: lib/db.c (+32 -19)
===================================================================
--- lib/db.c    2012-06-13 12:24:25 +0900 (dcbde8e)
+++ lib/db.c    2012-06-14 00:30:07 +0900 (e590de1)
@@ -8676,7 +8676,7 @@ bracket_close(grn_ctx *ctx, grn_loader *loader)
   GRN_ASSERT(value->header.domain & OPEN_BRACKET);
   GRN_UINT32_SET(ctx, value, loader->values_size - begin - 1);
   value++;
-  if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t)) {
+  if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t) * loader->emit_level) {
     ndata = values_len(ctx, value, ve);
     if (loader->table) {
       switch (loader->table->header.type) {
@@ -8816,7 +8816,7 @@ brace_close(grn_ctx *ctx, grn_loader *loader)
   GRN_ASSERT(value->header.domain & OPEN_BRACKET);
   GRN_UINT32_SET(ctx, value, loader->values_size - begin - 1);
   value++;
-  if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t)) {
+  if (GRN_BULK_VSIZE(&loader->level) <= sizeof(uint32_t) * loader->emit_level) {
     if (loader->table) {
       switch (loader->table->header.type) {
       case GRN_TABLE_HASH_KEY :
@@ -9263,22 +9263,18 @@ exit:
 
 static grn_com_addr *addr;
 
-grn_rc
-grn_load(grn_ctx *ctx, grn_content_type input_type,
-         const char *table, unsigned int table_len,
-         const char *columns, unsigned int columns_len,
-         const char *values, unsigned int values_len,
-         const char *ifexists, unsigned int ifexists_len,
-         const char *each, unsigned int each_len)
+void
+grn_load_(grn_ctx *ctx, grn_content_type input_type,
+          const char *table, unsigned int table_len,
+          const char *columns, unsigned int columns_len,
+          const char *values, unsigned int values_len,
+          const char *ifexists, unsigned int ifexists_len,
+          const char *each, unsigned int each_len,
+          uint32_t emit_level)
 {
   grn_loader *loader;
-  if (!ctx || !ctx->impl) {
-    ERR(GRN_INVALID_ARGUMENT, "db not initialized");
-    return ctx->rc;
-  }
-  GRN_API_ENTER;
   loader = &ctx->impl->loader;
-
+  loader->emit_level = emit_level;
   if (ctx->impl->edge) {
     grn_edge *edge = grn_edges_add_communicator(ctx, addr);
     grn_obj *msg = grn_msg_open(ctx, edge->com, &ctx->impl->edge->send_old);
@@ -9290,12 +9286,12 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
     loader->input_type = input_type;
     if (grn_db_check_name(ctx, table, table_len)) {
       GRN_DB_CHECK_NAME_ERR("[table][load]", table, table_len);
-      goto exit;
+      return;
     }
     loader->table = grn_ctx_get(ctx, table, table_len);
     if (!loader->table) {
       ERR(GRN_INVALID_ARGUMENT, "nonexistent table: <%.*s>", table_len, table);
-      goto exit;
+      return;
     }
     if (loader->table && columns && columns_len) {
       int i, n_columns;
@@ -9304,7 +9300,7 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
       GRN_PTR_INIT(&parsed_columns, GRN_OBJ_VECTOR, GRN_ID_NIL);
       if (parse_load_columns(ctx, loader->table, columns, columns_len,
                              &parsed_columns)) {
-        goto exit;
+        return;
       }
       n_columns = GRN_BULK_VSIZE(&parsed_columns) / sizeof(grn_obj *);
       for (i = 0; i < n_columns; i++) {
@@ -9353,6 +9349,23 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
     // todo
     break;
   }
-exit:
+}
+
+grn_rc
+grn_load(grn_ctx *ctx, grn_content_type input_type,
+         const char *table, unsigned int table_len,
+         const char *columns, unsigned int columns_len,
+         const char *values, unsigned int values_len,
+         const char *ifexists, unsigned int ifexists_len,
+         const char *each, unsigned int each_len)
+{
+  if (!ctx || !ctx->impl) {
+    ERR(GRN_INVALID_ARGUMENT, "db not initialized");
+    return ctx->rc;
+  }
+  GRN_API_ENTER;
+  grn_load_(ctx, input_type, table, table_len,
+            columns, columns_len, values, values_len,
+            ifexists, ifexists_len, each, each_len, 1);
   GRN_API_RETURN(ctx->rc);
 }

  Modified: lib/db.h (+8 -0)
===================================================================
--- lib/db.h    2012-06-13 12:24:25 +0900 (dce72e2)
+++ lib/db.h    2012-06-14 00:30:07 +0900 (4948de8)
@@ -432,6 +432,14 @@ GRN_API grn_obj *grn_table_create_for_group(grn_ctx *ctx,
 #define KEY_NAME "_key"
 #define ID_NAME "_id"
 
+void grn_load_(grn_ctx *ctx, grn_content_type input_type,
+               const char *table, unsigned int table_len,
+               const char *columns, unsigned int columns_len,
+               const char *values, unsigned int values_len,
+               const char *ifexists, unsigned int ifexists_len,
+               const char *each, unsigned int each_len,
+               uint32_t emit_level);
+
 #ifdef __cplusplus
 }
 #endif

  Modified: plugins/table/table.c (+13 -4)
===================================================================
--- plugins/table/table.c    2012-06-13 12:24:25 +0900 (112e727)
+++ plugins/table/table.c    2012-06-14 00:30:07 +0900 (51035dc)
@@ -273,6 +273,15 @@ command_unlink(grn_ctx *ctx, int nargs, grn_obj **args,
 static grn_obj *
 command_add(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
+  grn_load_(ctx, GRN_CONTENT_JSON,
+            GRN_TEXT_VALUE(VAR(0)), GRN_TEXT_LEN(VAR(0)),
+            NULL, 0,
+            GRN_TEXT_VALUE(VAR(1)), GRN_TEXT_LEN(VAR(1)),
+            NULL, 0, NULL, 0, 0);
+  GRN_OUTPUT_BOOL(ctx->impl->loader.nrecords);
+  if (ctx->impl->loader.table) {
+    grn_db_touch(ctx, DB_OBJ(ctx->impl->loader.table)->db);
+  }
   return NULL;
 }
 
@@ -362,12 +371,12 @@ GRN_PLUGIN_REGISTER(grn_ctx *ctx)
   DEF_COMMAND("unlink", command_unlink, 1, vars);
 
   DEF_VAR(vars[0], "table");
-  DEF_VAR(vars[1], "key");
-  DEF_VAR(vars[2], "columns");
-  DEF_VAR(vars[3], "values");
+  DEF_VAR(vars[1], "values");
+  DEF_VAR(vars[2], "key");
+  DEF_VAR(vars[3], "columns");
   DEF_VAR(vars[4], "output_columns");
   DEF_VAR(vars[5], "id");
-  DEF_COMMAND("add", command_add, 5, vars);
+  DEF_COMMAND("add", command_add, 2, vars);
   DEF_COMMAND("set", command_set, 6, vars);
 
   return ctx->rc;

  Added: test/function/suite/table/add.expected (+87 -0) 100644
===================================================================
--- /dev/null
+++ test/function/suite/table/add.expected    2012-06-14 00:30:07 +0900 (dd172f0)
@@ -0,0 +1,87 @@
+register table/table
+[[0,0.0,0.0],true]
+table_create Shops TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Shops name COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+column_create Shops tags COLUMN_VECTOR ShortText
+[[0,0.0,0.0],true]
+table_create Events TABLE_NO_KEY
+[[0,0.0,0.0],true]
+column_create Events value COLUMN_SCALAR ShortText
+[[0,0.0,0.0],true]
+add Shops '{"_key":"kuriko-an","tags":["たいやき","養殖"]}'
+[[0,0.0,0.0],true]
+select Shops
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "_key",
+          "ShortText"
+        ],
+        [
+          "name",
+          "ShortText"
+        ],
+        [
+          "tags",
+          "ShortText"
+        ]
+      ],
+      [
+        1,
+        "kuriko-an",
+        "",
+        [
+          "たいやき",
+          "養殖"
+        ]
+      ]
+    ]
+  ]
+]
+add Events '{"value":"田無店新規開店!"}'
+[[0,0.0,0.0],true]
+select Events
+[
+  [
+    0,
+    0.0,
+    0.0
+  ],
+  [
+    [
+      [
+        1
+      ],
+      [
+        [
+          "_id",
+          "UInt32"
+        ],
+        [
+          "value",
+          "ShortText"
+        ]
+      ],
+      [
+        1,
+        "田無店新規開店!"
+      ]
+    ]
+  ]
+]

  Added: test/function/suite/table/add.test (+13 -0) 100644
===================================================================
--- /dev/null
+++ test/function/suite/table/add.test    2012-06-14 00:30:07 +0900 (60beb87)
@@ -0,0 +1,13 @@
+register table/table
+table_create Shops TABLE_PAT_KEY ShortText
+column_create Shops name COLUMN_SCALAR ShortText
+column_create Shops tags COLUMN_VECTOR ShortText
+
+table_create Events TABLE_NO_KEY
+column_create Events value COLUMN_SCALAR ShortText
+
+add Shops '{"_key":"kuriko-an","tags":["たいやき","養殖"]}'
+select Shops
+
+add Events '{"value":"田無店新規開店!"}'
+select Events




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