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����������������������������... 下載