[Groonga-commit] groonga/groonga at 0412e65 [master] select drilldowns: split group part and output part

Back to archive index

naoa null+****@clear*****
Sun Apr 10 06:14:41 JST 2016


naoa	2016-04-10 06:14:41 +0900 (Sun, 10 Apr 2016)

  New Revision: 0412e65c9ad5923ec7c6b2a1d28aa620da19f7fe
  https://github.com/groonga/groonga/commit/0412e65c9ad5923ec7c6b2a1d28aa620da19f7fe

  Merged 8d6664e: Merge pull request #524 from naoa/drilldown-table

  Message:
    select drilldowns: split group part and output part

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+47 -27)
===================================================================
--- lib/proc/proc_select.c    2016-04-08 19:14:17 +0900 (94431f1)
+++ lib/proc/proc_select.c    2016-04-10 06:14:41 +0900 (94b3351)
@@ -441,19 +441,22 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
                       grn_obj *condition)
 {
   unsigned int i;
+  grn_table_group_result *results;
+
+  results = GRN_PLUGIN_MALLOC(ctx, n_drilldowns * sizeof(grn_table_group_result));
 
   /* TODO: Remove invalid key drilldowns from the count. */
-  GRN_OUTPUT_MAP_OPEN("DRILLDOWNS", n_drilldowns);
   for (i = 0; i < n_drilldowns; i++) {
     drilldown_info *drilldown = &(drilldowns[i]);
     grn_table_sort_key *keys = NULL;
     unsigned int n_keys;
-    uint32_t n_hits;
-    int offset;
-    int limit;
-    grn_table_group_result result = {
-      NULL, 0, 0, 1, GRN_TABLE_GROUP_CALC_COUNT, 0, 0, NULL
-    };
+
+    results[i].table = NULL;
+    results[i].limit = 1;
+    results[i].flags = GRN_TABLE_GROUP_CALC_COUNT;
+    results[i].op = 0;
+    results[i].max_n_subrecs = 0;
+    results[i].calc_target = NULL;
 
     keys = grn_table_sort_key_from_str(ctx,
                                        drilldown->keys,
@@ -463,24 +466,39 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
       continue;
     }
 
-    GRN_OUTPUT_STR(drilldown->label, drilldown->label_len);
-
-    result.key_begin = 0;
-    result.key_end = n_keys - 1;
+    results[i].key_begin = 0;
+    results[i].key_end = n_keys - 1;
     if (n_keys > 1) {
-      result.max_n_subrecs = 1;
+      results[i].max_n_subrecs = 1;
     }
     if (drilldown->calc_target_name) {
-      result.calc_target = grn_obj_column(ctx, table,
-                                          drilldown->calc_target_name,
-                                          drilldown->calc_target_name_len);
+      results[i].calc_target = grn_obj_column(ctx, table,
+                                              drilldown->calc_target_name,
+                                              drilldown->calc_target_name_len);
+    }
+    if (results[i].calc_target) {
+      results[i].flags |= drilldown->calc_types;
     }
-    if (result.calc_target) {
-      result.flags |= drilldown->calc_types;
+
+    grn_table_group(ctx, table, keys, n_keys, &(results[i]), 1);
+
+    grn_table_sort_key_close(ctx, keys, n_keys);
+  }
+
+  GRN_OUTPUT_MAP_OPEN("DRILLDOWNS", n_drilldowns);
+  for (i = 0; i < n_drilldowns; i++) {
+    drilldown_info *drilldown = &(drilldowns[i]);
+    uint32_t n_hits;
+    int offset;
+    int limit;
+
+    if (!results[i].table) {
+      continue;
     }
 
-    grn_table_group(ctx, table, keys, n_keys, &result, 1);
-    n_hits = grn_table_size(ctx, result.table);
+    GRN_OUTPUT_STR(drilldown->label, drilldown->label_len);
+
+    n_hits = grn_table_size(ctx, results[i].table);
 
     offset = drilldown->offset;
     limit = drilldown->limit;
@@ -492,13 +510,13 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
       sort_keys = grn_table_sort_key_from_str(ctx,
                                               drilldown->sortby,
                                               drilldown->sortby_len,
-                                              result.table, &n_sort_keys);
+                                              results[i].table, &n_sort_keys);
       if (sort_keys) {
         grn_obj *sorted;
         sorted = grn_table_create(ctx, NULL, 0, NULL, GRN_OBJ_TABLE_NO_KEY,
-                                  NULL, result.table);
+                                  NULL, results[i].table);
         if (sorted) {
-          grn_table_sort(ctx, result.table, offset, limit,
+          grn_table_sort(ctx, results[i].table, offset, limit,
                          sorted, sort_keys, n_sort_keys);
           grn_proc_select_output_columns(ctx, sorted, n_hits, 0, limit,
                                          drilldown->output_columns,
@@ -509,23 +527,25 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
         grn_table_sort_key_close(ctx, sort_keys, n_sort_keys);
       }
     } else {
-      grn_proc_select_output_columns(ctx, result.table, n_hits, offset, limit,
+      grn_proc_select_output_columns(ctx, results[i].table, n_hits, offset, limit,
                                      drilldown->output_columns,
                                      drilldown->output_columns_len,
                                      condition);
     }
 
-    grn_table_sort_key_close(ctx, keys, n_keys);
-    if (result.calc_target) {
-      grn_obj_unlink(ctx, result.calc_target);
+    if (results[i].calc_target) {
+      grn_obj_unlink(ctx, results[i].calc_target);
+    }
+    if (results[i].table) {
+      grn_obj_unlink(ctx, results[i].table);
     }
-    grn_obj_unlink(ctx, result.table);
 
     GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
                   ":", "drilldown(%d)[%.*s]", n_hits,
                   (int)(drilldown->label_len), drilldown->label);
   }
   GRN_OUTPUT_MAP_CLOSE();
+  GRN_PLUGIN_FREE(ctx, results);
 }
 
 static grn_rc
-------------- next part --------------
HTML����������������������������...
Télécharger 



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