Kouhei Sutou
null+****@clear*****
Wed Feb 1 11:58:48 JST 2017
Kouhei Sutou 2017-02-01 11:58:48 +0900 (Wed, 01 Feb 2017) New Revision: db2b25ca371c13cb48c37b57289a5e76e8140849 https://github.com/groonga/groonga/commit/db2b25ca371c13cb48c37b57289a5e76e8140849 Message: window_sum: support putting sum per group to all records If window.sort_keys isn't specified, windows_sum runs in this mode. Copied files: test/command/suite/select/columns/window_function/window_sum/group_no_sort.expected (from test/command/suite/select/columns/window_function/window_sum/group.expected) test/command/suite/select/columns/window_function/window_sum/group_no_sort.test (from test/command/suite/select/columns/window_function/window_sum/group.test) Modified files: lib/window_function.c lib/window_functions.c Renamed files: test/command/suite/select/columns/window_function/window_sum/group_sort.expected (from test/command/suite/select/columns/window_function/window_sum/group.expected) test/command/suite/select/columns/window_function/window_sum/group_sort.test (from test/command/suite/select/columns/window_function/window_sum/group.test) Modified: lib/window_function.c (+1 -1) =================================================================== --- lib/window_function.c 2017-02-01 11:55:22 +0900 (faade68) +++ lib/window_function.c 2017-02-01 11:58:48 +0900 (5e7d615) @@ -227,7 +227,7 @@ grn_window_set_sort_keys(grn_ctx *ctx, id, &record_id, sizeof(grn_id)); } - GRN_RECORD_PUT(ctx, &(window->ids), id); + GRN_RECORD_PUT(ctx, &(window->ids), record_id); } GRN_TABLE_EACH_END(ctx, cursor); } Modified: lib/window_functions.c (+105 -40) =================================================================== --- lib/window_functions.c 2017-02-01 11:55:22 +0900 (ad778c2) +++ lib/window_functions.c 2017-02-01 11:58:48 +0900 (ed7b9a5) @@ -142,59 +142,124 @@ window_sum(grn_ctx *ctx, } GRN_VOID_INIT(&value); - while ((id = grn_window_next(ctx, window))) { - GRN_BULK_REWIND(&value); - grn_obj_get_value(ctx, target, id, &value); - switch (target_range_id) { + if (grn_window_is_sorted(ctx, window)) { + while ((id = grn_window_next(ctx, window))) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx, target, id, &value); + switch (target_range_id) { + case GRN_DB_INT8 : + GRN_INT64_SET(ctx, + &sum, + GRN_INT64_VALUE(&sum) + GRN_INT8_VALUE(&value)); + break; + case GRN_DB_INT16 : + GRN_INT64_SET(ctx, + &sum, + GRN_INT64_VALUE(&sum) + GRN_INT16_VALUE(&value)); + break; + case GRN_DB_INT32 : + GRN_INT64_SET(ctx, + &sum, + GRN_INT64_VALUE(&sum) + GRN_INT32_VALUE(&value)); + break; + case GRN_DB_INT64 : + GRN_INT64_SET(ctx, + &sum, + GRN_INT64_VALUE(&sum) + GRN_INT64_VALUE(&value)); + break; + case GRN_DB_UINT8 : + GRN_UINT64_SET(ctx, + &sum, + GRN_UINT64_VALUE(&sum) + GRN_UINT8_VALUE(&value)); + break; + case GRN_DB_UINT16 : + GRN_UINT64_SET(ctx, + &sum, + GRN_UINT64_VALUE(&sum) + GRN_UINT16_VALUE(&value)); + break; + case GRN_DB_UINT32 : + GRN_UINT64_SET(ctx, + &sum, + GRN_UINT64_VALUE(&sum) + GRN_UINT32_VALUE(&value)); + break; + case GRN_DB_UINT64 : + GRN_UINT64_SET(ctx, + &sum, + GRN_UINT64_VALUE(&sum) + GRN_UINT64_VALUE(&value)); + break; + case GRN_DB_FLOAT : + GRN_FLOAT_SET(ctx, + &sum, + GRN_FLOAT_VALUE(&sum) + GRN_FLOAT_VALUE(&value)); + break; + default : + break; + } + grn_obj_set_value(ctx, output_column, id, &sum, GRN_OBJ_SET); + } + } else { + int64_t sum_raw_int64 = 0; + uint64_t sum_raw_uint64 = 0; + double sum_raw_double = 0.0; + + while ((id = grn_window_next(ctx, window))) { + GRN_BULK_REWIND(&value); + grn_obj_get_value(ctx, target, id, &value); + switch (target_range_id) { + case GRN_DB_INT8 : + sum_raw_int64 += GRN_INT8_VALUE(&value); + break; + case GRN_DB_INT16 : + sum_raw_int64 += GRN_INT16_VALUE(&value); + break; + case GRN_DB_INT32 : + sum_raw_int64 += GRN_INT32_VALUE(&value); + break; + case GRN_DB_INT64 : + sum_raw_int64 += GRN_INT64_VALUE(&value); + break; + case GRN_DB_UINT8 : + sum_raw_uint64 += GRN_UINT8_VALUE(&value); + break; + case GRN_DB_UINT16 : + sum_raw_uint64 += GRN_UINT16_VALUE(&value); + break; + case GRN_DB_UINT32 : + sum_raw_uint64 += GRN_UINT32_VALUE(&value); + break; + case GRN_DB_UINT64 : + sum_raw_uint64 += GRN_UINT64_VALUE(&value); + break; + case GRN_DB_FLOAT : + sum_raw_double += GRN_FLOAT_VALUE(&value); + break; + default : + break; + } + } + + switch (output_column_range_id) { case GRN_DB_INT8 : - GRN_INT64_SET(ctx, - &sum, - GRN_INT64_VALUE(&sum) + GRN_INT8_VALUE(&value)); - break; case GRN_DB_INT16 : - GRN_INT64_SET(ctx, - &sum, - GRN_INT64_VALUE(&sum) + GRN_INT16_VALUE(&value)); - break; case GRN_DB_INT32 : - GRN_INT64_SET(ctx, - &sum, - GRN_INT64_VALUE(&sum) + GRN_INT32_VALUE(&value)); - break; case GRN_DB_INT64 : - GRN_INT64_SET(ctx, - &sum, - GRN_INT64_VALUE(&sum) + GRN_INT64_VALUE(&value)); + GRN_INT64_SET(ctx, &sum, sum_raw_int64); break; case GRN_DB_UINT8 : - GRN_UINT64_SET(ctx, - &sum, - GRN_UINT64_VALUE(&sum) + GRN_UINT8_VALUE(&value)); - break; case GRN_DB_UINT16 : - GRN_UINT64_SET(ctx, - &sum, - GRN_UINT64_VALUE(&sum) + GRN_UINT16_VALUE(&value)); - break; case GRN_DB_UINT32 : - GRN_UINT64_SET(ctx, - &sum, - GRN_UINT64_VALUE(&sum) + GRN_UINT32_VALUE(&value)); - break; case GRN_DB_UINT64 : - GRN_UINT64_SET(ctx, - &sum, - GRN_UINT64_VALUE(&sum) + GRN_UINT64_VALUE(&value)); + GRN_UINT64_SET(ctx, &sum, sum_raw_uint64); break; case GRN_DB_FLOAT : - GRN_FLOAT_SET(ctx, - &sum, - GRN_FLOAT_VALUE(&sum) + GRN_FLOAT_VALUE(&value)); - break; - default : + GRN_FLOAT_SET(ctx, &sum, sum_raw_double); break; } - grn_obj_set_value(ctx, output_column, id, &sum, GRN_OBJ_SET); + + grn_window_rewind(ctx, window); + while ((id = grn_window_next(ctx, window))) { + grn_obj_set_value(ctx, output_column, id, &sum, GRN_OBJ_SET); + } } GRN_OBJ_FIN(ctx, &value); Copied: test/command/suite/select/columns/window_function/window_sum/group_no_sort.expected (+4 -4) 87% =================================================================== --- test/command/suite/select/columns/window_function/window_sum/group.expected 2017-02-01 11:55:22 +0900 (2847c88) +++ test/command/suite/select/columns/window_function/window_sum/group_no_sort.expected 2017-02-01 11:58:48 +0900 (46ad5ef) @@ -14,7 +14,7 @@ load --table Logs {"item": "item3", "price": 222} ] [[0,0.0,0.0],6] -select Logs --columns[sum].stage initial --columns[sum].value 'window_sum(price)' --columns[sum].type UInt32 --columns[sum].window.group_keys item --columns[sum].window.sort_keys price --output_columns 'item, price, sum' --sort_keys item,price +select Logs --columns[sum].stage initial --columns[sum].value 'window_sum(price)' --columns[sum].type UInt32 --columns[sum].window.group_keys item --output_columns 'item, price, sum' --sort_keys item,price [ [ 0, @@ -43,12 +43,12 @@ select Logs --columns[sum].stage initial --columns[sum].value 'window_sum(pr [ "item1", 666, - 666 + 2442 ], [ "item1", 777, - 1443 + 2442 ], [ "item1", @@ -58,7 +58,7 @@ select Logs --columns[sum].stage initial --columns[sum].value 'window_sum(pr [ "item2", 111, - 111 + 444 ], [ "item2", Copied: test/command/suite/select/columns/window_function/window_sum/group_no_sort.test (+0 -1) 93% =================================================================== --- test/command/suite/select/columns/window_function/window_sum/group.test 2017-02-01 11:55:22 +0900 (3a6f148) +++ test/command/suite/select/columns/window_function/window_sum/group_no_sort.test 2017-02-01 11:58:48 +0900 (c25ddc1) @@ -17,6 +17,5 @@ select Logs \ --columns[sum].value 'window_sum(price)' \ --columns[sum].type UInt32 \ --columns[sum].window.group_keys item \ - --columns[sum].window.sort_keys price \ --output_columns 'item, price, sum' \ --sort_keys item,price Renamed: test/command/suite/select/columns/window_function/window_sum/group_sort.expected (+0 -0) 100% =================================================================== Renamed: test/command/suite/select/columns/window_function/window_sum/group_sort.test (+0 -0) 100% =================================================================== -------------- next part -------------- HTML����������������������������...Download