[Groonga-commit] groonga/groonga at de3bbc6 [master] grn_ts: implicitly insert bridges for resolving a name

Back to archive index

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 



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