[Groonga-commit] groonga/groonga at 14b1bdb [master] select: extract slices code

アーカイブの一覧に戻る

Kouhei Sutou null+****@clear*****
Sun May 22 17:39:14 JST 2016


Kouhei Sutou	2016-05-22 17:39:14 +0900 (Sun, 22 May 2016)

  New Revision: 14b1bdbfe226983a426059e0400a919b7d75451d
  https://github.com/groonga/groonga/commit/14b1bdbfe226983a426059e0400a919b7d75451d

  Message:
    select: extract slices code

  Modified files:
    lib/grn_proc.h
    lib/proc/proc_select.c

  Modified: lib/grn_proc.h (+5 -5)
===================================================================
--- lib/grn_proc.h    2016-05-22 17:20:46 +0900 (0d62882)
+++ lib/grn_proc.h    2016-05-22 17:39:14 +0900 (0f2fcbe)
@@ -88,11 +88,11 @@ grn_obj_flags grn_proc_column_parse_flags(grn_ctx *ctx,
                                           const char *text,
                                           const char *end);
 
-void grn_proc_select_output_columns(grn_ctx *ctx,
-                                    grn_obj *res,
-                                    int n_hits, int offset, int limit,
-                                    const char *columns, int columns_len,
-                                    grn_obj *condition);
+grn_bool grn_proc_select_output_columns(grn_ctx *ctx,
+                                        grn_obj *res,
+                                        int n_hits, int offset, int limit,
+                                        const char *columns, int columns_len,
+                                        grn_obj *condition);
 
 grn_rc grn_proc_syntax_expand_query(grn_ctx *ctx,
                                     const char *query,

  Modified: lib/proc/proc_select.c (+60 -22)
===================================================================
--- lib/proc/proc_select.c    2016-05-22 17:20:46 +0900 (37c5f98)
+++ lib/proc/proc_select.c    2016-05-22 17:39:14 +0900 (cc242f0)
@@ -754,7 +754,7 @@ grn_select_expression_set_condition(grn_ctx *ctx,
   GRN_PTR_SET(ctx, condition_ptr, condition);
 }
 
-void
+grn_bool
 grn_proc_select_output_columns(grn_ctx *ctx, grn_obj *res,
                                int n_hits, int offset, int limit,
                                const char *columns, int columns_len,
@@ -770,12 +770,14 @@ grn_proc_select_output_columns(grn_ctx *ctx, grn_obj *res,
   rc = grn_output_format_set_columns(ctx, &format, res, columns, columns_len);
   if (rc != GRN_SUCCESS) {
     GRN_OBJ_FORMAT_FIN(ctx, &format);
-    return;
+    return GRN_FALSE;
   }
 
   grn_select_expression_set_condition(ctx, format.expression, condition);
   GRN_OUTPUT_OBJ(res, &format);
   GRN_OBJ_FORMAT_FIN(ctx, &format);
+
+  return ctx->rc == GRN_SUCCESS;
 }
 
 static grn_obj *
@@ -1541,26 +1543,34 @@ grn_select_slice_execute(grn_ctx *ctx,
   return GRN_TRUE;
 }
 
-static void
+static grn_bool
 grn_select_slices_execute(grn_ctx *ctx,
                           grn_select_data *data,
                           grn_obj *table,
                           grn_hash *slices)
 {
+  grn_bool succeeded = GRN_TRUE;
+
   GRN_HASH_EACH_BEGIN(ctx, slices, cursor, id) {
     grn_slice_data *slice;
 
     grn_hash_cursor_get_value(ctx, cursor, (void **)&slice);
-    grn_select_slice_execute(ctx, data, table, slice);
+    if (!grn_select_slice_execute(ctx, data, table, slice)) {
+      succeeded = GRN_FALSE;
+      break;
+    }
   } GRN_HASH_EACH_END(ctx, cursor);
+
+  return succeeded;
 }
 
-static void
+static grn_bool
 grn_select_slices_output(grn_ctx *ctx,
                          grn_select_data *data,
                          grn_obj *table,
                          grn_hash *slices)
 {
+  grn_bool succeeded = GRN_TRUE;
   unsigned int n_available_results = 0;
 
   GRN_HASH_EACH_BEGIN(ctx, slices, cursor, id) {
@@ -1606,19 +1616,35 @@ grn_select_slices_output(grn_ctx *ctx,
         if (sorted) {
           grn_table_sort(ctx, slice->table, offset, limit,
                          sorted, sort_keys, n_sort_keys);
-          grn_proc_select_output_columns(ctx, sorted, n_hits, 0, limit,
-                                         slice->output_columns.value,
-                                         slice->output_columns.length,
-                                         data->condition.expression);
+          if (!grn_proc_select_output_columns(ctx,
+                                              sorted,
+                                              n_hits,
+                                              0,
+                                              limit,
+                                              slice->output_columns.value,
+                                              slice->output_columns.length,
+                                              data->condition.expression)) {
+            succeeded = GRN_FALSE;
+          }
           grn_obj_unlink(ctx, sorted);
         }
         grn_table_sort_key_close(ctx, sort_keys, n_sort_keys);
       }
     } else {
-      grn_proc_select_output_columns(ctx, slice->table, n_hits, offset, limit,
-                                     slice->output_columns.value,
-                                     slice->output_columns.length,
-                                     data->condition.expression);
+      if (!grn_proc_select_output_columns(ctx,
+                                          slice->table,
+                                          n_hits,
+                                          offset,
+                                          limit,
+                                          slice->output_columns.value,
+                                          slice->output_columns.length,
+                                          data->condition.expression)) {
+        succeeded = GRN_FALSE;
+      }
+    }
+
+    if (!succeeded) {
+      break;
     }
 
     GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_SIZE,
@@ -1628,16 +1654,26 @@ grn_select_slices_output(grn_ctx *ctx,
                   slice->label.value);
   } GRN_HASH_EACH_END(ctx, cursor);
   GRN_OUTPUT_MAP_CLOSE();
+
+  return succeeded;
 }
 
-static void
+static grn_bool
 grn_select_slices(grn_ctx *ctx,
-                  grn_select_data *data,
-                  grn_obj *table,
-                  grn_hash *slices)
+                  grn_select_data *data)
 {
-  grn_select_slices_execute(ctx, data, table, slices);
-  grn_select_slices_output(ctx, data, table, slices);
+  if (!data->slices) {
+    return GRN_TRUE;
+  }
+
+  if (!grn_select_slices_execute(ctx, data, data->tables.result, data->slices)) {
+    return GRN_FALSE;
+  }
+  if (!grn_select_slices_output(ctx, data, data->tables.result, data->slices)) {
+    return GRN_FALSE;
+  }
+
+  return GRN_TRUE;
 }
 
 static grn_bool
@@ -2476,9 +2512,11 @@ grn_select(grn_ctx *ctx, grn_select_data *data)
         goto exit;
       }
 
-        if (data->slices) {
-          grn_select_slices(ctx, data, data->tables.result, data->slices);
-        }
+      if (!grn_select_slices(ctx, data)) {
+        GRN_OUTPUT_ARRAY_CLOSE();
+        goto exit;
+      }
+
         if (data->drilldown.keys) {
           grn_select_drilldown(ctx,
                                data,
-------------- next part --------------
HTML����������������������������...
ダウンロード 



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