[Groonga-commit] groonga/groonga at 1cc9618 [master] select: pack many arguments to a struct

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Apr 22 21:29:37 JST 2016


Kouhei Sutou	2016-04-22 21:29:37 +0900 (Fri, 22 Apr 2016)

  New Revision: 1cc9618117ac3ad8c9a6d549614d4868b132933a
  https://github.com/groonga/groonga/commit/1cc9618117ac3ad8c9a6d549614d4868b132933a

  Message:
    select: pack many arguments to a struct

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+275 -245)
===================================================================
--- lib/proc/proc_select.c    2016-04-22 17:47:30 +0900 (9155bcf)
+++ lib/proc/proc_select.c    2016-04-22 21:29:37 +0900 (3372380)
@@ -32,6 +32,51 @@
 #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;
+} grn_select_string;
+
+typedef struct {
+  const char *label;
+  unsigned int label_len;
+  const char *keys;
+  unsigned int keys_len;
+  const char *sortby;
+  unsigned int sortby_len;
+  const char *output_columns;
+  unsigned int output_columns_len;
+  int offset;
+  int limit;
+  grn_table_group_flags calc_types;
+  const char *calc_target_name;
+  unsigned int calc_target_name_len;
+  const char *table_name;
+  unsigned int table_name_len;
+} drilldown_info;
+
+typedef struct {
+  grn_select_string table;
+  grn_select_string match_columns;
+  grn_select_string query;
+  grn_select_string filter;
+  grn_select_string scorer;
+  grn_select_string sortby;
+  grn_select_string output_columns;
+  int offset;
+  int limit;
+  drilldown_info drilldowns[MAX_N_DRILLDOWNS];
+  unsigned int n_drilldowns;
+  grn_obj *drilldown_labels;
+  grn_select_string cache;
+  grn_select_string match_escalation_threshold;
+  grn_select_string query_expander;
+  grn_select_string query_flags;
+  grn_select_string adjuster;
+} grn_select_data;
+
 grn_rc
 grn_proc_syntax_expand_query(grn_ctx *ctx,
                              const char *query,
@@ -228,24 +273,6 @@ grn_proc_select_output_columns(grn_ctx *ctx, grn_obj *res,
   GRN_OBJ_FORMAT_FIN(ctx, &format);
 }
 
-typedef struct {
-  const char *label;
-  unsigned int label_len;
-  const char *keys;
-  unsigned int keys_len;
-  const char *sortby;
-  unsigned int sortby_len;
-  const char *output_columns;
-  unsigned int output_columns_len;
-  int offset;
-  int limit;
-  grn_table_group_flags calc_types;
-  const char *calc_target_name;
-  unsigned int calc_target_name_len;
-  const char *table_name;
-  unsigned int table_name_len;
-} drilldown_info;
-
 static grn_table_group_flags
 grn_parse_table_group_calc_types(grn_ctx *ctx,
                                  const char *calc_types,
@@ -791,22 +818,7 @@ grn_select_drilldowns(grn_ctx *ctx, grn_obj *table,
 }
 
 static grn_rc
-grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
-           const char *match_columns, unsigned int match_columns_len,
-           const char *query, unsigned int query_len,
-           const char *filter, unsigned int filter_len,
-           const char *scorer, unsigned int scorer_len,
-           const char *sortby, unsigned int sortby_len,
-           const char *output_columns, unsigned int output_columns_len,
-           int offset, int limit,
-           drilldown_info *drilldowns,
-           unsigned int n_drilldowns,
-           grn_obj *drilldown_labels,
-           const char *cache, unsigned int cache_len,
-           const char *match_escalation_threshold, unsigned int match_escalation_threshold_len,
-           const char *query_expander, unsigned int query_expander_len,
-           const char *query_flags, unsigned int query_flags_len,
-           const char *adjuster, unsigned int adjuster_len)
+grn_select(grn_ctx *ctx, grn_select_data *data)
 {
   uint32_t nkeys, nhits;
   uint16_t cacheable = 1, taintable = 0;
@@ -820,29 +832,38 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
   grn_cache *cache_obj = grn_cache_current_get(ctx);
 
   {
-    const char *query_end = query + query_len;
+    const char *query_end = data->query.value + data->query.length;
     int space_len;
-    while (query < query_end) {
-      space_len = grn_isspace(query, ctx->encoding);
+    while (data->query.value < query_end) {
+      space_len = grn_isspace(data->query.value, ctx->encoding);
       if (space_len == 0) {
         break;
       }
-      query += space_len;
-      query_len -= space_len;
+      data->query.value += space_len;
+      data->query.length -= space_len;
     }
   }
 
-  cache_key_size = table_len + 1 + match_columns_len + 1 + query_len + 1 +
-    filter_len + 1 + scorer_len + 1 + sortby_len + 1 + output_columns_len + 1 +
-    match_escalation_threshold_len + 1 +
-    query_expander_len + 1 + query_flags_len + 1 + adjuster_len + 1 +
-    sizeof(grn_content_type) + sizeof(int) * 2 +
+  cache_key_size =
+    data->table.length + 1 +
+    data->match_columns.length + 1 +
+    data->query.length + 1 +
+    data->filter.length + 1 +
+    data->scorer.length + 1 +
+    data->sortby.length + 1 +
+    data->output_columns.length + 1 +
+    data->match_escalation_threshold.length + 1 +
+    data->query_expander.length + 1 +
+    data->query_flags.length + 1 +
+    data->adjuster.length + 1 +
+    sizeof(grn_content_type) +
+    sizeof(int) * 2 +
     sizeof(grn_command_version) +
     sizeof(grn_bool);
   {
     unsigned int i;
-    for (i = 0; i < n_drilldowns; i++) {
-      drilldown_info *drilldown = &(drilldowns[i]);
+    for (i = 0; i < data->n_drilldowns; i++) {
+      drilldown_info *drilldown = &(data->drilldowns[i]);
       cache_key_size +=
         drilldown->keys_len + 1 +
         drilldown->sortby_len + 1 +
@@ -857,24 +878,23 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
   if (cache_key_size <= GRN_CACHE_MAX_KEY_SIZE) {
     grn_obj *cache_value;
     char *cp = cache_key;
-    grn_memcpy(cp, table, table_len);
-    cp += table_len; *cp++ = '\0';
-    grn_memcpy(cp, match_columns, match_columns_len);
-    cp += match_columns_len; *cp++ = '\0';
-    grn_memcpy(cp, query, query_len);
-    cp += query_len; *cp++ = '\0';
-    grn_memcpy(cp, filter, filter_len);
-    cp += filter_len; *cp++ = '\0';
-    grn_memcpy(cp, scorer, scorer_len);
-    cp += scorer_len; *cp++ = '\0';
-    grn_memcpy(cp, sortby, sortby_len);
-    cp += sortby_len; *cp++ = '\0';
-    grn_memcpy(cp, output_columns, output_columns_len);
-    cp += output_columns_len; *cp++ = '\0';
+
+#define PUT_CACHE_KEY(string)                                   \
+    grn_memcpy(cp, (string).value, (string).length);            \
+    cp += (string).length;                                      \
+    *cp++ = '\0'
+
+    PUT_CACHE_KEY(data->table);
+    PUT_CACHE_KEY(data->match_columns);
+    PUT_CACHE_KEY(data->query);
+    PUT_CACHE_KEY(data->filter);
+    PUT_CACHE_KEY(data->scorer);
+    PUT_CACHE_KEY(data->sortby);
+    PUT_CACHE_KEY(data->output_columns);
     {
       unsigned int i;
-      for (i = 0; i < n_drilldowns; i++) {
-        drilldown_info *drilldown = &(drilldowns[i]);
+      for (i = 0; i < data->n_drilldowns; i++) {
+        drilldown_info *drilldown = &(data->drilldowns[i]);
         grn_memcpy(cp, drilldown->keys, drilldown->keys_len);
         cp += drilldown->keys_len; *cp++ = '\0';
         grn_memcpy(cp, drilldown->sortby, drilldown->sortby_len);
@@ -889,19 +909,15 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
         cp += drilldown->table_name_len; *cp++ = '\0';
       }
     }
-    grn_memcpy(cp, match_escalation_threshold, match_escalation_threshold_len);
-    cp += match_escalation_threshold_len; *cp++ = '\0';
-    grn_memcpy(cp, query_expander, query_expander_len);
-    cp += query_expander_len; *cp++ = '\0';
-    grn_memcpy(cp, query_flags, query_flags_len);
-    cp += query_flags_len; *cp++ = '\0';
-    grn_memcpy(cp, adjuster, adjuster_len);
-    cp += adjuster_len; *cp++ = '\0';
+    PUT_CACHE_KEY(data->match_escalation_threshold);
+    PUT_CACHE_KEY(data->query_expander);
+    PUT_CACHE_KEY(data->query_flags);
+    PUT_CACHE_KEY(data->adjuster);
     grn_memcpy(cp, &output_type, sizeof(grn_content_type));
     cp += sizeof(grn_content_type);
-    grn_memcpy(cp, &offset, sizeof(int));
+    grn_memcpy(cp, &(data->offset), sizeof(int));
     cp += sizeof(int);
-    grn_memcpy(cp, &limit, sizeof(int));
+    grn_memcpy(cp, &(data->limit), sizeof(int));
     cp += sizeof(int);
     grn_memcpy(cp, &(ctx->impl->command_version), sizeof(grn_command_version));
     cp += sizeof(grn_command_version);
@@ -909,8 +925,8 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
     cp += sizeof(grn_bool);
     {
       unsigned int i;
-      for (i = 0; i < n_drilldowns; i++) {
-        drilldown_info *drilldown = &(drilldowns[i]);
+      for (i = 0; i < data->n_drilldowns; i++) {
+        drilldown_info *drilldown = &(data->drilldowns[i]);
         grn_memcpy(cp, &(drilldown->offset), sizeof(int));
         cp += sizeof(int);
         grn_memcpy(cp, &(drilldown->limit), sizeof(int));
@@ -919,6 +935,8 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
         cp += sizeof(grn_table_group_flags);
       }
     }
+#undef PUT_CACHE_KEY
+
     cache_value = grn_cache_fetch(ctx, cache_obj, cache_key, cache_key_size);
     if (cache_value) {
       GRN_TEXT_PUT(ctx, outbuf,
@@ -931,38 +949,50 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
       return ctx->rc;
     }
   }
-  if (match_escalation_threshold_len) {
+  if (data->match_escalation_threshold.length) {
     const char *end, *rest;
     original_threshold = grn_ctx_get_match_escalation_threshold(ctx);
-    end = match_escalation_threshold + match_escalation_threshold_len;
-    threshold = grn_atoll(match_escalation_threshold, end, &rest);
+    end =
+      data->match_escalation_threshold.value +
+      data->match_escalation_threshold.length;
+    threshold = grn_atoll(data->match_escalation_threshold.value, end, &rest);
     if (end == rest) {
       grn_ctx_set_match_escalation_threshold(ctx, threshold);
     }
   }
-  if ((table_ = grn_ctx_get(ctx, table, table_len))) {
-    // match_columns_ = grn_obj_column(ctx, table_, match_columns, match_columns_len);
-    if (filter_len && (filter[0] == '?') &&
+  if ((table_ = grn_ctx_get(ctx, data->table.value, data->table.length))) {
+    if (data->filter.length > 0 && (data->filter.value[0] == '?') &&
         (ctx->impl->output.type == GRN_CONTENT_JSON)) {
-      ctx->rc = grn_ts_select(ctx, table_, filter + 1, filter_len - 1,
-                              scorer, scorer_len,
-                              sortby, sortby_len,
-                              output_columns, output_columns_len,
-                              offset, limit);
+      ctx->rc = grn_ts_select(ctx, table_,
+                              data->filter.value + 1,
+                              data->filter.length - 1,
+                              data->scorer.value,
+                              data->scorer.length,
+                              data->sortby.value,
+                              data->sortby.length,
+                              data->output_columns.value,
+                              data->output_columns.length,
+                              data->offset,
+                              data->limit);
       if (!ctx->rc && cacheable && cache_key_size <= GRN_CACHE_MAX_KEY_SIZE &&
-          (!cache || cache_len != 2 || cache[0] != 'n' || cache[1] != 'o')) {
+          (!data->cache.value ||
+           data->cache.length != 2 ||
+           data->cache.value[0] != 'n' ||
+           data->cache.value[1] != 'o')) {
         grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf);
       }
       goto exit;
     }
-    if (query_len || filter_len) {
+    if (data->query.length > 0 || data->filter.length > 0) {
       grn_obj *v;
       GRN_EXPR_CREATE_FOR_QUERY(ctx, table_, cond, v);
       if (cond) {
-        if (match_columns_len) {
+        if (data->match_columns.length) {
           GRN_EXPR_CREATE_FOR_QUERY(ctx, table_, match_columns_, v);
           if (match_columns_) {
-            grn_expr_parse(ctx, match_columns_, match_columns, match_columns_len,
+            grn_expr_parse(ctx, match_columns_,
+                           data->match_columns.value,
+                           data->match_columns.length,
                            NULL, GRN_OP_MATCH, GRN_OP_AND,
                            GRN_EXPR_SYNTAX_SCRIPT);
             if (ctx->rc) {
@@ -972,12 +1002,17 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
             /* todo */
           }
         }
-        if (query_len) {
+        if (data->query.length > 0) {
           grn_expr_flags flags;
           grn_obj query_expander_buf;
+          const char *query = data->query.value;
+          unsigned int query_len = data->query.length;
+
           flags = GRN_EXPR_SYNTAX_QUERY;
-          if (query_flags_len) {
-            flags |= grn_parse_query_flags(ctx, query_flags, query_flags_len);
+          if (data->query_flags.length) {
+            flags |= grn_parse_query_flags(ctx,
+                                           data->query_flags.value,
+                                           data->query_flags.length);
             if (ctx->rc) {
               goto exit;
             }
@@ -985,11 +1020,14 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
             flags |= GRN_EXPR_ALLOW_PRAGMA|GRN_EXPR_ALLOW_COLUMN;
           }
           GRN_TEXT_INIT(&query_expander_buf, 0);
-          if (query_expander_len) {
+          if (data->query_expander.length) {
             grn_rc rc;
             rc = grn_proc_syntax_expand_query(ctx,
-                                              query, query_len, flags,
-                                              query_expander, query_expander_len,
+                                              data->query.value,
+                                              data->query.length,
+                                              flags,
+                                              data->query_expander.value,
+                                              data->query_expander.length,
                                               &query_expander_buf);
             if (rc == GRN_SUCCESS) {
               query = GRN_TEXT_VALUE(&query_expander_buf);
@@ -1002,14 +1040,14 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
           grn_expr_parse(ctx, cond, query, query_len,
                          match_columns_, GRN_OP_MATCH, GRN_OP_AND, flags);
           GRN_OBJ_FIN(ctx, &query_expander_buf);
-          if (!ctx->rc && filter_len) {
-            grn_expr_parse(ctx, cond, filter, filter_len,
+          if (!ctx->rc && data->filter.length > 0) {
+            grn_expr_parse(ctx, cond, data->filter.value, data->filter.length,
                            match_columns_, GRN_OP_MATCH, GRN_OP_AND,
                            GRN_EXPR_SYNTAX_SCRIPT);
             if (!ctx->rc) { grn_expr_append_op(ctx, cond, GRN_OP_AND, 2); }
           }
         } else {
-          grn_expr_parse(ctx, cond, filter, filter_len,
+          grn_expr_parse(ctx, cond, data->filter.value, data->filter.length,
                          match_columns_, GRN_OP_MATCH, GRN_OP_AND,
                          GRN_EXPR_SYNTAX_SCRIPT);
         }
@@ -1039,11 +1077,11 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
       uint32_t ngkeys;
       grn_table_sort_key *gkeys = NULL;
       int result_size = 1;
-      if (!ctx->rc && n_drilldowns > 0) {
-        if (n_drilldowns == 1 && !drilldowns[0].label) {
+      if (!ctx->rc && data->n_drilldowns > 0) {
+        if (data->n_drilldowns == 1 && !data->drilldowns[0].label) {
           gkeys = grn_table_sort_key_from_str(ctx,
-                                              drilldowns[0].keys,
-                                              drilldowns[0].keys_len,
+                                              data->drilldowns[0].keys,
+                                              data->drilldowns[0].keys_len,
                                               res, &ngkeys);
           if (gkeys) {
             result_size += ngkeys;
@@ -1053,34 +1091,39 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
         }
       }
 
-      if (adjuster && adjuster_len) {
-        grn_obj *adjuster_;
+      if (data->adjuster.length > 0) {
+        grn_obj *adjuster;
         grn_obj *v;
-        GRN_EXPR_CREATE_FOR_QUERY(ctx, table_, adjuster_, v);
-        if (adjuster_ && v) {
+        GRN_EXPR_CREATE_FOR_QUERY(ctx, table_, adjuster, v);
+        if (adjuster && v) {
           grn_rc rc;
-          rc = grn_expr_parse(ctx, adjuster_, adjuster, adjuster_len, NULL,
+          rc = grn_expr_parse(ctx, adjuster,
+                              data->adjuster.value,
+                              data->adjuster.length,
+                              NULL,
                               GRN_OP_MATCH, GRN_OP_ADJUST,
                               GRN_EXPR_SYNTAX_ADJUSTER);
           if (rc) {
-            grn_obj_unlink(ctx, adjuster_);
+            grn_obj_unlink(ctx, adjuster);
             goto exit;
           }
-          cacheable *= ((grn_expr *)adjuster_)->cacheable;
-          taintable += ((grn_expr *)adjuster_)->taintable;
-          grn_select_apply_adjuster(ctx, table_, res, adjuster_);
-          grn_obj_unlink(ctx, adjuster_);
+          cacheable *= ((grn_expr *)adjuster)->cacheable;
+          taintable += ((grn_expr *)adjuster)->taintable;
+          grn_select_apply_adjuster(ctx, table_, res, adjuster);
+          grn_obj_unlink(ctx, adjuster);
         }
         GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
                       ":", "adjust(%d)", nhits);
       }
 
-      if (scorer && scorer_len) {
+      if (data->scorer.length > 0) {
         grn_obj *v;
         GRN_EXPR_CREATE_FOR_QUERY(ctx, res, scorer_, v);
         if (scorer_ && v) {
           grn_table_cursor *tc;
-          grn_expr_parse(ctx, scorer_, scorer, scorer_len, NULL, GRN_OP_MATCH, GRN_OP_AND,
+          grn_expr_parse(ctx, scorer_,
+                         data->scorer.value,
+                         data->scorer.length, NULL, GRN_OP_MATCH, GRN_OP_AND,
                          GRN_EXPR_SYNTAX_SCRIPT|GRN_EXPR_ALLOW_UPDATE);
           cacheable *= ((grn_expr *)scorer_)->cacheable;
           taintable += ((grn_expr *)scorer_)->taintable;
@@ -1103,37 +1146,49 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
 
       GRN_OUTPUT_ARRAY_OPEN("RESULT", result_size);
 
-      grn_normalize_offset_and_limit(ctx, nhits, &offset, &limit);
+      grn_normalize_offset_and_limit(ctx, nhits,
+                                     &(data->offset), &(data->limit));
 
-      if (sortby_len &&
-          (keys = grn_table_sort_key_from_str(ctx, sortby, sortby_len, res, &nkeys))) {
+      if (data->sortby.length > 0 &&
+          (keys = grn_table_sort_key_from_str(ctx,
+                                              data->sortby.value,
+                                              data->sortby.length,
+                                              res,
+                                              &nkeys))) {
         if ((sorted = grn_table_create(ctx, NULL, 0, NULL,
                                        GRN_OBJ_TABLE_NO_KEY, NULL, res))) {
-          grn_table_sort(ctx, res, offset, limit, sorted, keys, nkeys);
+          grn_table_sort(ctx, res, data->offset, data->limit,
+                         sorted, keys, nkeys);
           GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
-                        ":", "sort(%d)", limit);
-          grn_proc_select_output_columns(ctx, sorted, nhits, 0, limit,
-                                         output_columns, output_columns_len,
+                        ":", "sort(%d)", data->limit);
+          grn_proc_select_output_columns(ctx, sorted, nhits, 0, data->limit,
+                                         data->output_columns.value,
+                                         data->output_columns.length,
                                          cond);
           grn_obj_unlink(ctx, sorted);
         }
         grn_table_sort_key_close(ctx, keys, nkeys);
       } else {
         if (!ctx->rc) {
-          grn_proc_select_output_columns(ctx, res, nhits, offset, limit,
-                                         output_columns, output_columns_len,
+          grn_proc_select_output_columns(ctx, res, nhits,
+                                         data->offset, data->limit,
+                                         data->output_columns.value,
+                                         data->output_columns.length,
                                          cond);
         }
       }
       GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
-                    ":", "output(%d)", limit);
+                    ":", "output(%d)", data->limit);
       if (!ctx->rc) {
         if (gkeys) {
-          drilldown_info *drilldown = &(drilldowns[0]);
+          drilldown_info *drilldown = &(data->drilldowns[0]);
           grn_select_drilldown(ctx, res, gkeys, ngkeys, drilldown);
-        } else if (n_drilldowns > 0) {
-          grn_select_drilldowns(ctx, res, drilldowns, n_drilldowns,
-                                drilldown_labels, cond);
+        } else if (data->n_drilldowns > 0) {
+          grn_select_drilldowns(ctx, res,
+                                data->drilldowns,
+                                data->n_drilldowns,
+                                data->drilldown_labels,
+                                cond);
         }
       }
       if (gkeys) {
@@ -1144,17 +1199,23 @@ grn_select(grn_ctx *ctx, const char *table, unsigned int table_len,
       GRN_OUTPUT_ARRAY_OPEN("RESULT", 0);
     }
     GRN_OUTPUT_ARRAY_CLOSE();
-    if (!ctx->rc && cacheable && cache_key_size <= GRN_CACHE_MAX_KEY_SIZE
-        && (!cache || cache_len != 2 || *cache != 'n' || *(cache + 1) != 'o')) {
+    if (!ctx->rc && cacheable && cache_key_size <= GRN_CACHE_MAX_KEY_SIZE &&
+        (!data->cache.value ||
+         data->cache.length != 2 ||
+         data->cache.value[0] != 'n' ||
+         data->cache.value[1] != 'o')) {
       grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf);
     }
     if (taintable) { grn_db_touch(ctx, DB_OBJ(table_)->db); }
     grn_obj_unlink(ctx, table_);
   } else {
-    ERR(GRN_INVALID_ARGUMENT, "invalid table name: <%.*s>", table_len, table);
+    ERR(GRN_INVALID_ARGUMENT,
+        "invalid table name: <%.*s>",
+        (int)(data->table.length),
+        data->table.value);
   }
 exit :
-  if (match_escalation_threshold_len) {
+  if (data->match_escalation_threshold.length > 0) {
     grn_ctx_set_match_escalation_threshold(ctx, original_threshold);
   }
   if (match_columns_) {
@@ -1207,97 +1268,81 @@ proc_select_find_all_drilldown_labels(grn_ctx *ctx, grn_user_data *user_data,
 static grn_obj *
 command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data)
 {
-#define MAX_N_DRILLDOWNS 10
-  const char *table;
-  size_t table_len;
-  const char *match_columns;
-  size_t match_columns_len;
-  const char *query;
-  size_t query_len;
-  const char *filter;
-  size_t filter_len;
-  const char *scorer;
-  size_t scorer_len;
-  const char *sortby;
-  size_t sortby_len;
-  const char *output_columns;
-  size_t output_columns_len;
-  int32_t offset;
-  int32_t limit;
+  grn_select_data data;
   grn_obj *drilldown;
-  drilldown_info drilldowns[MAX_N_DRILLDOWNS];
-  unsigned int n_drilldowns = 0;
-  grn_obj *drilldown_labels = NULL;
-  const char *cache;
-  size_t cache_len;
-  const char *match_escalation_threshold;
-  size_t match_escalation_threshold_len;
-  const char *query_flags;
-  size_t query_flags_len;
-  const char *query_expander;
-  size_t query_expander_len;
-  const char *adjuster;
-  size_t adjuster_len;
-
-  table = grn_plugin_proc_get_var_string(ctx, user_data,
-                                         "table", -1,
-                                         &table_len);
-  match_columns = grn_plugin_proc_get_var_string(ctx, user_data,
-                                                 "match_columns", -1,
-                                                 &match_columns_len);
-  query = grn_plugin_proc_get_var_string(ctx, user_data,
-                                         "query", -1,
-                                         &query_len);
-  filter = grn_plugin_proc_get_var_string(ctx, user_data,
-                                          "filter", -1,
-                                          &filter_len);
-  scorer = grn_plugin_proc_get_var_string(ctx, user_data,
-                                          "scorer", -1,
-                                          &scorer_len);
-  sortby = grn_plugin_proc_get_var_string(ctx, user_data,
-                                          "sortby", -1,
-                                          &sortby_len);
-  output_columns = grn_plugin_proc_get_var_string(ctx, user_data,
-                                                  "output_columns", -1,
-                                                  &output_columns_len);
-  if (!output_columns) {
-    output_columns = GRN_SELECT_DEFAULT_OUTPUT_COLUMNS;
-    output_columns_len = strlen(GRN_SELECT_DEFAULT_OUTPUT_COLUMNS);
+
+  data.n_drilldowns = 0;
+  data.drilldown_labels = NULL;
+
+  data.table.value = grn_plugin_proc_get_var_string(ctx, user_data,
+                                                    "table", -1,
+                                                    &(data.table.length));
+  data.match_columns.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "match_columns", -1,
+                                   &(data.match_columns.length));
+  data.query.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "query", -1,
+                                   &(data.query.length));
+  data.filter.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "filter", -1,
+                                   &(data.filter.length));
+  data.scorer.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "scorer", -1,
+                                   &(data.scorer.length));
+  data.sortby.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "sortby", -1,
+                                   &(data.sortby.length));
+  data.output_columns.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "output_columns", -1,
+                                   &(data.output_columns.length));
+  if (!data.output_columns.value) {
+    data.output_columns.value = GRN_SELECT_DEFAULT_OUTPUT_COLUMNS;
+    data.output_columns.length = strlen(GRN_SELECT_DEFAULT_OUTPUT_COLUMNS);
   }
-  offset = grn_plugin_proc_get_var_int32(ctx, user_data,
-                                         "offset", -1,
-                                         0);
-  limit = grn_plugin_proc_get_var_int32(ctx, user_data,
-                                        "limit", -1,
-                                        GRN_SELECT_DEFAULT_LIMIT);
-
-  cache = grn_plugin_proc_get_var_string(ctx, user_data,
-                                         "cache", -1,
-                                         &cache_len);
-  match_escalation_threshold =
+  data.offset = grn_plugin_proc_get_var_int32(ctx, user_data,
+                                              "offset", -1,
+                                              0);
+  data.limit = grn_plugin_proc_get_var_int32(ctx, user_data,
+                                             "limit", -1,
+                                             GRN_SELECT_DEFAULT_LIMIT);
+
+  data.cache.value = grn_plugin_proc_get_var_string(ctx, user_data,
+                                                    "cache", -1,
+                                                    &(data.cache.length));
+  data.match_escalation_threshold.value =
     grn_plugin_proc_get_var_string(ctx, user_data,
                                    "match_escalation_threshold", -1,
-                                   &match_escalation_threshold_len);
-  query_expander = grn_plugin_proc_get_var_string(ctx, user_data,
-                                                  "query_expander", -1,
-                                                  &query_expander_len);
-  if (!query_expander) {
-    query_expander = grn_plugin_proc_get_var_string(ctx, user_data,
-                                                    "query_expansion", -1,
-                                                    &query_expander_len);
+                                   &(data.match_escalation_threshold.length));
+  data.query_expander.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "query_expander", -1,
+                                   &(data.query_expander.length));
+  if (!data.query_expander.value) {
+    data.query_expander.value =
+      grn_plugin_proc_get_var_string(ctx, user_data,
+                                     "query_expansion", -1,
+                                     &(data.query_expander.length));
   }
-  query_flags = grn_plugin_proc_get_var_string(ctx, user_data,
-                                               "query_flags", -1,
-                                               &query_flags_len);
+  data.query_flags.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "query_flags", -1,
+                                   &(data.query_flags.length));
 
-  adjuster = grn_plugin_proc_get_var_string(ctx, user_data,
-                                            "adjuster", -1,
-                                            &adjuster_len);
+  data.adjuster.value =
+    grn_plugin_proc_get_var_string(ctx, user_data,
+                                   "adjuster", -1,
+                                   &(data.adjuster.length));
 
   drilldown = grn_plugin_proc_get_var(ctx, user_data,
                                       "drilldown", -1);
   if (GRN_TEXT_LEN(drilldown) > 0) {
-    drilldown_info *drilldown_info = &(drilldowns[0]);
+    drilldown_info *drilldown_info = &(data.drilldowns[0]);
     drilldown_info->label = NULL;
     drilldown_info->label_len = 0;
     drilldown_info_fill(ctx,
@@ -1316,24 +1361,25 @@ 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);
-    n_drilldowns++;
+    data.n_drilldowns++;
   } else {
     unsigned int i;
     grn_table_cursor *cursor = NULL;
-    drilldown_labels = grn_table_create(ctx, NULL, 0, NULL,
-                                        GRN_OBJ_TABLE_HASH_KEY,
-                                        grn_ctx_at(ctx, GRN_DB_SHORT_TEXT),
-                                        NULL);
-    if (drilldown_labels) {
-      proc_select_find_all_drilldown_labels(ctx, user_data, drilldown_labels);
-      cursor = grn_table_cursor_open(ctx, drilldown_labels,
+    data.drilldown_labels = grn_table_create(ctx, NULL, 0, NULL,
+                                             GRN_OBJ_TABLE_HASH_KEY,
+                                             grn_ctx_at(ctx, GRN_DB_SHORT_TEXT),
+                                             NULL);
+    if (data.drilldown_labels) {
+      proc_select_find_all_drilldown_labels(ctx, user_data,
+                                            data.drilldown_labels);
+      cursor = grn_table_cursor_open(ctx, data.drilldown_labels,
                                      NULL, 0, NULL, 0, 0, -1, 0);
     }
     if (cursor) {
       i = 0;
-      n_drilldowns = grn_table_size(ctx, drilldown_labels);
+      data.n_drilldowns = grn_table_size(ctx, data.drilldown_labels);
       while (grn_table_cursor_next(ctx, cursor)) {
-        drilldown_info *drilldown = &(drilldowns[i]);
+        drilldown_info *drilldown = &(data.drilldowns[i]);
         const char *label;
         int label_len;
         char key_name[GRN_TABLE_MAX_KEY_SIZE];
@@ -1350,7 +1396,7 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
         drilldown->label = label;
         drilldown->label_len = label_len;
 
-#define GET_VAR(name)\
+#define GET_VAR(name)                                                   \
         grn_snprintf(key_name,                                            \
                      GRN_TABLE_MAX_KEY_SIZE,                              \
                      GRN_TABLE_MAX_KEY_SIZE,                              \
@@ -1376,28 +1422,12 @@ command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data
       grn_table_cursor_close(ctx, cursor);
     }
   }
-  if (grn_select(ctx,
-                 table, table_len,
-                 match_columns, match_columns_len,
-                 query, query_len,
-                 filter, filter_len,
-                 scorer, scorer_len,
-                 sortby, sortby_len,
-                 output_columns, output_columns_len,
-                 offset, limit,
-                 drilldowns, n_drilldowns,
-                 drilldown_labels,
-                 cache, cache_len,
-                 match_escalation_threshold,
-                 match_escalation_threshold_len,
-                 query_expander, query_expander_len,
-                 query_flags, query_flags_len,
-                 adjuster, adjuster_len)) {
-  }
-  if (drilldown_labels) {
-    grn_obj_unlink(ctx, drilldown_labels);
+
+  grn_select(ctx, &data);
+
+  if (data.drilldown_labels) {
+    grn_obj_unlink(ctx, data.drilldown_labels);
   }
-#undef MAX_N_DRILLDOWNS
 
   return NULL;
 }
-------------- next part --------------
HTML����������������������������...
다운로드 



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