[Groonga-commit] groonga/groonga at b18d749 [master] select: unlimit N labeled drilldowns

Back to archive index

Kouhei Sutou null+****@clear*****
Wed May 4 22:33:12 JST 2016


Kouhei Sutou	2016-05-04 22:33:12 +0900 (Wed, 04 May 2016)

  New Revision: b18d749c40219d4bf641bc69bede31e4fad82df2
  https://github.com/groonga/groonga/commit/b18d749c40219d4bf641bc69bede31e4fad82df2

  Message:
    select: unlimit N labeled drilldowns

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+22 -5)
===================================================================
--- lib/proc/proc_select.c    2016-05-04 22:24:56 +0900 (d0455fb)
+++ lib/proc/proc_select.c    2016-05-04 22:33:12 +0900 (2f543b8)
@@ -32,8 +32,6 @@
 #define DEFAULT_DRILLDOWN_LIMIT           10
 #define DEFAULT_DRILLDOWN_OUTPUT_COLUMNS  "_key, _nsubrecs"
 
-#define MAX_N_DRILLDOWNS 10
-
 typedef struct {
   const char *value;
   size_t length;
@@ -61,7 +59,7 @@ typedef struct {
   grn_select_string output_columns;
   int offset;
   int limit;
-  grn_drilldown_data drilldowns[MAX_N_DRILLDOWNS];
+  grn_drilldown_data *drilldowns;
   unsigned int n_drilldowns;
   grn_obj *drilldown_labels;
   grn_select_string cache;
@@ -1261,6 +1259,7 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
   grn_select_data data;
   grn_obj *drilldown;
 
+  data.drilldowns = NULL;
   data.n_drilldowns = 0;
   data.drilldown_labels = NULL;
 
@@ -1332,7 +1331,15 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
   drilldown = grn_plugin_proc_get_var(ctx, user_data,
                                       "drilldown", -1);
   if (GRN_TEXT_LEN(drilldown) > 0) {
-    grn_drilldown_data *drilldown_data = &(data.drilldowns[0]);
+    grn_drilldown_data *drilldown_data;
+    data.n_drilldowns = 1;
+    data.drilldowns = GRN_PLUGIN_MALLOCN(ctx,
+                                         grn_drilldown_data,
+                                         data.n_drilldowns);
+    if (!data.drilldowns) {
+      goto exit;
+    }
+    drilldown_data = &(data.drilldowns[0]);
     drilldown_data->label.value = NULL;
     drilldown_data->label.length = 0;
     grn_drilldown_data_fill(ctx,
@@ -1351,7 +1358,6 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
                             grn_plugin_proc_get_var(ctx, user_data,
                                                     "drilldown_calc_target", -1),
                             NULL);
-    data.n_drilldowns++;
   } else {
     unsigned int i;
     grn_table_cursor *cursor = NULL;
@@ -1368,6 +1374,13 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
     if (cursor) {
       i = 0;
       data.n_drilldowns = grn_table_size(ctx, data.drilldown_labels);
+      data.drilldowns = GRN_PLUGIN_MALLOCN(ctx,
+                                           grn_drilldown_data,
+                                           data.n_drilldowns);
+      if (!data.drilldowns) {
+        grn_table_cursor_close(ctx, cursor);
+        goto exit;
+      }
       while (grn_table_cursor_next(ctx, cursor)) {
         grn_drilldown_data *drilldown = &(data.drilldowns[i]);
         const char *label;
@@ -1415,6 +1428,10 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
 
   grn_select(ctx, &data);
 
+exit :
+  if (data.drilldowns) {
+    GRN_PLUGIN_FREE(ctx, data.drilldowns);
+  }
   if (data.drilldown_labels) {
     grn_obj_unlink(ctx, data.drilldown_labels);
   }
-------------- next part --------------
HTML����������������������������...
Download 



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