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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list