Kouhei Sutou
null+****@clear*****
Mon Nov 24 18:34:50 JST 2014
Kouhei Sutou 2014-11-24 18:34:50 +0900 (Mon, 24 Nov 2014) New Revision: e652e864ffcf1c895bf42597ffb4db59906bd810 https://github.com/groonga/groonga/commit/e652e864ffcf1c895bf42597ffb4db59906bd810 Message: select drilldown[].keys: support reference vector Added files: test/command/suite/select/drilldown/labeled/keys/reference_vector.expected test/command/suite/select/drilldown/labeled/keys/reference_vector.test Modified files: lib/db.c Modified: lib/db.c (+58 -24) =================================================================== --- lib/db.c 2014-11-24 17:43:21 +0900 (03475e1) +++ lib/db.c 2014-11-24 18:34:50 +0900 (d30656d) @@ -3293,33 +3293,67 @@ grn_table_group_multi_keys_vector_record(grn_ctx *ctx, for (k = nth_key, kp = &(keys[nth_key]); k < n_keys; k++, kp++) { grn_obj *key_buffer = &(key_buffers[k]); - if (key_buffer->header.type == GRN_VECTOR) { - unsigned int n_vector_elements; - unsigned int i, n_key_elements; - - n_vector_elements = grn_vector_size(ctx, vector); - n_key_elements = grn_vector_size(ctx, key_buffer); - for (i = 0; i < n_key_elements; i++) { - const char *content; - unsigned int content_length; + switch (key_buffer->header.type) { + case GRN_UVECTOR : + { + unsigned int n_vector_elements; grn_id domain; - content_length = grn_vector_get_element(ctx, key_buffer, i, - &content, NULL, &domain); - grn_vector_add_element(ctx, vector, - content, content_length, - 0, - domain); - grn_table_group_multi_keys_vector_record(ctx, - keys, key_buffers, - k + 1, n_keys, - results, n_results, - id, ri, vector, bulk); - while (grn_vector_size(ctx, vector) != n_vector_elements) { - grn_vector_pop_element(ctx, vector, &content, NULL, NULL); + grn_id *ids; + unsigned int i, n_ids; + + n_vector_elements = grn_vector_size(ctx, vector); + domain = key_buffer->header.domain; + ids = (grn_id *)GRN_BULK_HEAD(key_buffer); + n_ids = GRN_BULK_VSIZE(key_buffer) / sizeof(grn_id); + for (i = 0; i < n_ids; i++) { + grn_id element_id = ids[i]; + grn_vector_add_element(ctx, vector, + (const char *)(&element_id), sizeof(grn_id), + 0, + domain); + grn_table_group_multi_keys_vector_record(ctx, + keys, key_buffers, + k + 1, n_keys, + results, n_results, + id, ri, vector, bulk); + while (grn_vector_size(ctx, vector) != n_vector_elements) { + const char *content; + grn_vector_pop_element(ctx, vector, &content, NULL, NULL); + } } + return; } - return; - } else { + break; + case GRN_VECTOR : + { + unsigned int n_vector_elements; + unsigned int i, n_key_elements; + + n_vector_elements = grn_vector_size(ctx, vector); + n_key_elements = grn_vector_size(ctx, key_buffer); + for (i = 0; i < n_key_elements; i++) { + const char *content; + unsigned int content_length; + grn_id domain; + content_length = grn_vector_get_element(ctx, key_buffer, i, + &content, NULL, &domain); + grn_vector_add_element(ctx, vector, + content, content_length, + 0, + domain); + grn_table_group_multi_keys_vector_record(ctx, + keys, key_buffers, + k + 1, n_keys, + results, n_results, + id, ri, vector, bulk); + while (grn_vector_size(ctx, vector) != n_vector_elements) { + grn_vector_pop_element(ctx, vector, &content, NULL, NULL); + } + } + return; + } + break; + default : grn_vector_add_element(ctx, vector, GRN_BULK_HEAD(key_buffer), GRN_BULK_VSIZE(key_buffer), Added: test/command/suite/select/drilldown/labeled/keys/reference_vector.expected (+84 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/keys/reference_vector.expected 2014-11-24 18:34:50 +0900 (0bca7d9) @@ -0,0 +1,84 @@ +table_create Tags TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos date COLUMN_SCALAR Time +[[0,0.0,0.0],true] +column_create Memos tags COLUMN_VECTOR Tags +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga is fast!", "date": "2014-11-16 00:00:00", + "tags": ["Groonga"]}, +{"_key": "Mroonga is fast!", "date": "2014-11-16 00:00:00", + "tags": ["Mroonga", "Groonga"]}, +{"_key": "Groonga sticker!", "date": "2014-11-16 00:00:00", + "tags": ["Groonga"]}, +{"_key": "Rroonga is fast!", "date": "2014-11-17 00:00:00", + "tags": ["Rroonga", "Groonga"]}, +{"_key": "Groonga is good!", "date": "2014-11-17 00:00:00", + "tags": ["Groonga"]} +] +[[0,0.0,0.0],5] +select Memos --limit 0 --output_columns _id --command_version 2 --drilldown[vector].keys date,tags --drilldown[vector].output_columns _key[0],_key[1],_nsubrecs --drilldown[vector].sortby -_nsubrecs,_id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 5 + ], + [ + [ + "_id", + "UInt32" + ] + ] + ], + { + "vector": [ + [ + 4 + ], + [ + [ + "_key[0]", + null + ], + [ + "_key[1]", + null + ], + [ + "_nsubrecs", + "Int32" + ] + ], + [ + 1416063600.0, + "Groonga", + 3 + ], + [ + 1416150000.0, + "Groonga", + 2 + ], + [ + 1416063600.0, + "Mroonga", + 1 + ], + [ + 1416150000.0, + "Rroonga", + 1 + ] + ] + } + ] +] Added: test/command/suite/select/drilldown/labeled/keys/reference_vector.test (+27 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/keys/reference_vector.test 2014-11-24 18:34:50 +0900 (c12922f) @@ -0,0 +1,27 @@ +table_create Tags TABLE_HASH_KEY ShortText + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos date COLUMN_SCALAR Time +column_create Memos tags COLUMN_VECTOR Tags + +load --table Memos +[ +{"_key": "Groonga is fast!", "date": "2014-11-16 00:00:00", + "tags": ["Groonga"]}, +{"_key": "Mroonga is fast!", "date": "2014-11-16 00:00:00", + "tags": ["Mroonga", "Groonga"]}, +{"_key": "Groonga sticker!", "date": "2014-11-16 00:00:00", + "tags": ["Groonga"]}, +{"_key": "Rroonga is fast!", "date": "2014-11-17 00:00:00", + "tags": ["Rroonga", "Groonga"]}, +{"_key": "Groonga is good!", "date": "2014-11-17 00:00:00", + "tags": ["Groonga"]} +] + +select Memos \ + --limit 0 \ + --output_columns _id \ + --command_version 2 \ + --drilldown[vector].keys date,tags \ + --drilldown[vector].output_columns _key[0],_key[1],_nsubrecs \ + --drilldown[vector].sortby -_nsubrecs,_id -------------- next part -------------- HTML����������������������������...Download