[Groonga-commit] groonga/groonga at 5780995 [master] ii: remove duplicated code

Back to archive index

Kouhei Sutou null+****@clear*****
Mon Apr 4 14:53:05 JST 2016


Kouhei Sutou	2016-04-04 14:53:05 +0900 (Mon, 04 Apr 2016)

  New Revision: 57809959ba993bf7aa348669f891983c4c390fff
  https://github.com/groonga/groonga/commit/57809959ba993bf7aa348669f891983c4c390fff

  Message:
    ii: remove duplicated code

  Modified files:
    lib/ii.c

  Modified: lib/ii.c (+45 -196)
===================================================================
--- lib/ii.c    2016-04-04 14:38:10 +0900 (4e3f55a)
+++ lib/ii.c    2016-04-04 14:53:05 +0900 (ef4b516)
@@ -4402,9 +4402,15 @@ grn_ii_cursor_set_min(grn_ctx *ctx, grn_ii_cursor *c, grn_id min)
   }
 }
 
-grn_posting *
-grn_ii_cursor_next(grn_ctx *ctx, grn_ii_cursor *c)
+typedef struct {
+  grn_bool include_garbage;
+} grn_ii_cursor_next_options;
+
+static inline grn_posting *
+grn_ii_cursor_next_internal(grn_ctx *ctx, grn_ii_cursor *c,
+                            grn_ii_cursor_next_options *options)
 {
+  const grn_bool include_garbage = options->include_garbage;
   if (c->buf) {
     for (;;) {
       if (c->stat & CHUNK_USED) {
@@ -4565,20 +4571,32 @@ grn_ii_cursor_next(grn_ctx *ctx, grn_ii_cursor *c)
         if (c->pc.rid) {
           if (c->pc.rid < c->pb.rid) {
             c->stat = CHUNK_USED;
-            if (c->pc.tf && c->pc.sid) { c->post = &c->pc; break; }
+            if (include_garbage || (c->pc.tf && c->pc.sid)) {
+              c->post = &c->pc;
+              break;
+            }
           } else {
             if (c->pb.rid < c->pc.rid) {
               c->stat = BUFFER_USED;
-              if (c->pb.tf && c->pb.sid) { c->post = &c->pb; break; }
+              if (include_garbage || (c->pb.tf && c->pb.sid)) {
+                c->post = &c->pb;
+                break;
+              }
             } else {
               if (c->pb.sid) {
                 if (c->pc.sid < c->pb.sid) {
                   c->stat = CHUNK_USED;
-                  if (c->pc.tf && c->pc.sid) { c->post = &c->pc; break; }
+                  if (include_garbage || (c->pc.tf && c->pc.sid)) {
+                    c->post = &c->pc;
+                    break;
+                  }
                 } else {
                   c->stat = BUFFER_USED;
                   if (c->pb.sid == c->pc.sid) { c->stat |= CHUNK_USED; }
-                  if (c->pb.tf) { c->post = &c->pb; break; }
+                  if (include_garbage || (c->pb.tf)) {
+                    c->post = &c->pb;
+                    break;
+                  }
                 }
               } else {
                 c->stat = CHUNK_USED;
@@ -4587,12 +4605,18 @@ grn_ii_cursor_next(grn_ctx *ctx, grn_ii_cursor *c)
           }
         } else {
           c->stat = BUFFER_USED;
-          if (c->pb.tf && c->pb.sid) { c->post = &c->pb; break; }
+          if (include_garbage || (c->pb.tf && c->pb.sid)) {
+            c->post = &c->pb;
+            break;
+          }
         }
       } else {
         if (c->pc.rid) {
           c->stat = CHUNK_USED;
-          if (c->pc.tf && c->pc.sid) { c->post = &c->pc; break; }
+          if (include_garbage || (c->pc.tf && c->pc.sid)) {
+            c->post = &c->pc;
+            break;
+          }
         } else {
           c->post = NULL;
           return NULL;
@@ -4616,6 +4640,15 @@ grn_ii_cursor_next(grn_ctx *ctx, grn_ii_cursor *c)
 }
 
 grn_posting *
+grn_ii_cursor_next(grn_ctx *ctx, grn_ii_cursor *c)
+{
+  grn_ii_cursor_next_options options = {
+    .include_garbage = GRN_FALSE
+  };
+  return grn_ii_cursor_next_internal(ctx, c, &options);
+}
+
+grn_posting *
 grn_ii_cursor_next_pos(grn_ctx *ctx, grn_ii_cursor *c)
 {
   uint32_t gap;
@@ -7274,193 +7307,6 @@ grn_ii_resolve_sel_and(grn_ctx *ctx, grn_hash *s, grn_operator op)
   }
 }
 
-/* just for inspect */
-static grn_posting *
-grn_ii_cursor_next_all(grn_ctx *ctx, grn_ii_cursor *c)
-{
-  if (c->buf) {
-    for (;;) {
-      if (c->stat & CHUNK_USED) {
-        for (;;) {
-          if (c->crp < c->cdp + c->cdf) {
-            uint32_t dgap = *c->crp++;
-            c->pc.rid += dgap;
-            if (dgap) { c->pc.sid = 0; }
-            if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
-              c->pc.sid += 1 + *c->csp++;
-            } else {
-              c->pc.sid = 1;
-            }
-            c->cpp += c->pc.rest;
-            c->pc.rest = c->pc.tf = 1 + *c->ctp++;
-            if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
-              c->pc.weight = *c->cwp++;
-            } else {
-              c->pc.weight = 0;
-            }
-            c->pc.pos = 0;
-            /*
-            {
-              static int count = 0;
-              int tf = c->pc.tf, pos = 0, *pp = (int *)c->cpp;
-              grn_obj buf;
-              GRN_TEXT_INIT(&buf, 0);
-              grn_text_itoa(ctx, &buf, c->pc.rid);
-              GRN_TEXT_PUTC(ctx, &buf, ':');
-              grn_text_itoa(ctx, &buf, c->pc.sid);
-              GRN_TEXT_PUTC(ctx, &buf, ':');
-              grn_text_itoa(ctx, &buf, c->pc.tf);
-              GRN_TEXT_PUTC(ctx, &buf, '(');
-              while (tf--) {
-                pos += *pp++;
-                count++;
-                grn_text_itoa(ctx, &buf, pos);
-                if (tf) { GRN_TEXT_PUTC(ctx, &buf, ':'); }
-              }
-              GRN_TEXT_PUTC(ctx, &buf, ')');
-              GRN_TEXT_PUTC(ctx, &buf, '\0');
-              GRN_LOG(ctx, GRN_LOG_DEBUG, "posting(%d):%s", count, GRN_TEXT_VALUE(&buf));
-              GRN_OBJ_FIN(ctx, &buf);
-            }
-            */
-          } else {
-            if (c->curr_chunk <= c->nchunks) {
-              if (c->curr_chunk == c->nchunks) {
-                if (c->cp < c->cpe) {
-                  grn_p_decv(ctx, c->cp, c->cpe - c->cp, c->rdv, c->ii->n_elements);
-                } else {
-                  c->pc.rid = 0;
-                  break;
-                }
-              } else {
-                uint8_t *cp;
-                grn_io_win iw;
-                uint32_t size = c->cinfo[c->curr_chunk].size;
-                if (size && (cp = WIN_MAP(c->ii->chunk, ctx, &iw,
-                                          c->cinfo[c->curr_chunk].segno, 0,
-                                          size, grn_io_rdonly))) {
-                  grn_p_decv(ctx, cp, size, c->rdv, c->ii->n_elements);
-                  grn_io_win_unmap(&iw);
-                } else {
-                  c->pc.rid = 0;
-                  break;
-                }
-              }
-              {
-                int j = 0;
-                c->cdf = c->rdv[j].data_size;
-                c->crp = c->cdp = c->rdv[j++].data;
-                if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
-                  c->csp = c->rdv[j++].data;
-                }
-                c->ctp = c->rdv[j++].data;
-                if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
-                  c->cwp = c->rdv[j++].data;
-                }
-                c->cpp = c->rdv[j].data;
-              }
-              c->prev_chunk_rid = c->pc.rid;
-              c->pc.rid = 0;
-              c->pc.sid = 0;
-              c->pc.rest = 0;
-              c->curr_chunk++;
-              continue;
-            } else {
-              c->pc.rid = 0;
-            }
-          }
-          break;
-        }
-      }
-      if (c->stat & BUFFER_USED) {
-        if (c->nextb) {
-          uint32_t lrid = c->pb.rid, lsid = c->pb.sid; /* for check */
-          buffer_rec *br = BUFFER_REC_AT(c->buf, c->nextb);
-          if (buffer_is_reused(ctx, c->ii, c)) {
-            GRN_LOG(ctx, GRN_LOG_DEBUG, "buffer reused(%d,%d)",
-                    c->buffer_pseg, *c->ppseg);
-            // todo : rewind;
-          }
-          c->bp = GRN_NEXT_ADDR(br);
-          GRN_B_DEC(c->pb.rid, c->bp);
-          if ((c->ii->header->flags & GRN_OBJ_WITH_SECTION)) {
-            GRN_B_DEC(c->pb.sid, c->bp);
-          } else {
-            c->pb.sid = 1;
-          }
-          if (lrid > c->pb.rid || (lrid == c->pb.rid && lsid >= c->pb.sid)) {
-            ERR(GRN_FILE_CORRUPT, "brokend!! (%d:%d) -> (%d:%d) (%d->%d)",
-                lrid, lsid, c->pb.rid, c->pb.sid, c->buffer_pseg, *c->ppseg);
-          }
-          c->nextb = br->step;
-          GRN_B_DEC(c->pb.tf, c->bp);
-          if ((c->ii->header->flags & GRN_OBJ_WITH_WEIGHT)) {
-            GRN_B_DEC(c->pb.weight, c->bp);
-          } else {
-            c->pb.weight = 0;
-          }
-          c->pb.rest = c->pb.tf;
-          c->pb.pos = 0;
-        } else {
-          c->pb.rid = 0;
-        }
-      }
-      if (c->pb.rid) {
-        if (c->pc.rid) {
-          if (c->pc.rid < c->pb.rid) {
-            c->stat = CHUNK_USED;
-            c->post = &c->pc;
-            break;
-          } else {
-            if (c->pb.rid < c->pc.rid) {
-              c->stat = BUFFER_USED;
-              c->post = &c->pb;
-              break;
-            } else {
-              if (c->pb.sid) {
-                if (c->pc.sid < c->pb.sid) {
-                  c->stat = CHUNK_USED;
-                  c->post = &c->pc;
-                  break;
-                } else {
-                  c->stat = BUFFER_USED;
-                  if (c->pb.sid == c->pc.sid) { c->stat |= CHUNK_USED; }
-                  c->post = &c->pb;
-                  break;
-                }
-              } else {
-                c->stat = CHUNK_USED;
-              }
-            }
-          }
-        } else {
-          c->stat = BUFFER_USED;
-          c->post = &c->pb;
-          break;
-        }
-      } else {
-        if (c->pc.rid) {
-          c->stat = CHUNK_USED;
-          c->post = &c->pc;
-          break;
-        } else {
-          c->post = NULL;
-          return NULL;
-        }
-      }
-    }
-  } else {
-    if (c->stat & SOLE_DOC_USED) {
-      c->post = NULL;
-      return NULL;
-    } else {
-      c->post = &c->pb;
-      c->stat |= SOLE_DOC_USED;
-    }
-  }
-  return c->post;
-}
-
 void
 grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
 {
@@ -7468,6 +7314,9 @@ grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
   char key[GRN_TABLE_MAX_KEY_SIZE];
   int key_size;
   int i = 0;
+  grn_ii_cursor_next_options options = {
+    .include_garbage = GRN_TRUE
+  };
 
   GRN_TEXT_PUTS(ctx, buf, "  #<");
   key_size = grn_table_get_key(ctx, c->ii->lexicon, c->id,
@@ -7478,7 +7327,7 @@ grn_ii_cursor_inspect(grn_ctx *ctx, grn_ii_cursor *c, grn_obj *buf)
   GRN_OBJ_FIN(ctx, &key_buf);
 
   GRN_TEXT_PUTS(ctx, buf, "\n    elements:[\n      ");
-  while (grn_ii_cursor_next_all(ctx, c)) {
+  while (grn_ii_cursor_next_internal(ctx, c, &options)) {
     grn_posting *pos = c->post;
     if (i > 0) {
       GRN_TEXT_PUTS(ctx, buf, ",\n      ");
-------------- next part --------------
HTML����������������������������...
Download 



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