[Groonga-commit] groonga/groonga at fad5770 [master] select: extract common code

Back to archive index

Kouhei Sutou null+****@clear*****
Thu May 12 18:13:22 JST 2016


Kouhei Sutou	2016-05-12 18:13:22 +0900 (Thu, 12 May 2016)

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

  Message:
    select: extract common code

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+139 -99)
===================================================================
--- lib/proc/proc_select.c    2016-05-12 17:44:17 +0900 (ac63016)
+++ lib/proc/proc_select.c    2016-05-12 18:13:22 +0900 (162a56d)
@@ -914,6 +914,115 @@ grn_select_apply_columns(grn_ctx *ctx,
   grn_hash_cursor_close(ctx, columns_cursor);
 }
 
+static grn_bool
+grn_select_drilldown_execute(grn_ctx *ctx,
+                             grn_obj *table,
+                             grn_table_sort_key *key,
+                             grn_hash *drilldowns,
+                             grn_id id,
+                             grn_obj *condition)
+{
+  grn_table_sort_key *keys = NULL;
+  unsigned int n_keys = 0;
+  grn_obj *target_table = table;
+  grn_drilldown_data *drilldown;
+  uint32_t size;
+  grn_table_group_result *result;
+
+  drilldown =
+    (grn_drilldown_data *)grn_hash_get_value_(ctx, drilldowns, id, &size);
+  result = &(drilldown->result);
+
+  result->limit = 1;
+  result->flags = GRN_TABLE_GROUP_CALC_COUNT;
+  result->op = 0;
+  result->max_n_subrecs = 0;
+  result->key_begin = 0;
+  result->key_end = 0;
+  if (result->calc_target) {
+    grn_obj_unlink(ctx, result->calc_target);
+  }
+  result->calc_target = NULL;
+
+  if (drilldown->table_name.length > 0) {
+    grn_id dependent_id;
+    dependent_id = grn_hash_get(ctx,
+                                drilldowns,
+                                drilldown->table_name.value,
+                                drilldown->table_name.length,
+                                NULL);
+    if (dependent_id == GRN_ID_NIL) {
+      GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT,
+                       "[select][drilldown][%.*s][table] "
+                       "nonexistent label: <%.*s>",
+                       (int)(drilldown->label.length),
+                       drilldown->label.value,
+                       (int)(drilldown->table_name.length),
+                       drilldown->table_name.value);
+      return GRN_FALSE;
+    } else {
+      grn_drilldown_data *dependent_drilldown;
+      grn_table_group_result *dependent_result;
+
+      dependent_drilldown =
+        (grn_drilldown_data *)grn_hash_get_value_(ctx,
+                                                  drilldowns,
+                                                  dependent_id,
+                                                  &size);
+      dependent_result = &(dependent_drilldown->result);
+      target_table = dependent_result->table;
+    }
+  }
+
+  if (key) {
+    result->key_end = 1;
+  } else if (drilldown->keys.length > 0) {
+    keys = grn_table_sort_key_from_str(ctx,
+                                       drilldown->keys.value,
+                                       drilldown->keys.length,
+                                       target_table, &n_keys);
+    if (!keys) {
+      GRN_PLUGIN_CLEAR_ERROR(ctx);
+      return GRN_FALSE;
+    }
+
+    result->key_end = n_keys - 1;
+    if (n_keys > 1) {
+      result->max_n_subrecs = 1;
+    }
+  }
+
+  if (drilldown->calc_target_name.length > 0) {
+    result->calc_target = grn_obj_column(ctx, target_table,
+                                         drilldown->calc_target_name.value,
+                                         drilldown->calc_target_name.length);
+  }
+  if (result->calc_target) {
+    result->flags |= drilldown->calc_types;
+  }
+
+  if (key) {
+    grn_table_group(ctx, target_table, key, 1, result, 1);
+  } else {
+    grn_table_group(ctx, target_table, keys, n_keys, result, 1);
+  }
+
+  if (keys) {
+    grn_table_sort_key_close(ctx, keys, n_keys);
+  }
+
+  if (!result->table) {
+    return GRN_FALSE;
+  }
+
+  if (drilldown->columns.initial) {
+    grn_select_apply_columns(ctx, result->table, drilldown->columns.initial,
+                             condition);
+  }
+
+  return GRN_TRUE;
+}
+
 static void
 grn_select_drilldown(grn_ctx *ctx,
                      grn_obj *table,
@@ -923,8 +1032,9 @@ grn_select_drilldown(grn_ctx *ctx,
                      grn_obj *condition)
 {
   grn_id first_id = 1;
-  grn_drilldown_data *drilldown = NULL;
+  grn_drilldown_data *drilldown;
   uint32_t size;
+  grn_table_group_result *result;
   uint32_t i;
 
   drilldown =
@@ -933,33 +1043,28 @@ grn_select_drilldown(grn_ctx *ctx,
     return;
   }
 
+  result = &(drilldown->result);
+
   for (i = 0; i < n_keys; i++) {
-    grn_table_group_result g = {NULL, 0, 0, 1, GRN_TABLE_GROUP_CALC_COUNT, 0};
     grn_obj *target_table;
     uint32_t n_hits;
     int offset;
     int limit;
 
-    if (drilldown->calc_target_name.length > 0) {
-      g.calc_target = grn_obj_column(ctx, table,
-                                     drilldown->calc_target_name.value,
-                                     drilldown->calc_target_name.length);
-    }
-    if (g.calc_target) {
-      g.flags |= drilldown->calc_types;
-    }
-
-    grn_table_group(ctx, table, &keys[i], 1, &g, 1);
-    if (ctx->rc != GRN_SUCCESS) {
+    if (!grn_select_drilldown_execute(ctx,
+                                      table,
+                                      keys + i,
+                                      drilldowns,
+                                      first_id,
+                                      condition)) {
       break;
     }
 
     if (drilldown->filter.length > 0) {
       grn_obj *expression;
       grn_obj *record;
-      GRN_EXPR_CREATE_FOR_QUERY(ctx, g.table, expression, record);
+      GRN_EXPR_CREATE_FOR_QUERY(ctx, result->table, expression, record);
       if (!expression) {
-        grn_obj_close(ctx, g.table);
         GRN_PLUGIN_ERROR(ctx,
                          GRN_INVALID_ARGUMENT,
                          "[select][drilldown][filter] "
@@ -977,7 +1082,6 @@ grn_select_drilldown(grn_ctx *ctx,
                      GRN_EXPR_SYNTAX_SCRIPT);
       if (ctx->rc != GRN_SUCCESS) {
         grn_obj_close(ctx, expression);
-        grn_obj_close(ctx, g.table);
         GRN_PLUGIN_ERROR(ctx,
                          GRN_INVALID_ARGUMENT,
                          "[select][drilldown][filter] "
@@ -987,13 +1091,16 @@ grn_select_drilldown(grn_ctx *ctx,
                          ctx->errbuf);
         break;
       }
-      target_table = grn_table_select(ctx, g.table, expression, NULL, GRN_OP_OR);
+      target_table = grn_table_select(ctx,
+                                      result->table,
+                                      expression,
+                                      NULL,
+                                      GRN_OP_OR);
       if (ctx->rc != GRN_SUCCESS) {
         grn_obj_close(ctx, expression);
         if (target_table) {
           grn_obj_close(ctx, target_table);
         }
-        grn_obj_close(ctx, g.table);
         GRN_PLUGIN_ERROR(ctx,
                          GRN_INVALID_ARGUMENT,
                          "[select][drilldown][filter] "
@@ -1004,7 +1111,7 @@ grn_select_drilldown(grn_ctx *ctx,
         break;
       }
     } else {
-      target_table = g.table;
+      target_table = result->table;
     }
 
     n_hits = grn_table_size(ctx, target_table);
@@ -1055,10 +1162,14 @@ grn_select_drilldown(grn_ctx *ctx,
       GRN_OUTPUT_OBJ(target_table, &format);
       GRN_OBJ_FORMAT_FIN(ctx, &format);
     }
-    if (target_table != g.table) {
+    if (target_table != result->table) {
       grn_obj_close(ctx, target_table);
     }
-    grn_obj_close(ctx, g.table);
+    if (result->calc_target) {
+      grn_obj_unlink(ctx, result->calc_target);
+    }
+    grn_obj_close(ctx, result->table);
+    result->table = NULL;
     GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
                   ":", "drilldown(%d)", n_hits);
   }
@@ -1196,90 +1307,19 @@ grn_select_drilldowns_execute(grn_ctx *ctx,
 
   n_drilldowns = GRN_BULK_VSIZE(&tsorted_ids) / sizeof(grn_id);
   for (i = 0; i < n_drilldowns; i++) {
-    grn_table_sort_key *keys = NULL;
-    unsigned int n_keys = 0;
-    grn_obj *target_table = table;
     grn_id id;
-    grn_drilldown_data *drilldown;
-    uint32_t size;
-    grn_table_group_result *result;
 
     id = GRN_RECORD_VALUE_AT(&tsorted_ids, i);
-    drilldown =
-      (grn_drilldown_data *)grn_hash_get_value_(ctx, drilldowns, id, &size);
-    result = &(drilldown->result);
-
-    result->limit = 1;
-    result->flags = GRN_TABLE_GROUP_CALC_COUNT;
-    result->op = 0;
-    result->max_n_subrecs = 0;
-    result->key_begin = 0;
-    result->key_end = 0;
-    result->calc_target = NULL;
-
-    if (drilldown->table_name.length > 0) {
-      grn_id dependent_id;
-      dependent_id = grn_hash_get(ctx,
-                                  drilldowns,
-                                  drilldown->table_name.value,
-                                  drilldown->table_name.length,
-                                  NULL);
-      if (dependent_id == GRN_ID_NIL) {
-        GRN_PLUGIN_ERROR(ctx, GRN_INVALID_ARGUMENT,
-                         "[select][drilldown][%.*s][table] "
-                         "nonexistent label: <%.*s>",
-                         (int)(drilldown->label.length),
-                         drilldown->label.value,
-                         (int)(drilldown->table_name.length),
-                         drilldown->table_name.value);
+    if (!grn_select_drilldown_execute(ctx,
+                                      table,
+                                      NULL,
+                                      drilldowns,
+                                      id,
+                                      condition)) {
+      if (ctx->rc != GRN_SUCCESS) {
         break;
-      } else {
-        grn_drilldown_data *dependent_drilldown;
-        grn_table_group_result *dependent_result;
-
-        dependent_drilldown =
-          (grn_drilldown_data *)grn_hash_get_value_(ctx,
-                                                    drilldowns,
-                                                    dependent_id,
-                                                    &size);
-        dependent_result = &(dependent_drilldown->result);
-        target_table = dependent_result->table;
-      }
-    }
-
-    if (drilldown->keys.length > 0) {
-      keys = grn_table_sort_key_from_str(ctx,
-                                         drilldown->keys.value,
-                                         drilldown->keys.length,
-                                         target_table, &n_keys);
-      if (!keys) {
-        GRN_PLUGIN_CLEAR_ERROR(ctx);
-        continue;
-      }
-
-      result->key_end = n_keys - 1;
-      if (n_keys > 1) {
-        result->max_n_subrecs = 1;
       }
     }
-
-    if (drilldown->calc_target_name.length > 0) {
-      result->calc_target = grn_obj_column(ctx, target_table,
-                                           drilldown->calc_target_name.value,
-                                           drilldown->calc_target_name.length);
-    }
-    if (result->calc_target) {
-      result->flags |= drilldown->calc_types;
-    }
-
-    grn_table_group(ctx, target_table, keys, n_keys, result, 1);
-    if (keys) {
-      grn_table_sort_key_close(ctx, keys, n_keys);
-    }
-    if (drilldown->columns.initial) {
-      grn_select_apply_columns(ctx, result->table, drilldown->columns.initial,
-                               condition);
-    }
   }
 
 exit :
-------------- next part --------------
HTML����������������������������...
Download 



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