susumu.yata
null+****@clear*****
Thu Oct 22 14:39:25 JST 2015
susumu.yata 2015-10-22 14:39:25 +0900 (Thu, 22 Oct 2015) New Revision: de3bbc679e3e8d442ed752a68259d4ddb8e62e65 https://github.com/groonga/groonga/commit/de3bbc679e3e8d442ed752a68259d4ddb8e62e65 Message: grn_ts: implicitly insert bridges for resolving a name GitHub: #408 Modified files: lib/ts.c Modified: lib/ts.c (+39 -12) =================================================================== --- lib/ts.c 2015-10-22 10:32:55 +0900 (7cf6edc) +++ lib/ts.c 2015-10-22 14:39:25 +0900 (72d3175) @@ -6616,7 +6616,6 @@ grn_ts_expr_push(grn_ctx *ctx, grn_ts_expr *expr, grn_rc grn_ts_expr_push_name(grn_ctx *ctx, grn_ts_expr *expr, const char *name_ptr, size_t name_size) { - grn_rc rc; grn_obj *column; grn_ts_str name = { name_ptr, name_size }; if (!ctx) { @@ -6638,14 +6637,13 @@ grn_ts_expr_push_name(grn_ctx *ctx, grn_ts_expr *expr, if (grn_ts_str_is_value_name(name)) { return grn_ts_expr_push_value(ctx, expr); } - /* TODO: Resolve references. */ + /* grn_obj_column() returns a column or accessor. */ column = grn_obj_column(ctx, expr->curr_table, name.ptr, name.size); if (!column) { - GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "not column"); + GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "object not found: \"%.*s\"", + (int)name.size, name.ptr); } - rc = grn_ts_expr_push_column(ctx, expr, column); - grn_obj_unlink(ctx, column); - return rc; + return grn_ts_expr_push_obj(ctx, expr, column); } #define GRN_TS_EXPR_PUSH_BULK_CASE(TYPE, kind)\ @@ -6780,12 +6778,8 @@ grn_ts_expr_push_vector(grn_ctx *ctx, grn_ts_expr *expr, grn_obj *obj) { } static grn_rc -grn_ts_expr_push_accessor(grn_ctx *ctx, grn_ts_expr *expr, - grn_accessor *accessor) { - if (accessor->next) { - GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, - "complex accessor is not supported"); - } +grn_ts_expr_push_single_accessor(grn_ctx *ctx, grn_ts_expr *expr, + grn_accessor *accessor) { switch (accessor->action) { case GRN_ACCESSOR_GET_ID: { return grn_ts_expr_push_id(ctx, expr); @@ -6794,11 +6788,20 @@ grn_ts_expr_push_accessor(grn_ctx *ctx, grn_ts_expr *expr, return grn_ts_expr_push_score(ctx, expr); } case GRN_ACCESSOR_GET_KEY: { + if (accessor->obj != expr->curr_table) { + GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "table conflict"); + } return grn_ts_expr_push_key(ctx, expr); } case GRN_ACCESSOR_GET_VALUE: { + if (accessor->obj != expr->curr_table) { + GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "table conflict"); + } return grn_ts_expr_push_value(ctx, expr); } + case GRN_ACCESSOR_GET_COLUMN_VALUE: { + return grn_ts_expr_push_column(ctx, expr, accessor->obj); + } default: { GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid accessor action: %d", accessor->action); @@ -6806,6 +6809,30 @@ grn_ts_expr_push_accessor(grn_ctx *ctx, grn_ts_expr *expr, } } +static grn_rc +grn_ts_expr_push_accessor(grn_ctx *ctx, grn_ts_expr *expr, + grn_accessor *accessor) { + grn_rc rc = grn_ts_expr_push_single_accessor(ctx, expr, accessor); + if (rc != GRN_SUCCESS) { + return rc; + } + for (accessor = accessor->next; accessor; accessor = accessor->next) { + rc = grn_ts_expr_begin_subexpr(ctx, expr); + if (rc != GRN_SUCCESS) { + return rc; + } + rc = grn_ts_expr_push_single_accessor(ctx, expr, accessor); + if (rc != GRN_SUCCESS) { + return rc; + } + rc = grn_ts_expr_end_subexpr(ctx, expr); + if (rc != GRN_SUCCESS) { + return rc; + } + } + return GRN_SUCCESS; +} + grn_rc grn_ts_expr_push_obj(grn_ctx *ctx, grn_ts_expr *expr, grn_obj *obj) { if (!ctx) { -------------- next part -------------- HTML����������������������������...Download