Kouhei Sutou
null+****@clear*****
Thu May 12 18:29:35 JST 2016
Kouhei Sutou 2016-05-12 18:29:35 +0900 (Thu, 12 May 2016) New Revision: 013c8acd237366ad28029f8df05aaab6b6e558ae https://github.com/groonga/groonga/commit/013c8acd237366ad28029f8df05aaab6b6e558ae Message: select: support filter in labeled drilldown Added files: test/command/suite/select/drilldown/labeled/filter/key.expected test/command/suite/select/drilldown/labeled/filter/key.test Modified files: lib/proc/proc_select.c Modified: lib/proc/proc_select.c (+92 -58) =================================================================== --- lib/proc/proc_select.c 2016-05-12 18:13:22 +0900 (162a56d) +++ lib/proc/proc_select.c 2016-05-12 18:29:35 +0900 (4653bb6) @@ -83,6 +83,7 @@ typedef struct { grn_select_string table_name; grn_columns columns; grn_table_group_result result; + grn_obj *filtered_result; } grn_drilldown_data; typedef struct { @@ -489,6 +490,7 @@ grn_drilldown_data_init(grn_ctx *ctx, drilldown->label.length = label_len; grn_columns_init(ctx, &(drilldown->columns)); drilldown->result.table = NULL; + drilldown->filtered_result = NULL; } static void @@ -498,6 +500,10 @@ grn_drilldown_data_fin(grn_ctx *ctx, grn_drilldown_data *drilldown) grn_columns_fin(ctx, &(drilldown->columns)); + if (drilldown->filtered_result) { + grn_obj_close(ctx, drilldown->filtered_result); + } + result = &(drilldown->result); if (result->table) { if (result->calc_target) { @@ -1020,6 +1026,72 @@ grn_select_drilldown_execute(grn_ctx *ctx, condition); } + if (drilldown->filter.length > 0) { + grn_obj *expression; + grn_obj *record; + GRN_EXPR_CREATE_FOR_QUERY(ctx, result->table, expression, record); + if (!expression) { + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[select][drilldown]%s%.*s%s[filter] " + "failed to create expression for filter: %s", + drilldown->label.length > 0 ? "[" : "", + (int)(drilldown->label.length), + drilldown->label.value, + drilldown->label.length > 0 ? "]" : "", + ctx->errbuf); + return GRN_FALSE; + } + grn_expr_parse(ctx, + expression, + drilldown->filter.value, + drilldown->filter.length, + NULL, + GRN_OP_MATCH, + GRN_OP_AND, + GRN_EXPR_SYNTAX_SCRIPT); + if (ctx->rc != GRN_SUCCESS) { + grn_obj_close(ctx, expression); + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[select][drilldown]%s%.*s%s[filter] " + "failed to parse filter: <%.*s>: %s", + drilldown->label.length > 0 ? "[" : "", + (int)(drilldown->label.length), + drilldown->label.value, + drilldown->label.length > 0 ? "]" : "", + (int)(drilldown->filter.length), + drilldown->filter.value, + ctx->errbuf); + return GRN_FALSE; + } + drilldown->filtered_result = grn_table_select(ctx, + result->table, + expression, + NULL, + GRN_OP_OR); + if (ctx->rc != GRN_SUCCESS) { + grn_obj_close(ctx, expression); + if (drilldown->filtered_result) { + grn_obj_close(ctx, drilldown->filtered_result); + drilldown->filtered_result = NULL; + } + GRN_PLUGIN_ERROR(ctx, + GRN_INVALID_ARGUMENT, + "[select][drilldown]%s%.*s%s[filter] " + "failed to execute filter: <%.*s>: %s", + drilldown->label.length > 0 ? "[" : "", + (int)(drilldown->label.length), + drilldown->label.value, + drilldown->label.length > 0 ? "]" : "", + (int)(drilldown->filter.length), + drilldown->filter.value, + ctx->errbuf); + return GRN_FALSE; + } + grn_obj_close(ctx, expression); + } + return GRN_TRUE; } @@ -1060,56 +1132,8 @@ grn_select_drilldown(grn_ctx *ctx, break; } - if (drilldown->filter.length > 0) { - grn_obj *expression; - grn_obj *record; - GRN_EXPR_CREATE_FOR_QUERY(ctx, result->table, expression, record); - if (!expression) { - GRN_PLUGIN_ERROR(ctx, - GRN_INVALID_ARGUMENT, - "[select][drilldown][filter] " - "failed to create expression for filter: %s", - ctx->errbuf); - break; - } - grn_expr_parse(ctx, - expression, - drilldown->filter.value, - drilldown->filter.length, - NULL, - GRN_OP_MATCH, - GRN_OP_AND, - GRN_EXPR_SYNTAX_SCRIPT); - if (ctx->rc != GRN_SUCCESS) { - grn_obj_close(ctx, expression); - GRN_PLUGIN_ERROR(ctx, - GRN_INVALID_ARGUMENT, - "[select][drilldown][filter] " - "failed to parse filter: <%.*s>: %s", - (int)(drilldown->filter.length), - drilldown->filter.value, - ctx->errbuf); - break; - } - target_table = grn_table_select(ctx, - result->table, - expression, - NULL, - GRN_OP_OR); - if (ctx->rc != GRN_SUCCESS) { - grn_obj_close(ctx, expression); - if (target_table) { - grn_obj_close(ctx, target_table); - } - GRN_PLUGIN_ERROR(ctx, - GRN_INVALID_ARGUMENT, - "[select][drilldown][filter] " - "failed to execute filter: <%.*s>: %s", - (int)(drilldown->filter.length), - drilldown->filter.value, - ctx->errbuf); - break; - } + if (drilldown->filtered_result) { + target_table = drilldown->filtered_result; } else { target_table = result->table; } @@ -1162,8 +1186,9 @@ grn_select_drilldown(grn_ctx *ctx, GRN_OUTPUT_OBJ(target_table, &format); GRN_OBJ_FORMAT_FIN(ctx, &format); } - if (target_table != result->table) { - grn_obj_close(ctx, target_table); + if (drilldown->filtered_result) { + grn_obj_close(ctx, drilldown->filtered_result); + drilldown->filtered_result = NULL; } if (result->calc_target) { grn_obj_unlink(ctx, result->calc_target); @@ -1349,6 +1374,7 @@ grn_select_drilldowns_output(grn_ctx *ctx, GRN_HASH_EACH_BEGIN(ctx, drilldowns, cursor, id) { grn_drilldown_data *drilldown; grn_table_group_result *result; + grn_obj *target_table; uint32_t n_hits; int offset; int limit; @@ -1360,9 +1386,15 @@ grn_select_drilldowns_output(grn_ctx *ctx, continue; } + if (drilldown->filtered_result) { + target_table = drilldown->filtered_result; + } else { + target_table = result->table; + } + GRN_OUTPUT_STR(drilldown->label.value, drilldown->label.length); - n_hits = grn_table_size(ctx, result->table); + n_hits = grn_table_size(ctx, target_table); offset = drilldown->offset; limit = drilldown->limit; @@ -1374,13 +1406,13 @@ grn_select_drilldowns_output(grn_ctx *ctx, sort_keys = grn_table_sort_key_from_str(ctx, drilldown->sortby.value, drilldown->sortby.length, - result->table, &n_sort_keys); + target_table, &n_sort_keys); if (sort_keys) { grn_obj *sorted; sorted = grn_table_create(ctx, NULL, 0, NULL, GRN_OBJ_TABLE_NO_KEY, - NULL, result->table); + NULL, target_table); if (sorted) { - grn_table_sort(ctx, result->table, offset, limit, + grn_table_sort(ctx, target_table, offset, limit, sorted, sort_keys, n_sort_keys); grn_proc_select_output_columns(ctx, sorted, n_hits, 0, limit, drilldown->output_columns.value, @@ -1391,7 +1423,7 @@ grn_select_drilldowns_output(grn_ctx *ctx, grn_table_sort_key_close(ctx, sort_keys, n_sort_keys); } } else { - grn_proc_select_output_columns(ctx, result->table, n_hits, offset, limit, + grn_proc_select_output_columns(ctx, target_table, n_hits, offset, limit, drilldown->output_columns.value, drilldown->output_columns.length, condition); @@ -2024,6 +2056,7 @@ grn_select_data_fill_drilldowns(grn_ctx *ctx, grn_obj *limit; grn_obj *calc_types; grn_obj *calc_target; + grn_obj *filter; grn_obj *table; grn_hash_cursor_get_value(ctx, cursor, (void **)&drilldown); @@ -2056,6 +2089,7 @@ grn_select_data_fill_drilldowns(grn_ctx *ctx, GET_VAR(limit); GET_VAR(calc_types); GET_VAR(calc_target); + GET_VAR(filter); GET_VAR(table); #undef GET_VAR @@ -2069,7 +2103,7 @@ grn_select_data_fill_drilldowns(grn_ctx *ctx, limit, calc_types, calc_target, - NULL, + filter, table); i++; } GRN_HASH_EACH_END(ctx, cursor); Added: test/command/suite/select/drilldown/labeled/filter/key.expected (+88 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/filter/key.expected 2016-05-12 18:29:35 +0900 (32c6c0e) @@ -0,0 +1,88 @@ +table_create Tags TABLE_PAT_KEY ShortText +[[0,0.0,0.0],true] +table_create Memos TABLE_HASH_KEY ShortText +[[0,0.0,0.0],true] +column_create Memos tag COLUMN_SCALAR Tags +[[0,0.0,0.0],true] +load --table Memos +[ +{"_key": "Groonga is fast!", "tag": "Groonga"}, +{"_key": "Mroonga is fast!", "tag": "Mroonga"}, +{"_key": "Groonga sticker!", "tag": "Groonga"}, +{"_key": "Rroonga is fast!", "tag": "Rroonga"} +] +[[0,0.0,0.0],4] +select Memos --drilldown[tag].keys tag --drilldown[tag].filter '_key != "Groonga"' +[ + [ + 0, + 0.0, + 0.0 + ], + [ + [ + [ + 4 + ], + [ + [ + "_id", + "UInt32" + ], + [ + "_key", + "ShortText" + ], + [ + "tag", + "Tags" + ] + ], + [ + 1, + "Groonga is fast!", + "Groonga" + ], + [ + 2, + "Mroonga is fast!", + "Mroonga" + ], + [ + 3, + "Groonga sticker!", + "Groonga" + ], + [ + 4, + "Rroonga is fast!", + "Rroonga" + ] + ], + { + "tag": [ + [ + 2 + ], + [ + [ + "_key", + "ShortText" + ], + [ + "_nsubrecs", + "Int32" + ] + ], + [ + "Mroonga", + 1 + ], + [ + "Rroonga", + 1 + ] + ] + } + ] +] Added: test/command/suite/select/drilldown/labeled/filter/key.test (+16 -0) 100644 =================================================================== --- /dev/null +++ test/command/suite/select/drilldown/labeled/filter/key.test 2016-05-12 18:29:35 +0900 (bf6d962) @@ -0,0 +1,16 @@ +table_create Tags TABLE_PAT_KEY ShortText + +table_create Memos TABLE_HASH_KEY ShortText +column_create Memos tag COLUMN_SCALAR Tags + +load --table Memos +[ +{"_key": "Groonga is fast!", "tag": "Groonga"}, +{"_key": "Mroonga is fast!", "tag": "Mroonga"}, +{"_key": "Groonga sticker!", "tag": "Groonga"}, +{"_key": "Rroonga is fast!", "tag": "Rroonga"} +] + +select Memos \ + --drilldown[tag].keys tag \ + --drilldown[tag].filter '_key != "Groonga"' -------------- next part -------------- HTML����������������������������...ダウンロード