[Groonga-commit] groonga/groonga at 1ca254f [master] select: support sort when create dynamic column

Back to archive index

Naoya Murakami null+****@clear*****
Tue May 10 18:50:30 JST 2016


Naoya Murakami	2016-05-10 18:50:30 +0900 (Tue, 10 May 2016)

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

  Merged e7b93e5: Merge pull request #545 from naoa/sort-dynamic-column

  Message:
    select: support sort when create dynamic column

  Modified files:
    lib/proc/proc_select.c

  Modified: lib/proc/proc_select.c (+72 -5)
===================================================================
--- lib/proc/proc_select.c    2016-05-10 18:01:42 +0900 (4560e92)
+++ lib/proc/proc_select.c    2016-05-10 18:50:30 +0900 (c739592)
@@ -62,6 +62,7 @@ typedef struct {
   grn_obj *type;
   grn_obj_flags flags;
   grn_select_string value;
+  grn_select_string sortby;
 } grn_column_data;
 
 typedef struct {
@@ -344,6 +345,7 @@ grn_select_apply_columns(grn_ctx *ctx,
     grn_obj *record;
     grn_table_cursor *table_cursor;
     grn_id id;
+    grn_obj *target_table = table;
 
     grn_hash_cursor_get_value(ctx, columns_cursor, (void **)&column_data);
 
@@ -367,11 +369,56 @@ grn_select_apply_columns(grn_ctx *ctx,
       break;
     }
 
-    GRN_EXPR_CREATE_FOR_QUERY(ctx, table, expression, record);
+    if (column_data->sortby.length > 0) {
+      grn_table_sort_key *sort_keys;
+      uint32_t n_sort_keys;
+      sort_keys = grn_table_sort_key_from_str(ctx,
+                                              column_data->sortby.value,
+                                              column_data->sortby.length,
+                                              table, &n_sort_keys);
+      if (!sort_keys) {
+        char error_message[GRN_CTX_MSGSIZE];
+        grn_memcpy(error_message, ctx->errbuf, GRN_CTX_MSGSIZE);
+        grn_obj_close(ctx, column);
+        GRN_PLUGIN_ERROR(ctx,
+                         GRN_INVALID_ARGUMENT,
+                         "[select][column][%s][%.*s] failed to parse sort key: %s",
+                         grn_column_stage_name(column_data->stage),
+                         (int)(column_data->label.length),
+                         column_data->label.value,
+                         error_message);
+        break;
+      }
+
+      target_table = grn_table_create(ctx, NULL, 0, NULL, GRN_OBJ_TABLE_NO_KEY,
+                                      NULL, table);
+      if (!target_table) {
+        char error_message[GRN_CTX_MSGSIZE];
+        grn_memcpy(error_message, ctx->errbuf, GRN_CTX_MSGSIZE);
+        grn_obj_close(ctx, column);
+        grn_table_sort_key_close(ctx, sort_keys, n_sort_keys);
+        GRN_PLUGIN_ERROR(ctx,
+                         GRN_INVALID_ARGUMENT,
+                         "[select][column][%s][%.*s] failed to create sorted table: %s",
+                         grn_column_stage_name(column_data->stage),
+                         (int)(column_data->label.length),
+                         column_data->label.value,
+                         error_message);
+        break;
+      }
+      grn_table_sort(ctx, table, 0, -1,
+                     target_table, sort_keys, n_sort_keys);
+      grn_table_sort_key_close(ctx, sort_keys, n_sort_keys);
+    }
+
+    GRN_EXPR_CREATE_FOR_QUERY(ctx, target_table, expression, record);
     if (!expression) {
       char error_message[GRN_CTX_MSGSIZE];
       grn_memcpy(error_message, ctx->errbuf, GRN_CTX_MSGSIZE);
       grn_obj_close(ctx, column);
+      if (column_data->sortby.length > 0) {
+        grn_obj_unlink(ctx, target_table);
+      }
       GRN_PLUGIN_ERROR(ctx,
                        GRN_INVALID_ARGUMENT,
                        "[select][column][%s][%.*s] "
@@ -395,6 +442,9 @@ grn_select_apply_columns(grn_ctx *ctx,
       grn_memcpy(error_message, ctx->errbuf, GRN_CTX_MSGSIZE);
       grn_obj_close(ctx, expression);
       grn_obj_close(ctx, column);
+      if (column_data->sortby.length > 0) {
+        grn_obj_unlink(ctx, target_table);
+      }
       GRN_PLUGIN_ERROR(ctx,
                        GRN_INVALID_ARGUMENT,
                        "[select][column][%s][%.*s] "
@@ -409,15 +459,18 @@ grn_select_apply_columns(grn_ctx *ctx,
     }
     grn_select_expression_set_condition(ctx, expression, condition);
 
-    table_cursor = grn_table_cursor_open(ctx, table,
+    table_cursor = grn_table_cursor_open(ctx, target_table,
                                          NULL, 0,
                                          NULL, 0,
-                                         0, -1, 0);
+                                         0, -1, GRN_CURSOR_BY_ID);
     if (!table_cursor) {
       char error_message[GRN_CTX_MSGSIZE];
       grn_memcpy(error_message, ctx->errbuf, GRN_CTX_MSGSIZE);
       grn_obj_close(ctx, expression);
       grn_obj_close(ctx, column);
+      if (column_data->sortby.length > 0) {
+        grn_obj_unlink(ctx, target_table);
+      }
       GRN_PLUGIN_ERROR(ctx,
                        GRN_INVALID_ARGUMENT,
                        "[select][column][%s][%.*s] "
@@ -434,11 +487,19 @@ grn_select_apply_columns(grn_ctx *ctx,
 
       GRN_RECORD_SET(ctx, record, id);
       value = grn_expr_exec(ctx, expression, 0);
+      if (column_data->sortby.length > 0) {
+        void *buf;
+        grn_table_cursor_get_value(ctx, table_cursor, &buf);
+        id = *((grn_id *)buf);
+      }
       if (value) {
         grn_obj_set_value(ctx, column, id, value, GRN_OBJ_SET);
       }
     }
 
+    if (column_data->sortby.length > 0) {
+      grn_obj_unlink(ctx, target_table);
+    }
     grn_obj_close(ctx, expression);
   }
 
@@ -1467,6 +1528,8 @@ grn_column_data_init(grn_ctx *ctx,
   column->flags = GRN_OBJ_COLUMN_SCALAR;
   column->value.value = NULL;
   column->value.length = 0;
+  column->sortby.value = NULL;
+  column->sortby.length = 0;
   return GRN_TRUE;
 }
 
@@ -1475,7 +1538,8 @@ grn_column_data_fill(grn_ctx *ctx,
                      grn_column_data *column,
                      grn_obj *type_raw,
                      grn_obj *flags,
-                     grn_obj *value)
+                     grn_obj *value,
+                     grn_obj *sortby)
 {
   if (type_raw && GRN_TEXT_LEN(type_raw) > 0) {
     grn_obj *type;
@@ -1532,6 +1596,7 @@ grn_column_data_fill(grn_ctx *ctx,
   }
 
   GRN_SELECT_FILL_STRING(column->value, value);
+  GRN_SELECT_FILL_STRING(column->sortby, sortby);
 
   return GRN_TRUE;
 }
@@ -1556,6 +1621,7 @@ grn_column_data_collect(grn_ctx *ctx,
     grn_obj *type;
     grn_obj *flags;
     grn_obj *value;
+    grn_obj *sortby;
 
     grn_hash_cursor_get_value(ctx, cursor, (void **)&column);
 
@@ -1573,11 +1639,12 @@ grn_column_data_collect(grn_ctx *ctx,
     GET_VAR(type);
     GET_VAR(flags);
     GET_VAR(value);
+    GET_VAR(sortby);
 
 #undef GET_VAR
 
     grn_column_data_fill(ctx, column,
-                         type, flags, value);
+                         type, flags, value, sortby);
   }
   grn_hash_cursor_close(ctx, cursor);
   return GRN_TRUE;
-------------- next part --------------
HTML����������������������������...
下载 



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