[Groonga-commit] groonga/groonga at 18b0c62 [master] Add window_count

Back to archive index

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



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