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