[Groonga-commit] groonga/groonga at 560dd0e [master] grn_ts: rename grn_ts_expr_builder_deref() to grn_ts_expr_node_deref()

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index