[Groonga-commit] groonga/groonga at db2b25c [master] window_sum: support putting sum per group to all records

Back to archive index

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 



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