[Groonga-commit] groonga/groonga at f9e851c [master] grn_ts: add a block to be improved for better performance

Back to archive index

susumu.yata null+****@clear*****
Tue Nov 17 15:38:52 JST 2015


susumu.yata	2015-11-17 15:38:52 +0900 (Tue, 17 Nov 2015)

  New Revision: f9e851cbfdd1f55f59221146e159dd424f4b486b
  https://github.com/groonga/groonga/commit/f9e851cbfdd1f55f59221146e159dd424f4b486b

  Message:
    grn_ts: add a block to be improved for better performance

  Modified files:
    lib/ts/ts_expr_builder.c
    lib/ts/ts_expr_node.c

  Modified: lib/ts/ts_expr_builder.c (+1 -1)
===================================================================
--- lib/ts/ts_expr_builder.c    2015-11-17 14:12:37 +0900 (b5ec49d)
+++ lib/ts/ts_expr_builder.c    2015-11-17 15:38:52 +0900 (bd9f6fb)
@@ -622,7 +622,7 @@ grn_ts_expr_builder_push_op(grn_ctx *ctx, grn_ts_expr_builder *builder,
 {
   grn_rc rc;
   grn_ts_expr_node **args, *node;
-  size_t i, n_args, max_n_args;
+  size_t n_args, max_n_args;
   if (!ctx) {
     return GRN_INVALID_ARGUMENT;
   }

  Modified: lib/ts/ts_expr_node.c (+59 -13)
===================================================================
--- lib/ts/ts_expr_node.c    2015-11-17 14:12:37 +0900 (afb6184)
+++ lib/ts/ts_expr_node.c    2015-11-17 15:38:52 +0900 (0a2c512)
@@ -3102,23 +3102,68 @@ grn_ts_expr_op_node_check_args(grn_ctx *ctx, grn_ts_expr_op_node *node)
   }
 }
 
-/* grn_ts_expr_op_node_setup() sets up an operator node. */
+/*
+ * grn_ts_expr_op_node_deref_args_for_equal() resolves references if required.
+ */
 static grn_rc
-grn_ts_expr_op_node_setup(grn_ctx *ctx, grn_ts_expr_op_node *node)
+grn_ts_expr_op_node_deref_args_for_equal(grn_ctx *ctx,
+                                         grn_ts_expr_op_node *node)
 {
-  size_t i;
   grn_rc rc;
-  for (i = 0; i < node->n_args; i++) {
-    /*
-     * FIXME: Operators "==" and "!=" should compare arguments as references
-     *        if possible.
-     */
-    rc = grn_ts_expr_node_deref(ctx, node->args[i], &node->args[i]);
-    if (rc != GRN_SUCCESS) {
-      return rc;
+  if (node->n_args != 2) {
+    GRN_TS_ERR_RETURN(GRN_OBJECT_CORRUPT, "invalid #args: %" GRN_FMT_SIZE,
+                      node->n_args);
+  }
+  if ((node->args[0]->data_kind & ~GRN_TS_VECTOR_FLAG) != GRN_TS_REF) {
+    return grn_ts_expr_node_deref(ctx, node->args[1], &node->args[1]);
+  }
+  if ((node->args[1]->data_kind & ~GRN_TS_VECTOR_FLAG) != GRN_TS_REF) {
+    return grn_ts_expr_node_deref(ctx, node->args[0], &node->args[0]);
+  }
+
+  /* FIXME: Arguments should be compared as references if possible. */
+  rc = grn_ts_expr_node_deref(ctx, node->args[0], &node->args[0]);
+  if (rc != GRN_SUCCESS) {
+    return rc;
+  }
+  rc = grn_ts_expr_node_deref(ctx, node->args[1], &node->args[1]);
+  if (rc != GRN_SUCCESS) {
+    return rc;
+  }
+  return GRN_SUCCESS;
+}
+
+/* grn_ts_expr_op_node_deref_args() resolves references if required. */
+static grn_rc
+grn_ts_expr_op_node_deref_args(grn_ctx *ctx, grn_ts_expr_op_node *node)
+{
+  switch (node->op_type) {
+    case GRN_TS_OP_EQUAL:
+    case GRN_TS_OP_NOT_EQUAL: {
+      return grn_ts_expr_op_node_deref_args_for_equal(ctx, node);
     }
+    /* TODO: Add a ternary operator. */
+    default: {
+      size_t i;
+      for (i = 0; i < node->n_args; i++) {
+        grn_rc rc = grn_ts_expr_node_deref(ctx, node->args[i], &node->args[i]);
+        if (rc != GRN_SUCCESS) {
+          return rc;
+        }
+      }
+      return GRN_SUCCESS;
+    }
+  }
+}
+
+/* grn_ts_expr_op_node_setup() sets up an operator node. */
+static grn_rc
+grn_ts_expr_op_node_setup(grn_ctx *ctx, grn_ts_expr_op_node *node)
+{
+  grn_rc rc = grn_ts_expr_op_node_deref_args(ctx, node);
+  if (rc != GRN_SUCCESS) {
+    return rc;
   }
-  /* Check arguments. */
   rc = grn_ts_expr_op_node_check_args(ctx, node);
   if (rc != GRN_SUCCESS) {
     return rc;
@@ -4680,6 +4725,7 @@ grn_ts_expr_node_close(grn_ctx *ctx, grn_ts_expr_node *node)
 }
 #undef GRN_TS_EXPR_NODE_CLOSE_CASE
 
+/* grn_ts_expr_node_deref_once() resolves a reference. */
 static grn_rc
 grn_ts_expr_node_deref_once(grn_ctx *ctx, grn_ts_expr_node *in,
                             grn_ts_expr_node **out)
@@ -4714,7 +4760,7 @@ grn_ts_expr_node_deref(grn_ctx *ctx, grn_ts_expr_node *in,
                        grn_ts_expr_node **out)
 {
   grn_ts_expr_node *node = in, **in_ptr = NULL;
-  while (node->data_kind == GRN_TS_REF) {
+  while ((node->data_kind & ~GRN_TS_VECTOR_FLAG) == GRN_TS_REF) {
     grn_ts_expr_node *new_node;
     grn_rc rc = grn_ts_expr_node_deref_once(ctx, node, &new_node);
     if (rc != GRN_SUCCESS) {
-------------- next part --------------
HTML����������������������������...
다운로드 



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