index.c, instead of storing a distinct tree root for every entry in
[sgt/agedu] / index.c
diff --git a/index.c b/index.c
index 53f1000..3431d98 100644 (file)
--- a/index.c
+++ b/index.c
@@ -2,13 +2,10 @@
  * index.c: Implementation of index.h.
  */
 
-#include <assert.h>
-#include <stdio.h>
-#include <stddef.h>
-
+#include "agedu.h"
 #include "trie.h"
 #include "index.h"
-#include "malloc.h"
+#include "alloc.h"
 
 #define alignof(typ) ( offsetof(struct { char c; typ t; }, t) )
 
@@ -139,7 +136,7 @@ static void avl_fix(indexbuild *ib, struct avlnode *n)
                          MAXDEPTH(NODE(ib->t, n->children[1])));
 
     n->totalsize =
-       (ELEMENT(ib->t, n->element)->blocks +
+       (ELEMENT(ib->t, n->element)->size +
         (n->children[0] ? NODE(ib->t, n->children[0])->totalsize : 0) +
         (n->children[1] ? NODE(ib->t, n->children[1])->totalsize : 0));
 }
@@ -261,7 +258,13 @@ void indexbuild_add(indexbuild *ib, const struct trie_file *tf)
 {
     off_t node = OFFSET(ib->t, tf);
     ib->currroot = avl_insert(ib, ib->currroot, node);
-    ib->roots[ib->n++] = OFFSET(ib->t, ib->currroot);
+    ib->roots[ib->n++] = 0;
+}
+
+void indexbuild_tag(indexbuild *ib)
+{
+    if (ib->n > 0)
+       ib->roots[ib->n - 1] = OFFSET(ib->t, ib->currroot);
     ib->firstmutable = ib->nodes + ib->nnodes;
 }
 
@@ -272,6 +275,7 @@ off_t indexbuild_realsize(indexbuild *ib)
 
 void indexbuild_free(indexbuild *ib)
 {
+    assert(ib->n == trie_count(ib->t));
     sfree(ib);
 }
 
@@ -290,6 +294,7 @@ unsigned long long index_query(const void *t, int n, unsigned long long at)
     if (n > count)
        n = count;
 
+    assert(roots[n-1]);
     node = NODE(t, roots[n-1]);
 
     ret = 0;
@@ -304,7 +309,7 @@ unsigned long long index_query(const void *t, int n, unsigned long long at)
        } else {
            if (left)
                ret += left->totalsize;
-           ret += tf->blocks;
+           ret += tf->size;
            node = right;
        }
     }
@@ -321,6 +326,7 @@ unsigned long long index_order_stat(const void *t, double f)
 
     roots = (const off_t *)((const char *)t + trie_get_index_offset(t));
     count = trie_count(t);
+    assert(roots[count-1]);
     node = NODE(t, roots[count-1]);
 
     size = node->totalsize * f;
@@ -334,12 +340,12 @@ unsigned long long index_order_stat(const void *t, double f)
        if (left && size < left->totalsize) {
            node = left;
        } else if (!right ||
-                   size < (left ? left->totalsize : 0) + tf->blocks) {
+                   size < (left ? left->totalsize : 0) + tf->size) {
            return tf->atime;
        } else {
            if (left)
                size -= left->totalsize;
-           size -= tf->blocks;
+           size -= tf->size;
            node = right;
        }
     }