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����������������������������...下载