Kouhei Sutou
null+****@clear*****
Wed Aug 9 16:04:50 JST 2017
Kouhei Sutou 2017-08-09 16:04:50 +0900 (Wed, 09 Aug 2017) New Revision: 18b0c62cdb6b86b52a579a6df123a505683f652e https://github.com/groonga/groonga/commit/18b0c62cdb6b86b52a579a6df123a505683f652e Message: Add window_count Added files: test/command/suite/select/columns/window_function/window_count/ascending.expected test/command/suite/select/columns/window_function/window_count/ascending.test test/command/suite/select/columns/window_function/window_count/descending.expected test/command/suite/select/columns/window_function/window_count/descending.test test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.expected test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.test test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.expected test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.test test/command/suite/select/columns/window_function/window_count/group_no_sort.expected test/command/suite/select/columns/window_function/window_count/group_no_sort.test test/command/suite/select/columns/window_function/window_count/group_sort.expected test/command/suite/select/columns/window_function/window_count/group_sort.test Modified files: lib/window_functions.c Modified: lib/window_functions.c (+117 -0) =================================================================== --- lib/window_functions.c 2017-08-01 21:55:07 +0900 (ed7b9a580) +++ lib/window_functions.c 2017-08-09 16:04:50 +0900 (1812f2922) @@ -269,6 +269,119 @@ window_sum(grn_ctx *ctx, return GRN_SUCCESS; } +static grn_rc +window_count(grn_ctx *ctx, + grn_obj *output_column, + grn_window *window, + grn_obj **args, + int n_args) +{ + grn_id id; + grn_id output_column_range_id; + grn_obj n_records; + uint32_t n_records_raw = 0; + + + if (n_args != 0) { + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "window_count(): wrong number of arguments (%d for 0)", + n_args); + return ctx->rc; + } + + output_column_range_id = grn_obj_get_range(ctx, output_column); + switch (output_column_range_id) { + case GRN_DB_INT8 : + case GRN_DB_INT16 : + case GRN_DB_INT32 : + case GRN_DB_INT64 : + GRN_INT64_INIT(&n_records, 0); + break; + case GRN_DB_UINT8 : + case GRN_DB_UINT16 : + case GRN_DB_UINT32 : + case GRN_DB_UINT64 : + GRN_UINT64_INIT(&n_records, 0); + break; + case GRN_DB_FLOAT : + GRN_FLOAT_INIT(&n_records, 0); + break; + default : + { + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect(ctx, &inspected, output_column); + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "window_count(): " + "the output column must be number column: <%.*s>", + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); + GRN_OBJ_FIN(ctx, &inspected); + return ctx->rc; + } + break; + } + + if (grn_window_is_sorted(ctx, window)) { + while ((id = grn_window_next(ctx, window))) { + n_records_raw++; + switch (output_column_range_id) { + case GRN_DB_INT8 : + case GRN_DB_INT16 : + case GRN_DB_INT32 : + case GRN_DB_INT64 : + GRN_INT64_SET(ctx, &n_records, n_records_raw); + break; + case GRN_DB_UINT8 : + case GRN_DB_UINT16 : + case GRN_DB_UINT32 : + case GRN_DB_UINT64 : + GRN_UINT64_SET(ctx, &n_records, n_records_raw); + break; + case GRN_DB_FLOAT : + GRN_FLOAT_SET(ctx, &n_records, n_records_raw); + break; + default : + break; + } + grn_obj_set_value(ctx, output_column, id, &n_records, GRN_OBJ_SET); + } + } else { + while ((id = grn_window_next(ctx, window))) { + n_records_raw++; + } + + switch (output_column_range_id) { + case GRN_DB_INT8 : + case GRN_DB_INT16 : + case GRN_DB_INT32 : + case GRN_DB_INT64 : + GRN_INT64_SET(ctx, &n_records, n_records_raw); + break; + case GRN_DB_UINT8 : + case GRN_DB_UINT16 : + case GRN_DB_UINT32 : + case GRN_DB_UINT64 : + GRN_UINT64_SET(ctx, &n_records, n_records_raw); + break; + case GRN_DB_FLOAT : + GRN_FLOAT_SET(ctx, &n_records, n_records_raw); + break; + } + + grn_window_rewind(ctx, window); + while ((id = grn_window_next(ctx, window))) { + grn_obj_set_value(ctx, output_column, id, &n_records, GRN_OBJ_SET); + } + } + + GRN_OBJ_FIN(ctx, &n_records); + + return GRN_SUCCESS; +} + grn_rc grn_db_init_builtin_window_functions(grn_ctx *ctx) { @@ -284,5 +397,9 @@ grn_db_init_builtin_window_functions(grn_ctx *ctx) "window_sum", -1, window_sum); + grn_window_function_create(ctx, + "window_count", -1, + window_count); + return GRN_SUCCESS; } Added: test/command/suite/select/columns/window_function/window_count/ascending.expected (+73 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/ascending.expected 2017-08-09 16:04:50 +0900 (10fc8878e) @@ -0,0 +1,73 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.sort_keys _id --output_columns '_id, name, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + 1 + ], + [ + 2, + "item2", + 2 + ], + [ + 3, + "item2", + 3 + ], + [ + 4, + "item1", + 4 + ], + [ + 5, + "item3", + 5 + ], + [ + 6, + "item1", + 6 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/ascending.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/ascending.test 2017-08-09 16:04:50 +0900 (d5165c648) @@ -0,0 +1,20 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.sort_keys _id \ + --output_columns '_id, name, count' \ + --sort_keys _id Added: test/command/suite/select/columns/window_function/window_count/descending.expected (+73 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/descending.expected 2017-08-09 16:04:50 +0900 (5589e2549) @@ -0,0 +1,73 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.sort_keys -_id --output_columns '_id, name, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + 6 + ], + [ + 2, + "item2", + 5 + ], + [ + 3, + "item2", + 4 + ], + [ + 4, + "item1", + 3 + ], + [ + 5, + "item3", + 2 + ], + [ + 6, + "item1", + 1 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/descending.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/descending.test 2017-08-09 16:04:50 +0900 (5befdefe1) @@ -0,0 +1,20 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.sort_keys -_id \ + --output_columns '_id, name, count' \ + --sort_keys _id Added: test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.expected (+85 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.expected 2017-08-09 16:04:50 +0900 (76509e737) @@ -0,0 +1,85 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Items user COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1", "user": "user3"}, +{"name": "item2", "user": "user2"}, +{"name": "item2", "user": "user2"}, +{"name": "item1", "user": "user3"}, +{"name": "item3", "user": "user1"}, +{"name": "item1", "user": "user1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.group_keys name,user --output_columns '_id, name, user, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "user", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + "user3", + 2 + ], + [ + 2, + "item2", + "user2", + 2 + ], + [ + 3, + "item2", + "user2", + 2 + ], + [ + 4, + "item1", + "user3", + 2 + ], + [ + 5, + "item3", + "user1", + 1 + ], + [ + 6, + "item1", + "user1", + 1 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.test (+21 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_multiple_keys_no_sort.test 2017-08-09 16:04:50 +0900 (bce3adc6c) @@ -0,0 +1,21 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText +column_create Items user COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1", "user": "user3"}, +{"name": "item2", "user": "user2"}, +{"name": "item2", "user": "user2"}, +{"name": "item1", "user": "user3"}, +{"name": "item3", "user": "user1"}, +{"name": "item1", "user": "user1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.group_keys name,user \ + --output_columns '_id, name, user, count' \ + --sort_keys _id Added: test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.expected (+85 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.expected 2017-08-09 16:04:50 +0900 (38e4c01e1) @@ -0,0 +1,85 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +column_create Items user COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1", "user": "user3"}, +{"name": "item2", "user": "user2"}, +{"name": "item2", "user": "user2"}, +{"name": "item1", "user": "user3"}, +{"name": "item3", "user": "user1"}, +{"name": "item1", "user": "user1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.group_keys name,user --columns[count].window.sort_keys _id --output_columns '_id, name, user, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "user", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + "user3", + 1 + ], + [ + 2, + "item2", + "user2", + 1 + ], + [ + 3, + "item2", + "user2", + 2 + ], + [ + 4, + "item1", + "user3", + 2 + ], + [ + 5, + "item3", + "user1", + 1 + ], + [ + 6, + "item1", + "user1", + 1 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.test (+22 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_multiple_keys_sort.test 2017-08-09 16:04:50 +0900 (95478fc6d) @@ -0,0 +1,22 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText +column_create Items user COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1", "user": "user3"}, +{"name": "item2", "user": "user2"}, +{"name": "item2", "user": "user2"}, +{"name": "item1", "user": "user3"}, +{"name": "item3", "user": "user1"}, +{"name": "item1", "user": "user1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.group_keys name,user \ + --columns[count].window.sort_keys _id \ + --output_columns '_id, name, user, count' \ + --sort_keys _id Added: test/command/suite/select/columns/window_function/window_count/group_no_sort.expected (+73 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_no_sort.expected 2017-08-09 16:04:50 +0900 (3cb72f4f7) @@ -0,0 +1,73 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.group_keys name --output_columns '_id, name, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + 3 + ], + [ + 2, + "item2", + 2 + ], + [ + 3, + "item2", + 2 + ], + [ + 4, + "item1", + 3 + ], + [ + 5, + "item3", + 1 + ], + [ + 6, + "item1", + 3 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/group_no_sort.test (+20 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_no_sort.test 2017-08-09 16:04:50 +0900 (6c29d183f) @@ -0,0 +1,20 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.group_keys name \ + --output_columns '_id, name, count' \ + --sort_keys _id Added: test/command/suite/select/columns/window_function/window_count/group_sort.expected (+73 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_sort.expected 2017-08-09 16:04:50 +0900 (51afd5538) @@ -0,0 +1,73 @@ +table_create Items TABLE_NO_KEY +[[0,0.0,0.0],true] +column_create Items name COLUMN_SCALAR ShortText +[[0,0.0,0.0],true] +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] +[[0,0.0,0.0],6] +select Items --columns[count].stage initial --columns[count].value 'window_count()' --columns[count].type UInt32 --columns[count].window.group_keys name --columns[count].window.sort_keys _id --output_columns '_id, name, count' --sort_keys _id +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 6 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "name", + "ShortText" + ], + [ + "count", + "UInt32" + ] + ], + [ + 1, + "item1", + 1 + ], + [ + 2, + "item2", + 1 + ], + [ + 3, + "item2", + 2 + ], + [ + 4, + "item1", + 2 + ], + [ + 5, + "item3", + 1 + ], + [ + 6, + "item1", + 3 + ] + ] + ] +] Added: test/command/suite/select/columns/window_function/window_count/group_sort.test (+21 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/columns/window_function/window_count/group_sort.test 2017-08-09 16:04:50 +0900 (5f6ab54c8) @@ -0,0 +1,21 @@ +table_create Items TABLE_NO_KEY +column_create Items name COLUMN_SCALAR ShortText + +load --table Items +[ +{"name": "item1"}, +{"name": "item2"}, +{"name": "item2"}, +{"name": "item1"}, +{"name": "item3"}, +{"name": "item1"} +] + +select Items \ + --columns[count].stage initial \ + --columns[count].value 'window_count()' \ + --columns[count].type UInt32 \ + --columns[count].window.group_keys name \ + --columns[count].window.sort_keys _id \ + --output_columns '_id, name, count' \ + --sort_keys _id -------------- next part -------------- HTML����������������������������...下载