[Groonga-commit] groonga/groonga at 011e7e2 [master] Extract grn_column_data related functions

アーカイブの一覧に戻る

Naoya Murakami null+****@clear*****
Mon May 9 16:20:26 JST 2016


Naoya Murakami	2016-05-09 16:20:26 +0900 (Mon, 09 May 2016)

  New Revision: 011e7e2c886154194398932a32ba2b0a7d688d82
  https://github.com/groonga/groonga/commit/011e7e2c886154194398932a32ba2b0a7d688d82

  Merged f6efd39: Merge pull request #541 from naoa/extract-dynamic-column

  Message:
    Extract grn_column_data related functions

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+97 -70)
===================================================================
--- lib/proc/proc_select.c    2016-05-09 16:12:02 +0900 (91e9fbf)
+++ lib/proc/proc_select.c    2016-05-09 16:20:26 +0900 (cf98fb2)
@@ -64,6 +64,7 @@ typedef struct {
 } grn_drilldown_data;
 
 typedef enum {
+  GRN_COLUMN_STAGE_UNKNOWN,
   GRN_COLUMN_STAGE_FILTERED
 } grn_column_stage;
 
@@ -1397,6 +1398,52 @@ exit :
 }
 
 static grn_bool
+grn_column_data_init(grn_ctx *ctx, const char *label, size_t label_len,
+                     grn_obj *value, grn_hash **columns)
+{
+  grn_column_stage stage;
+
+  if (GRN_BULK_EQUAL_STRING(value, "filtered")) {
+    stage = GRN_COLUMN_STAGE_FILTERED;
+  } else {
+    stage = GRN_COLUMN_STAGE_UNKNOWN;
+  }
+
+  if (stage != GRN_COLUMN_STAGE_UNKNOWN) {
+    void *column_raw;
+    grn_column_data *column;
+
+    if (!*columns) {
+      *columns = grn_hash_create(ctx,
+                                 NULL,
+                                 GRN_TABLE_MAX_KEY_SIZE,
+                                 sizeof(grn_column_data),
+                                 GRN_OBJ_TABLE_HASH_KEY |
+                                 GRN_OBJ_KEY_VAR_SIZE |
+                                 GRN_HASH_TINY);
+    }
+    if (!*columns) {
+      return GRN_FALSE;
+    }
+    grn_hash_add(ctx,
+                 *columns,
+                 label,
+                 label_len,
+                 &column_raw,
+                 NULL);
+    column = column_raw;
+    column->label.value = label;
+    column->label.length = label_len;
+    column->stage = stage;
+    column->type = grn_ctx_at(ctx, GRN_DB_TEXT);
+    column->flags = GRN_OBJ_COLUMN_SCALAR;
+    column->value.value = NULL;
+    column->value.length = 0;
+  }
+  return GRN_TRUE;
+}
+
+static grn_bool
 grn_column_data_fill(grn_ctx *ctx,
                      grn_column_data *column,
                      grn_obj *type_raw,
@@ -1463,6 +1510,49 @@ grn_column_data_fill(grn_ctx *ctx,
 }
 
 static grn_bool
+grn_column_data_collect(grn_ctx *ctx,
+                        grn_user_data *user_data,
+                        grn_hash *columns)
+{
+  grn_hash_cursor *cursor = NULL;
+  cursor = grn_hash_cursor_open(ctx, columns,
+                                NULL, 0, NULL, 0, 0, -1, 0);
+  if (!cursor) {
+    return GRN_FALSE;
+  }
+
+  while (grn_hash_cursor_next(ctx, cursor)) {
+    grn_column_data *column;
+    char key_name[GRN_TABLE_MAX_KEY_SIZE];
+    grn_obj *type;
+    grn_obj *flags;
+    grn_obj *value;
+
+    grn_hash_cursor_get_value(ctx, cursor, (void **)&column);
+
+#define GET_VAR(name)                                                   \
+    grn_snprintf(key_name,                                              \
+                 GRN_TABLE_MAX_KEY_SIZE,                                \
+                 GRN_TABLE_MAX_KEY_SIZE,                                \
+                 "column[%.*s]." # name,                                \
+                 (int)(column->label.length),                           \
+                 column->label.value);                                  \
+    name = grn_plugin_proc_get_var(ctx, user_data, key_name, -1);
+
+    GET_VAR(type);
+    GET_VAR(flags);
+    GET_VAR(value);
+
+#undef GET_VAR
+
+    grn_column_data_fill(ctx, column,
+                         type, flags, value);
+  }
+  grn_hash_cursor_close(ctx, cursor);
+  return GRN_TRUE;
+}
+
+static grn_bool
 grn_select_data_fill_columns_collect(grn_ctx *ctx,
                                      grn_user_data *user_data,
                                      grn_select_data *data)
@@ -1505,42 +1595,12 @@ grn_select_data_fill_columns_collect(grn_ctx *ctx,
 
     grn_table_cursor_get_value(ctx, cursor, &value_raw);
     value = value_raw;
-    if (GRN_BULK_EQUAL_STRING(value, "filtered")) {
-      const char *label;
-      size_t label_len;
-      void *column_raw;
-      grn_column_data *column;
-
-      if (!data->columns.filtered) {
-        data->columns.filtered = grn_hash_create(ctx,
-                                                 NULL,
-                                                 GRN_TABLE_MAX_KEY_SIZE,
-                                                 sizeof(grn_column_data),
-                                                 GRN_OBJ_TABLE_HASH_KEY |
-                                                 GRN_OBJ_KEY_VAR_SIZE |
-                                                 GRN_HASH_TINY);
-      }
-      if (!data->columns.filtered) {
-        grn_table_cursor_close(ctx, cursor);
-        return GRN_FALSE;
-      }
-
-      label = name + prefix_len;
-      label_len = name_len - prefix_len - suffix_len;
-      grn_hash_add(ctx,
-                   data->columns.filtered,
-                   label,
-                   label_len,
-                   &column_raw,
-                   NULL);
-      column = column_raw;
-      column->label.value = label;
-      column->label.length = label_len;
-      column->stage = GRN_COLUMN_STAGE_FILTERED;
-      column->type = grn_ctx_at(ctx, GRN_DB_TEXT);
-      column->flags = GRN_OBJ_COLUMN_SCALAR;
-      column->value.value = NULL;
-      column->value.length = 0;
+    if (!grn_column_data_init(ctx,
+                              name + prefix_len,
+                              name_len - prefix_len - suffix_len,
+                              value, &(data->columns.filtered))) {
+      grn_table_cursor_close(ctx, cursor);
+      return GRN_FALSE;
     }
   }
   grn_table_cursor_close(ctx, cursor);
@@ -1553,8 +1613,6 @@ grn_select_data_fill_columns(grn_ctx *ctx,
                              grn_user_data *user_data,
                              grn_select_data *data)
 {
-  grn_hash_cursor *cursor = NULL;
-
   if (!grn_select_data_fill_columns_collect(ctx, user_data, data)) {
     return GRN_FALSE;
   }
@@ -1563,41 +1621,10 @@ grn_select_data_fill_columns(grn_ctx *ctx,
     return GRN_TRUE;
   }
 
-  cursor = grn_hash_cursor_open(ctx, data->columns.filtered,
-                                NULL, 0, NULL, 0, 0, -1, 0);
-  if (!cursor) {
+  if (!grn_column_data_collect(ctx, user_data, data->columns.filtered)) {
     return GRN_FALSE;
   }
 
-  while (grn_hash_cursor_next(ctx, cursor)) {
-    grn_column_data *column;
-    char key_name[GRN_TABLE_MAX_KEY_SIZE];
-    grn_obj *type;
-    grn_obj *flags;
-    grn_obj *value;
-
-    grn_hash_cursor_get_value(ctx, cursor, (void **)&column);
-
-#define GET_VAR(name)                                                   \
-    grn_snprintf(key_name,                                              \
-                 GRN_TABLE_MAX_KEY_SIZE,                                \
-                 GRN_TABLE_MAX_KEY_SIZE,                                \
-                 "column[%.*s]." # name,                                \
-                 (int)(column->label.length),                           \
-                 column->label.value);                                  \
-    name = grn_plugin_proc_get_var(ctx, user_data, key_name, -1);
-
-    GET_VAR(type);
-    GET_VAR(flags);
-    GET_VAR(value);
-
-#undef GET_VAR
-
-    grn_column_data_fill(ctx, column,
-                         type, flags, value);
-  }
-  grn_hash_cursor_close(ctx, cursor);
-
   return GRN_TRUE;
 }
 
-------------- next part --------------
HTML����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る