[Groonga-commit] groonga/groonga at d98ad09 [master] accessor: extract common code

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Jan 19 18:10:32 JST 2015


Kouhei Sutou	2015-01-19 18:10:32 +0900 (Mon, 19 Jan 2015)

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

  Message:
    accessor: extract common code

  Modified files:
    lib/db.c

  Modified: lib/db.c (+64 -62)
===================================================================
--- lib/db.c    2015-01-19 17:30:09 +0900 (1c17a43)
+++ lib/db.c    2015-01-19 18:10:32 +0900 (136b5fc)
@@ -4685,6 +4685,64 @@ accessor_new(grn_ctx *ctx)
   return res;
 }
 
+inline static grn_bool
+grn_obj_get_accessor_pseudo_column(grn_ctx *ctx, grn_obj *obj,
+                                   grn_accessor **res, uint8_t action)
+{
+  grn_bool succeeded = GRN_FALSE;
+  grn_accessor **rp;
+
+  for (rp = res; GRN_TRUE; rp = &(*rp)->next) {
+    *rp = accessor_new(ctx);
+    (*rp)->obj = obj;
+
+    switch (action) {
+    case GRN_ACCESSOR_GET_SCORE :
+      if (DB_OBJ(obj)->header.flags & GRN_OBJ_WITH_SUBREC) {
+        (*rp)->action = action;
+        succeeded = GRN_TRUE;
+        goto exit;
+      }
+      break;
+    case GRN_ACCESSOR_GET_SUM :
+      if (GRN_TABLE_IS_GROUPED(obj)) {
+        (*rp)->action = GRN_ACCESSOR_GET_SUM;
+        succeeded = GRN_TRUE;
+        goto exit;
+      }
+      break;
+    }
+
+    switch (obj->header.type) {
+    case GRN_TABLE_PAT_KEY :
+    case GRN_TABLE_DAT_KEY :
+    case GRN_TABLE_HASH_KEY :
+      (*rp)->action = GRN_ACCESSOR_GET_KEY;
+      break;
+    case GRN_TABLE_NO_KEY :
+      if (!obj->header.domain) {
+        goto exit;
+      }
+      (*rp)->action = GRN_ACCESSOR_GET_VALUE;
+      break;
+    default :
+      /* lookup failed */
+      goto exit;
+    }
+    if (!(obj = grn_ctx_at(ctx, obj->header.domain))) {
+      goto exit;
+    }
+  }
+
+exit :
+  if (!succeeded) {
+    grn_obj_close(ctx, (grn_obj *)*res);
+    *res = NULL;
+  }
+
+  return succeeded;
+}
+
 static grn_obj *
 grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int name_size)
 {
@@ -4876,73 +4934,17 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned int
       case 's' : /* score, sum */
         if (len == GRN_COLUMN_NAME_SCORE_LEN &&
             memcmp(name, GRN_COLUMN_NAME_SCORE, GRN_COLUMN_NAME_SCORE_LEN) == 0) {
-        for (rp = &res; !done; rp = &(*rp)->next) {
-          *rp = accessor_new(ctx);
-          (*rp)->obj = obj;
-          if (DB_OBJ(obj)->header.flags & GRN_OBJ_WITH_SUBREC) {
-            (*rp)->action = GRN_ACCESSOR_GET_SCORE;
-            done++;
-          } else {
-            switch (obj->header.type) {
-            case GRN_TABLE_PAT_KEY :
-            case GRN_TABLE_DAT_KEY :
-            case GRN_TABLE_HASH_KEY :
-              (*rp)->action = GRN_ACCESSOR_GET_KEY;
-              break;
-            case GRN_TABLE_NO_KEY :
-              if (obj->header.domain) {
-                (*rp)->action = GRN_ACCESSOR_GET_VALUE;
-                break;
-              }
-              /* fallthru */
-            default :
-              /* lookup failed */
-              grn_obj_close(ctx, (grn_obj *)res);
-              res = NULL;
-              goto exit;
-            }
-            if (!(obj = grn_ctx_at(ctx, obj->header.domain))) {
-              grn_obj_close(ctx, (grn_obj *)res);
-              res = NULL;
-              goto exit;
-            }
+          if (!grn_obj_get_accessor_pseudo_column(ctx, obj, &res,
+                                                  GRN_ACCESSOR_GET_SCORE)) {
+            goto exit;
           }
-        }
         } else if (len == GRN_COLUMN_NAME_SUM_LEN &&
                    memcmp(name,
                           GRN_COLUMN_NAME_SUM,
                           GRN_COLUMN_NAME_SUM_LEN) == 0) {
-          for (rp = &res; !done; rp = &(*rp)->next) {
-            *rp = accessor_new(ctx);
-            (*rp)->obj = obj;
-            if (GRN_TABLE_IS_GROUPED(obj)) {
-              (*rp)->action = GRN_ACCESSOR_GET_SUM;
-              done++;
-            } else {
-              switch (obj->header.type) {
-              case GRN_TABLE_PAT_KEY :
-              case GRN_TABLE_DAT_KEY :
-              case GRN_TABLE_HASH_KEY :
-                (*rp)->action = GRN_ACCESSOR_GET_KEY;
-                break;
-              case GRN_TABLE_NO_KEY :
-                if (obj->header.domain) {
-                  (*rp)->action = GRN_ACCESSOR_GET_VALUE;
-                  break;
-                }
-                /* fallthru */
-              default :
-                /* lookup failed */
-                grn_obj_close(ctx, (grn_obj *)res);
-                res = NULL;
-                goto exit;
-              }
-              if (!(obj = grn_ctx_at(ctx, obj->header.domain))) {
-                grn_obj_close(ctx, (grn_obj *)res);
-                res = NULL;
-                goto exit;
-              }
-            }
+          if (!grn_obj_get_accessor_pseudo_column(ctx, obj, &res,
+                                                  GRN_ACCESSOR_GET_SUM)) {
+            goto exit;
           }
         } else {
           goto exit;
-------------- next part --------------
HTML����������������������������...
下载 



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