[Groonga-commit] groonga/groonga at 78d5907 [master] functions/index_column: extract to get index_column code

Back to archive index

Naoya Murakami null+****@clear*****
Thu Dec 21 17:44:27 JST 2017


Naoya Murakami	2017-12-21 17:44:27 +0900 (Thu, 21 Dec 2017)

  New Revision: 78d590787f335d6b6db0150d188a84fff38173cd
  https://github.com/groonga/groonga/commit/78d590787f335d6b6db0150d188a84fff38173cd

  Merged 9cfbc20: Merge pull request #790 from naoa/index_column_source_records

  Message:
    functions/index_column: extract to get index_column code

  Modified files:
    plugins/functions/index_column.c

  Modified: plugins/functions/index_column.c (+65 -52)
===================================================================
--- plugins/functions/index_column.c    2017-12-20 11:08:07 +0900 (acb7355cf)
+++ plugins/functions/index_column.c    2017-12-21 17:44:27 +0900 (a7f969c3e)
@@ -105,26 +105,19 @@ exit :
   return rc;
 }
 
-static grn_obj *
-func_index_column_df_ratio(grn_ctx *ctx,
-                           int n_args,
-                           grn_obj **args,
-                           grn_user_data *user_data)
-{
+typedef struct {
+  grn_id term_id;
   grn_obj *term_table;
-  grn_obj *index_column_name;
   grn_obj *index_column;
-  grn_ii *ii;
-  grn_id term_id;
-
-  if (n_args != 1) {
-    GRN_PLUGIN_ERROR(ctx,
-                     GRN_INVALID_ARGUMENT,
-                     "index_column_df_ratio(): "
-                     "wrong number of arguments (%d for 1)", n_args - 1);
-    return NULL;
-  }
+} caller_index_info;
 
+grn_rc
+get_caller_index_info(grn_ctx *ctx,
+                      grn_obj *index_column_name,
+                      grn_user_data *user_data,
+                      caller_index_info *caller_index_info,
+                      const char *error_message_label)
+{
   {
     grn_obj *expr;
     grn_obj *variable;
@@ -133,82 +126,102 @@ func_index_column_df_ratio(grn_ctx *ctx,
     if (!expr) {
       GRN_PLUGIN_ERROR(ctx,
                        GRN_INVALID_ARGUMENT,
-                       "index_column_df_ratio(): "
-                       "called directly");
-      return NULL;
+                       "%s: "
+                       "called directly", error_message_label);
+      return ctx->rc;
     }
 
     variable = grn_expr_get_var_by_offset(ctx, expr, 0);
     if (!variable) {
       GRN_PLUGIN_ERROR(ctx,
                        GRN_INVALID_ARGUMENT,
-                       "index_column_df_ratio(): "
-                       "caller expression must have target record information");
-      return NULL;
+                       "%s: "
+                       "caller expression must have target record information",
+                       error_message_label);
+      return ctx->rc;
     }
 
-    term_table = grn_ctx_at(ctx, variable->header.domain);
-    term_id = GRN_RECORD_VALUE(variable);
+    caller_index_info->term_table = grn_ctx_at(ctx, variable->header.domain);
+    caller_index_info->term_id = GRN_RECORD_VALUE(variable);
     while (GRN_TRUE) {
       grn_obj *key_type;
 
-      key_type = grn_ctx_at(ctx, term_table->header.domain);
+      key_type = grn_ctx_at(ctx, caller_index_info->term_table->header.domain);
       if (!grn_obj_is_table(ctx, key_type)) {
         break;
       }
 
-      grn_table_get_key(ctx, term_table, term_id, &term_id, sizeof(grn_id));
-      term_table = key_type;
+      grn_table_get_key(ctx,
+                        caller_index_info->term_table,
+                        caller_index_info->term_id,
+                        &(caller_index_info->term_id),
+                        sizeof(grn_id));
+      caller_index_info->term_table = key_type;
     }
   }
 
-  index_column_name = args[0];
   if (!grn_obj_is_text_family_bulk(ctx, index_column_name)) {
     grn_obj inspected;
     GRN_TEXT_INIT(&inspected, 0);
     grn_inspect(ctx, &inspected, index_column_name);
     GRN_PLUGIN_ERROR(ctx,
                      GRN_INVALID_ARGUMENT,
-                     "index_column_df_ratio(): "
+                     "%s: "
                      "the first argument must be index column name: %.*s",
+                     error_message_label,
                      (int)GRN_TEXT_LEN(&inspected),
                      GRN_TEXT_VALUE(&inspected));
     GRN_OBJ_FIN(ctx, &inspected);
-    return NULL;
+    return ctx->rc;
   }
 
-  index_column = grn_obj_column(ctx,
-                                term_table,
-                                GRN_TEXT_VALUE(index_column_name),
-                                GRN_TEXT_LEN(index_column_name));
-  if (!index_column) {
+  caller_index_info->index_column = grn_obj_column(ctx,
+                                                   caller_index_info->term_table,
+                                                   GRN_TEXT_VALUE(index_column_name),
+                                                   GRN_TEXT_LEN(index_column_name));
+  if (!caller_index_info->index_column) {
     GRN_PLUGIN_ERROR(ctx,
                      GRN_INVALID_ARGUMENT,
-                     "index_column_df_ratio(): "
+                     "%s: "
                      "nonexistent object: <%.*s>",
+                     error_message_label,
                      (int)GRN_TEXT_LEN(index_column_name),
                      GRN_TEXT_VALUE(index_column_name));
-    return NULL;
+    return ctx->rc;
   }
 
-  if (!grn_obj_is_index_column(ctx, index_column)) {
-    grn_obj inspected;
-    GRN_TEXT_INIT(&inspected, 0);
-    grn_inspect(ctx, &inspected, index_column);
+  return GRN_SUCCESS;
+}
+
+
+static grn_obj *
+func_index_column_df_ratio(grn_ctx *ctx,
+                           int n_args,
+                           grn_obj **args,
+                           grn_user_data *user_data)
+{
+  grn_ii *ii;
+  caller_index_info caller_index_info;
+
+  if (n_args != 1) {
     GRN_PLUGIN_ERROR(ctx,
                      GRN_INVALID_ARGUMENT,
                      "index_column_df_ratio(): "
-                     "the first argument must be index column: %.*s",
-                     (int)GRN_TEXT_LEN(&inspected),
-                     GRN_TEXT_VALUE(&inspected));
-    GRN_OBJ_FIN(ctx, &inspected);
-    if (grn_obj_is_accessor(ctx, index_column)) {
-      grn_obj_unlink(ctx, index_column);
-    }
+                     "wrong number of arguments (%d for 1)", n_args - 1);
     return NULL;
   }
 
-  ii = (grn_ii *)index_column;
+  memset(&caller_index_info, 0, sizeof(caller_index_info));
+
+  if (get_caller_index_info(ctx,
+                            args[0],
+                            user_data,
+                            &caller_index_info,
+                            "index_column_df_ratio()") != GRN_SUCCESS) {
+    return NULL;
+  }
+
+  ii = (grn_ii *)caller_index_info.index_column;
 
   {
     grn_obj *source_table;
@@ -217,9 +230,9 @@ func_index_column_df_ratio(grn_ctx *ctx,
     double df_ratio;
     grn_obj *df_ratio_value;
 
-    source_table = grn_ctx_at(ctx, grn_obj_get_range(ctx, index_column));
+    source_table = grn_ctx_at(ctx, grn_obj_get_range(ctx, caller_index_info.index_column));
     n_documents = grn_table_size(ctx, source_table);
-    n_match_documents = grn_ii_estimate_size(ctx, ii, term_id);
+    n_match_documents = grn_ii_estimate_size(ctx, ii, caller_index_info.term_id);
     if (n_match_documents > n_documents) {
       n_match_documents = n_documents;
     }
-------------- next part --------------
HTML����������������������������...
URL: https://lists.osdn.me/mailman/archives/groonga-commit/attachments/20171221/404161e2/attachment-0001.htm 



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