[Groonga-commit] groonga/groonga at 6bf9d65 [master] Support casting A table record to B table record

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Aug 15 18:52:16 JST 2016


Kouhei Sutou	2016-08-15 18:52:16 +0900 (Mon, 15 Aug 2016)

  New Revision: 6bf9d65184787a6ca71acbd8e03794fa4096ce8f
  https://github.com/groonga/groonga/commit/6bf9d65184787a6ca71acbd8e03794fa4096ce8f

  Message:
    Support casting A table record to B table record
    
    Both tables must support key.

  Added files:
    test/command/suite/column_copy/reference_type.expected
    test/command/suite/column_copy/reference_type.test
  Modified files:
    lib/db.c

  Modified: lib/db.c (+54 -5)
===================================================================
--- lib/db.c    2016-08-15 15:56:42 +0900 (9e86f36)
+++ lib/db.c    2016-08-15 18:52:16 +0900 (1333a55)
@@ -6218,6 +6218,59 @@ grn_obj_cast_bool(grn_ctx *ctx, grn_obj *src, grn_obj *dest,
 #define FLOAT2FLOAT(ctx, dest, value)\
   GRN_FLOAT_SET(ctx, dest, value);
 
+static grn_rc
+grn_obj_cast_record(grn_ctx *ctx,
+                    grn_obj *src,
+                    grn_obj *dest,
+                    grn_bool add_record_if_not_exist)
+{
+  grn_obj *src_table;
+  grn_obj *dest_table;
+  const char *key;
+  uint32_t key_size;
+  grn_id dest_id;
+
+  if (src->header.domain == dest->header.domain) {
+    GRN_RECORD_SET(ctx, dest, GRN_RECORD_VALUE(src));
+    return GRN_SUCCESS;
+  }
+
+  src_table = grn_ctx_at(ctx, src->header.domain);
+  if (!src_table) {
+    return GRN_INVALID_ARGUMENT;
+  }
+  if (src_table->header.type == GRN_TABLE_NO_KEY) {
+    return GRN_INVALID_ARGUMENT;
+  }
+
+  dest_table = grn_ctx_at(ctx, dest->header.domain);
+  if (!dest_table) {
+    return GRN_INVALID_ARGUMENT;
+  }
+  switch (dest_table->header.type) {
+  case GRN_TABLE_HASH_KEY :
+  case GRN_TABLE_PAT_KEY :
+  case GRN_TABLE_DAT_KEY :
+    break;
+  default :
+    return GRN_INVALID_ARGUMENT;
+  }
+
+  if (GRN_RECORD_VALUE(src) == GRN_ID_NIL) {
+    GRN_RECORD_SET(ctx, dest, GRN_RECORD_VALUE(src));
+    return GRN_SUCCESS;
+  }
+
+  key = _grn_table_key(ctx, src_table, GRN_RECORD_VALUE(src), &key_size);
+  if (add_record_if_not_exist) {
+    dest_id = grn_table_add(ctx, dest_table, key, key_size, NULL);
+  } else {
+    dest_id = grn_table_get(ctx, dest_table, key, key_size);
+  }
+  GRN_RECORD_SET(ctx, dest, dest_id);
+  return GRN_SUCCESS;
+}
+
 grn_rc
 grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest,
              grn_bool add_record_if_not_exist)
@@ -6482,11 +6535,7 @@ grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest,
       case GRN_TABLE_PAT_KEY :
       case GRN_TABLE_DAT_KEY :
       case GRN_TABLE_NO_KEY :
-        if (src->header.domain == dest->header.domain) {
-          GRN_RECORD_SET(ctx, dest, GRN_RECORD_VALUE(src));
-        } else {
-          rc = GRN_FUNCTION_NOT_IMPLEMENTED;
-        }
+        rc = grn_obj_cast_record(ctx, src, dest, add_record_if_not_exist);
         break;
       default :
         rc = GRN_FUNCTION_NOT_IMPLEMENTED;

  Added: test/command/suite/column_copy/reference_type.expected (+43 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/column_copy/reference_type.expected    2016-08-15 18:52:16 +0900 (77b67d1)
@@ -0,0 +1,43 @@
+table_create Names TABLE_PAT_KEY ShortText
+[[0,0.0,0.0],true]
+table_create NormalizedNames TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
+[[0,0.0,0.0],true]
+table_create Users TABLE_HASH_KEY ShortText
+[[0,0.0,0.0],true]
+column_create Users name COLUMN_SCALAR Names
+[[0,0.0,0.0],true]
+load --table Users
+[
+{"_key": "alice",   "name": "Alice"},
+{"_key": "bob",     "name": "Bob"},
+{"_key": "charlie", "name": "Charlie"}
+]
+[[0,0.0,0.0],3]
+column_create Users normalized_name COLUMN_SCALAR NormalizedNames
+[[0,0.0,0.0],true]
+column_copy Users name Users normalized_name
+[[0,0.0,0.0],true]
+dump --dump_schema no
+load --table Names
+[
+["_key"],
+["Alice"],
+["Bob"],
+["Charlie"]
+]
+
+load --table NormalizedNames
+[
+["_key"],
+["alice"],
+["bob"],
+["charlie"]
+]
+
+load --table Users
+[
+["_key","name","normalized_name"],
+["alice","Alice","alice"],
+["bob","Bob","bob"],
+["charlie","Charlie","charlie"]
+]

  Added: test/command/suite/column_copy/reference_type.test (+17 -0) 100644
===================================================================
--- /dev/null
+++ test/command/suite/column_copy/reference_type.test    2016-08-15 18:52:16 +0900 (2c12888)
@@ -0,0 +1,17 @@
+table_create Names TABLE_PAT_KEY ShortText
+table_create NormalizedNames TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
+
+table_create Users TABLE_HASH_KEY ShortText
+column_create Users name COLUMN_SCALAR Names
+
+load --table Users
+[
+{"_key": "alice",   "name": "Alice"},
+{"_key": "bob",     "name": "Bob"},
+{"_key": "charlie", "name": "Charlie"}
+]
+
+column_create Users normalized_name COLUMN_SCALAR NormalizedNames
+column_copy Users name Users normalized_name
+
+dump --dump_schema no
-------------- next part --------------
HTML����������������������������...
下載 



More information about the Groonga-commit mailing list
Back to archive index