susumu.yata
null+****@clear*****
Tue Nov 17 12:35:51 JST 2015
susumu.yata 2015-11-17 12:35:51 +0900 (Tue, 17 Nov 2015) New Revision: 560dd0e09c1cd84df92159ee1b0633ce8d255999 https://github.com/groonga/groonga/commit/560dd0e09c1cd84df92159ee1b0633ce8d255999 Message: grn_ts: rename grn_ts_expr_builder_deref() to grn_ts_expr_node_deref() Modified files: lib/ts/ts_expr_builder.c lib/ts/ts_expr_node.c lib/ts/ts_expr_node.h Modified: lib/ts/ts_expr_builder.c (+2 -35) =================================================================== --- lib/ts/ts_expr_builder.c 2015-11-17 13:04:19 +0900 (7fc6056) +++ lib/ts/ts_expr_builder.c 2015-11-17 12:35:51 +0900 (99b8ffd) @@ -133,39 +133,6 @@ grn_ts_expr_builder_close(grn_ctx *ctx, grn_ts_expr_builder *builder) return GRN_SUCCESS; } -/* grn_ts_expr_deref() dereferences a node. */ -static grn_rc -grn_ts_expr_builder_deref(grn_ctx *ctx, grn_ts_expr_builder *builder, - grn_ts_expr_node **node_ptr) -{ - grn_ts_expr_node *node = *node_ptr; - while (node->data_kind == GRN_TS_REF) { - grn_rc rc; - grn_ts_expr_node *key_node, *bridge_node; - grn_id table_id = node->data_type; - grn_obj *table = grn_ctx_at(ctx, table_id); - if (!table) { - return GRN_OBJECT_CORRUPT; - } - if (!grn_ts_obj_is_table(ctx, table)) { - grn_obj_unlink(ctx, table); - return GRN_OBJECT_CORRUPT; - } - rc = grn_ts_expr_key_node_open(ctx, table, &key_node); - grn_obj_unlink(ctx, table); - if (rc != GRN_SUCCESS) { - return rc; - } - rc = grn_ts_expr_bridge_node_open(ctx, node, key_node, &bridge_node); - if (rc != GRN_SUCCESS) { - return rc; - } - node = bridge_node; - } - *node_ptr = node; - return GRN_SUCCESS; -} - grn_rc grn_ts_expr_builder_complete(grn_ctx *ctx, grn_ts_expr_builder *builder, grn_ts_expr **expr) @@ -178,7 +145,7 @@ grn_ts_expr_builder_complete(grn_ctx *ctx, grn_ts_expr_builder *builder, if (!builder || (builder->n_nodes != 1) || builder->n_bridges || !expr) { GRN_TS_ERR_RETURN(GRN_INVALID_ARGUMENT, "invalid argument"); } - rc = grn_ts_expr_builder_deref(ctx, builder, &builder->nodes[0]); + rc = grn_ts_expr_node_deref(ctx, &builder->nodes[0]); if (rc != GRN_SUCCESS) { return rc; } @@ -681,7 +648,7 @@ grn_ts_expr_builder_push_op(grn_ctx *ctx, grn_ts_expr_builder *builder, * FIXME: Operators "==" and "!=" should compare arguments as references * if possible. */ - rc = grn_ts_expr_builder_deref(ctx, builder, &args[i]); + rc = grn_ts_expr_node_deref(ctx, &args[i]); if (rc != GRN_SUCCESS) { return rc; } Modified: lib/ts/ts_expr_node.c (+31 -0) =================================================================== --- lib/ts/ts_expr_node.c 2015-11-17 13:04:19 +0900 (e1f5efa) +++ lib/ts/ts_expr_node.c 2015-11-17 12:35:51 +0900 (a5b870b) @@ -4654,6 +4654,37 @@ grn_ts_expr_node_close(grn_ctx *ctx, grn_ts_expr_node *node) } #undef GRN_TS_EXPR_NODE_CLOSE_CASE +grn_rc +grn_ts_expr_node_deref(grn_ctx *ctx, grn_ts_expr_node **node_ptr) +{ + grn_ts_expr_node *node = *node_ptr; + while (node->data_kind == GRN_TS_REF) { + grn_rc rc; + grn_ts_expr_node *key_node, *bridge_node; + grn_id table_id = node->data_type; + grn_obj *table = grn_ctx_at(ctx, table_id); + if (!table) { + return GRN_OBJECT_CORRUPT; + } + if (!grn_ts_obj_is_table(ctx, table)) { + grn_obj_unlink(ctx, table); + return GRN_OBJECT_CORRUPT; + } + rc = grn_ts_expr_key_node_open(ctx, table, &key_node); + grn_obj_unlink(ctx, table); + if (rc != GRN_SUCCESS) { + return rc; + } + rc = grn_ts_expr_bridge_node_open(ctx, node, key_node, &bridge_node); + if (rc != GRN_SUCCESS) { + return rc; + } + node = bridge_node; + } + *node_ptr = node; + return GRN_SUCCESS; +} + #define GRN_TS_EXPR_NODE_EVALUATE_CASE(TYPE, type)\ case GRN_TS_EXPR_ ## TYPE ## _NODE: {\ grn_ts_expr_ ## type ## _node *type ## _node;\ Modified: lib/ts/ts_expr_node.h (+13 -0) =================================================================== --- lib/ts/ts_expr_node.h 2015-11-17 13:04:19 +0900 (9dc960c) +++ lib/ts/ts_expr_node.h 2015-11-17 12:35:51 +0900 (5205e80) @@ -91,6 +91,19 @@ grn_rc grn_ts_expr_bridge_node_open(grn_ctx *ctx, grn_ts_expr_node *src, /* grn_ts_expr_node_close() destroys a node. */ void grn_ts_expr_node_close(grn_ctx *ctx, grn_ts_expr_node *node); +/* + * grn_ts_expr_node_deref() resolves references. + * + * If *node_ptr refers to a reference node, grn_ts_expr_node_deref() creates a + * key node associated with the destination table and creates a bridge node + * from *node_ptr to the key node. Then, *node_ptr is modified to refer to the + * bridge node. If the data kind of the bridge node is GRN_TS_REF, references + * are recursively resolved. + * + * Note that references may be partially resolved on failure. + */ +grn_rc grn_ts_expr_node_deref(grn_ctx *ctx, grn_ts_expr_node **node_ptr); + /* grn_ts_expr_node_evaluate() evaluates a subtree. */ grn_rc grn_ts_expr_node_evaluate(grn_ctx *ctx, grn_ts_expr_node *node, const grn_ts_record *in, size_t n_in, -------------- next part -------------- HTML����������������������������...Download