susumu.yata
null+****@clear*****
Wed Nov 25 16:57:32 JST 2015
susumu.yata 2015-11-25 16:57:32 +0900 (Wed, 25 Nov 2015) New Revision: 0bc876710bd6ccdf80664fc3d75496d330676574 https://github.com/groonga/groonga/commit/0bc876710bd6ccdf80664fc3d75496d330676574 Message: grn_ts: implement grn_ts_sorter_parse() Modified files: lib/ts/ts_sorter.c Modified: lib/ts/ts_sorter.c (+52 -3) =================================================================== --- lib/ts/ts_sorter.c 2015-11-25 14:37:55 +0900 (bd3d14b) +++ lib/ts/ts_sorter.c 2015-11-25 16:57:32 +0900 (eab2ffc) @@ -20,6 +20,7 @@ #include <string.h> +#include "ts_expr_parser.h" #include "ts_log.h" #include "ts_util.h" @@ -144,8 +145,56 @@ grn_ts_sorter_parse(grn_ctx *ctx, grn_obj *table, grn_ts_str str, grn_ts_int offset, grn_ts_int limit, grn_ts_sorter **sorter) { - // TODO - return GRN_FUNCTION_NOT_IMPLEMENTED; + grn_rc rc; + grn_ts_sorter *new_sorter = NULL; + grn_ts_expr_parser *parser; + if (!ctx) { + return GRN_INVALID_ARGUMENT; + } + if (!table || !grn_ts_obj_is_table(ctx, table) || !str.size || !sorter) { + GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument"); + } + rc = grn_ts_expr_parser_open(ctx, table, &parser); + if (rc == GRN_SUCCESS) { + grn_ts_sorter_builder *builder; + rc = grn_ts_sorter_builder_open(ctx, table, &builder); + if (rc == GRN_SUCCESS) { + grn_ts_str first, rest = str; + for ( ; ; ) { + grn_ts_expr *expr; + grn_ts_bool reverse = GRN_FALSE; + rc = grn_ts_expr_parser_split(ctx, parser, rest, &first, &rest); + if (rc == GRN_END_OF_DATA) { + rc = grn_ts_sorter_builder_complete(ctx, builder, offset, limit, + &new_sorter); + break; + } else if (rc != GRN_SUCCESS) { + break; + } + if (first.ptr[0] == '-') { + reverse = GRN_TRUE; + first.ptr++; + first.size--; + } + rc = grn_ts_expr_parser_parse(ctx, parser, first, &expr); + if (rc != GRN_SUCCESS) { + break; + } + rc = grn_ts_sorter_builder_push(ctx, builder, expr, reverse); + if (rc != GRN_SUCCESS) { + grn_ts_expr_close(ctx, expr); + break; + } + } + grn_ts_sorter_builder_close(ctx, builder); + } + grn_ts_expr_parser_close(ctx, parser); + } + if (rc != GRN_SUCCESS) { + return rc; + } + *sorter = new_sorter; + return GRN_SUCCESS; } grn_rc @@ -281,7 +330,7 @@ grn_ts_sorter_builder_push(grn_ctx *ctx, grn_ts_sorter_builder *builder, if (!ctx) { return GRN_INVALID_ARGUMENT; } - if (!builder || !expr) { + if (!builder || !expr || expr->table != builder->table) { GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument"); } rc = grn_ts_sorter_node_open(ctx, expr, reverse, &new_node); -------------- next part -------------- HTML����������������������������...Download