Changeset: 726c20dc5523 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=726c20dc5523
Modified Files:
        gdk/gdk.h
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_orderindex.c
        gdk/gdk_private.h
        monetdb5/modules/mal/Makefile.ag
Branch: leftmart
Log Message:

Keep a bat instead of a heap.
The name of the index is order oid index.


diffs (251 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -674,8 +674,12 @@ typedef struct {
        Heap *heap;             /* heap where the hash is stored */
 } Hash;
 
+typedef struct {
+       int flags;              /* flags */
+       bat o;                  /* bat with oid order map */
+} OrderIdx;
+
 typedef struct Imprints Imprints;
-typedef struct Order Order;
 
 
 /*
@@ -798,7 +802,7 @@ gdk_export int VALisnil(const ValRecord 
  *           Heap   *hheap;           // heap for varsized head values
  *           Hash   *hhash;           // linear chained hash table on head
  *           Imprints *himprints;     // column imprints index on head
- *           Order    *horder;        // order oid index on head
+ *           OrderIdx    *horderidx;  // order oid index on head
  *           // Tail properties
  *           int    ttype;            // Tail type number
  *           str    tident;           // name for tail column
@@ -812,7 +816,7 @@ gdk_export int VALisnil(const ValRecord 
  *           Heap   *theap;           // heap for varsized tail values
  *           Hash   *thash;           // linear chained hash table on tail
  *           Imprints *timprints;     // column imprints index on tail
- *           Order *torder;           // order oid index on tail
+ *           OrderIdx *torderidx;     // order oid index on tail
  *  } BAT;
  * @end verbatim
  *
@@ -892,7 +896,7 @@ typedef struct {
        Heap *vheap;            /* space for the varsized data. */
        Hash *hash;             /* hash table */
        Imprints *imprints;     /* column imprints index */
-       Order *order;   /* order oid index */
+       OrderIdx *orderidx;     /* order oid index */
 
        PROPrec *props;         /* list of dynamic properties stored in the bat 
descriptor */
 } COLrec;
@@ -960,6 +964,9 @@ typedef int (*GDKfcn) ();
 #define tident         T->id
 #define halign         H->align
 #define talign         T->align
+#define horderidx      H->orderidx
+#define torderidx      T->orderidx
+
 
 #define batMaphead     S->map_head
 #define batMaptail     S->map_tail
@@ -2110,7 +2117,8 @@ gdk_export lng IMPSimprintsize(BAT *b);
  * The oid index order.
  *
  */
-gdk_export gdk_return ORDERindex(BAT *b, BAT *order);
+gdk_export gdk_return ORDERkeepidx(BAT *b, BAT *order);
+gdk_export BAT *ORDERgetidx(BAT *b);
 
 /*
  * @- Multilevel Storage Modes
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -329,10 +329,10 @@ VIEWcreate_(BAT *h, BAT *t, int slice_vi
        /* imprints are shared, but the check is dynamic */
        bn->H->imprints = NULL;
        bn->T->imprints = NULL;
-       /* OID index arrangement */
+       /* Order OID index */
        /* TODO: what is the correct step here? slice the OID index? */
-       bn->H->arngment = NULL;
-       bn->T->arngment = NULL;
+       bn->H->orderidx = NULL;
+       bn->T->orderidx = NULL;
        BBPcacheit(bs, 1);      /* enter in BBP */
        /* View of VIEW combine, ie we need to fix the head of the mirror */
        if (vc) {
@@ -549,11 +549,11 @@ VIEWunlink(BAT *b)
                if (tpb && b->T->imprints && b->T->imprints == tpb->H->imprints)
                        b->T->imprints = NULL;
 
-               /* unlink OID index arrangement */
-               if (hpb && b->H->arngment && b->H->arngment == hpb->H->arngment)
-                       b->H->arngment = NULL;
-               if (tpb && b->T->arngment && b->T->arngment == tpb->H->arngment)
-                       b->T->arngment = NULL;
+               /* unlink order OID index */
+               if (hpb && b->H->orderidx && b->H->orderidx == hpb->H->orderidx)
+                       b->H->orderidx = NULL;
+               if (tpb && b->T->orderidx && b->T->orderidx == tpb->H->orderidx)
+                       b->T->orderidx = NULL;
 
        }
 }
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -125,6 +125,10 @@ BATcreatedesc(int ht, int tt, int heapna
         */
        BBPinsert(bs);
        /*
+        * Default zero flags for order oid index
+        */
+       bn->torderidx->flags = 0;
+       /*
         * fill in heap names, so HEAPallocs can resort to disk for
         * very large writes.
         */
diff --git a/gdk/gdk_orderindex.c b/gdk/gdk_orderindex.c
--- a/gdk/gdk_orderindex.c
+++ b/gdk/gdk_orderindex.c
@@ -22,8 +22,72 @@
  */
 
 gdk_return
-ORDERindex(BAT *b, BAT *order) {
-       (void) b;
-       (void) order;
+ORDERkeepidx(BAT *b, BAT *order) {
+
+       assert(BAThdense(b));   /* assert void headed */
+       assert(BAThdense(order));       /* assert void headed */
+
+       switch (ATOMstorage(b->ttype)) {
+       case TYPE_bte:
+       case TYPE_sht:
+       case TYPE_int:
+       case TYPE_lng:
+#ifdef HAVE_HGE
+       case TYPE_hge:
+#endif
+       case TYPE_flt:
+       case TYPE_dbl:
+               break;
+       case TYPE_void:
+       case TYPE_str:
+       case TYPE_ptr:
+       default:
+               /* TODO: support strings, date, timestamps etc. */
+               GDKerror("TYPE not supported.\n");
+               return GDK_FAIL;
+       }
+
+       if (ATOMtype(order->ttype) != TYPE_oid) {
+               GDKerror("BAT order=%s not correct type.\n", BATgetId(order));
+               return GDK_FAIL;
+       }
+
+       BATcheck(b, "ORDERkeepidx", GDK_FAIL);
+       BATcheck(order, "ORDERkeepidx", GDK_FAIL);
+
+       if (VIEWtparent(b)) {
+               /* the Order Index is a slice of the parent Order Index.
+                * Functions on modules MAL should take care of that */
+               GDKerror("b=%s is a VIEW.\n", BATgetId(b));
+               return GDK_FAIL;
+       }
+       if (VIEWtparent(order)) {
+               GDKerror("order=%s is a VIEW.\n", BATgetId(order));
+               return GDK_FAIL;
+       }
+
+       MT_lock_set(&GDKorderIdxLock(abs(b->batCacheid)), "ORDERkeepidx");
+       if (!b->torderidx->flags) {
+               b->torderidx->o = BBPcacheid(order);
+               BBPkeepref(order->batCacheid);
+               b->torderidx->flags = 1;
+       } else {
+               /* take care if other index already exists, should not happen 
though
+                * because it is a waste of resources.
+                */
+               return GDK_FAIL;
+       }
+       MT_lock_unset(&GDKorderIdxLock(abs(b->batCacheid)), "ORDERkeepidx");
+
        return GDK_SUCCEED;
 }
+
+gdk_export
+BAT *ORDERgetidx(BAT *b) {
+       BATcheck(b, "ORDERgetidx", GDK_FAIL);
+
+       if (b->torderidx->flags) {
+               return BBPdescriptor(b->torderidx->o);
+       }
+       return NULL;
+}
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -221,16 +221,11 @@ struct Imprints {
        BUN dictcnt;            /* counter for cache dictionary               */
 };
 
-struct Arngment {
-       int flags;
-       Heap *arngment;
-};
-
 typedef struct {
        MT_Lock swap;
        MT_Lock hash;
        MT_Lock imprints;
-       MT_Lock arngment;
+       MT_Lock orderIdx;
 } batlock_t;
 
 typedef struct {
@@ -305,7 +300,7 @@ extern MT_Lock MT_system_lock;
 #define GDKswapLock(x)  GDKbatLock[(x)&BBP_BATMASK].swap
 #define GDKhashLock(x)  GDKbatLock[(x)&BBP_BATMASK].hash
 #define GDKimprintsLock(x)  GDKbatLock[(x)&BBP_BATMASK].imprints
-#define GDKarngmentLock(x)  GDKbatLock[(x)&BBP_BATMASK].arngment
+#define GDKorderIdxLock(x)  GDKbatLock[(x)&BBP_BATMASK].orderIdx
 #if SIZEOF_SIZE_T == 8
 #define threadmask(y)  ((int) ((mix_int((unsigned int) y) ^ mix_int((unsigned 
int) (y >> 32))) & BBP_THREADMASK))
 #else
diff --git a/monetdb5/modules/mal/Makefile.ag b/monetdb5/modules/mal/Makefile.ag
--- a/monetdb5/modules/mal/Makefile.ag
+++ b/monetdb5/modules/mal/Makefile.ag
@@ -25,7 +25,7 @@ lib_mal = {
                factories.c factories.h \
                groupby.c groupby.h \
                inspect.c inspect.h \
-               arrange.c arrange.h \
+               orderidx.c orderidx.h \
                iterator.c  iterator.h \
                joinpath.c  joinpath.h \
                language.c language.h \
@@ -57,7 +57,7 @@ headers_mal = {
        HEADERS = mal
        DIR = libdir/monetdb5
        SOURCES = language.mal mal_init.mal bbp.mal \
-               profiler.mal batExtensions.mal arrange.mal \
+               profiler.mal batExtensions.mal orderidx.mal \
                inspect.mal manual.mal mal_io.mal mkey.mal manifold.mal \
                iterator.mal clients.mal \
                factories.mal groupby.mal mdb.mal pcre.mal mat.mal \
@@ -86,7 +86,7 @@ headers_hge = {
 
 EXTRA_DIST = batExtensions.mal iterator.mal \
        groupby.mal mal_init.mal manual.mal mkey.mal manifold.mal pcre.mal \
-       profiler.mal recycle.mal remote.mal sabaoth.mal arrange.mal \
+       profiler.mal recycle.mal remote.mal sabaoth.mal orderidx.mal \
        transaction.mal txtsim.mal tablet.mal tablet.h sample.mal json_util.mal 
\
        mal_mapi.mal mat.mal tokenizer.mal \
        batmtime.mal querylog.mal sysmon.mal \
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to