Kouhei Sutou
null+****@clear*****
Mon Nov 3 15:26:00 JST 2014
Kouhei Sutou 2014-11-03 15:26:00 +0900 (Mon, 03 Nov 2014) New Revision: c024b911ac6af2207c3f201f4b3b6b3a6eb7b304 https://github.com/groonga/groonga/commit/c024b911ac6af2207c3f201f4b3b6b3a6eb7b304 Message: Add grn_expr_dump_plan() for test Modified files: include/groonga/expr.h lib/expr.c Modified: include/groonga/expr.h (+1 -0) =================================================================== --- include/groonga/expr.h 2014-11-03 15:12:17 +0900 (7855c44) +++ include/groonga/expr.h 2014-11-03 15:26:00 +0900 (cf8fb35) @@ -55,6 +55,7 @@ GRN_API grn_rc grn_expr_syntax_escape_query(grn_ctx *ctx, grn_obj *escaped_query); GRN_API grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr); +GRN_API grn_rc grn_expr_dump_plan(grn_ctx *ctx, grn_obj *expr, grn_obj *buffer); GRN_API grn_obj *grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs); GRN_API grn_obj *grn_expr_alloc(grn_ctx *ctx, grn_obj *expr, Modified: lib/expr.c (+45 -11) =================================================================== --- lib/expr.c 2014-11-03 15:12:17 +0900 (742ea9e) +++ lib/expr.c 2014-11-03 15:26:00 +0900 (7665e28) @@ -4697,27 +4697,40 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n, } void -grn_p_scan_info_list(grn_ctx *ctx, scan_info **sis, int n) +grn_inspect_scan_info_list(grn_ctx *ctx, grn_obj *buffer, scan_info **sis, int n) { int i; - grn_obj inspected; - GRN_TEXT_INIT(&inspected, 0); for (i = 0; i < n; i++) { scan_info *si = sis[i]; - printf("[%d]\n", i); - printf(" op: <%s>\n", grn_operator_to_string(si->op)); - printf(" logical_op: <%s>\n", grn_operator_to_string(si->logical_op)); + grn_text_printf(ctx, buffer, "[%d]\n", i); + grn_text_printf(ctx, buffer, + " op: <%s>\n", + grn_operator_to_string(si->op)); + grn_text_printf(ctx, buffer, + " logical_op: <%s>\n", + grn_operator_to_string(si->logical_op)); - GRN_BULK_REWIND(&inspected); grn_inspect(ctx, &inspected, si->query); - printf(" query: <%.*s>\n", - (int)GRN_TEXT_LEN(&inspected), - GRN_TEXT_VALUE(&inspected)); + GRN_TEXT_PUTS(ctx, buffer, " query: <"); + grn_inspect(ctx, buffer, si->query); + GRN_TEXT_PUTS(ctx, buffer, ">\n"); - printf(" expr: <%d..%d>\n", si->start, si->end); + grn_text_printf(ctx, buffer, + " expr: <%d..%d>\n", si->start, si->end); } +} + +void +grn_p_scan_info_list(grn_ctx *ctx, scan_info **sis, int n) +{ + grn_obj inspected; + GRN_TEXT_INIT(&inspected, 0); + grn_inspect_scan_info_lsit(ctx, &inspected, sis, n); + printf("%.*s\n", + (int)GRN_TEXT_LEN(&inspected), + GRN_TEXT_VALUE(&inspected)); GRN_OBJ_FIN(ctx, &inspected); } @@ -7183,3 +7196,24 @@ grn_expr_syntax_escape_query(grn_ctx *ctx, const char *query, int query_size, target_characters, GRN_QUERY_ESCAPE, escaped_query); } + +grn_rc +grn_expr_dump_plan(grn_ctx *ctx, grn_obj *expr, grn_obj *buffer) +{ + int n; + scan_info **sis; + + GRN_API_ENTER; + sis = scan_info_build(ctx, expr, &n, GRN_OP_OR, 0); + if (sis) { + int i; + grn_inspect_scan_info_list(ctx, buffer, sis, n); + for (i = 0; i < n; i++) { + SI_FREE(sis[i]); + } + GRN_FREE(sis); + } else { + GRN_TEXT_PUTS(ctx, buffer, "sequential search\n"); + } + GRN_API_RETURN(GRN_SUCCESS); +} -------------- next part -------------- HTML����������������������������... ダウンロード