Changeset: 8d32a4f24cb9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d32a4f24cb9
Modified Files:
gdk/gdk_batop.c
gdk/gdk_calc.c
gdk/gdk_group.c
gdk/gdk_join.c
gdk/gdk_qsort.c
gdk/gdk_select.c
gdk/gdk_setop.c
gdk/gdk_ssort_impl.h
Branch: Jan2014
Log Message:
In more places use parent type if comparisons work the same.
This is a refinement of changeset e1d38acdb825.
diffs (truncated from 392 to 300 lines):
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2226,6 +2226,7 @@ BATcount_no_nil(BAT *b)
BUN i, n;
const void *p, *nil;
const char *base;
+ int t;
int (*cmp)(const void *, const void *);
BATcheck(b, "BATcnt");
@@ -2233,7 +2234,12 @@ BATcount_no_nil(BAT *b)
if (b->T->nonil)
return n;
p = Tloc(b, b->U->first);
- switch (ATOMstorage(b->ttype)) {
+ t = b->ttype;
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) &&
+ BATatoms[ATOMstorage(t)].atomCmp == BATatoms[t].atomCmp)
+ t = ATOMstorage(t);
+ switch (t) {
case TYPE_void:
cnt = b->tseqbase == oid_nil ? 0 : n;
break;
@@ -2285,8 +2291,8 @@ BATcount_no_nil(BAT *b)
}
break;
default:
- nil = ATOMnilptr(b->ttype);
- cmp = BATatoms[b->ttype].atomCmp;
+ nil = ATOMnilptr(t);
+ cmp = BATatoms[t].atomCmp;
if (b->tvarsized) {
base = b->T->vheap->base;
for (i = 0; i < n; i++)
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -8388,6 +8388,11 @@ BATcalcbetween_intern(const void *src, i
CANDLOOP(dst, l, bit_nil, 0, start);
+ if (tp != ATOMstorage(tp) &&
+ ATOMnilptr(ATOMstorage(tp)) == ATOMnilptr(tp) &&
+ BATatoms[ATOMstorage(tp)].atomCmp == BATatoms[tp].atomCmp)
+ tp = ATOMstorage(tp);
+
switch (tp) {
case TYPE_bte:
BETWEEN_LOOP_TYPE(bte);
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -362,6 +362,7 @@ BATgroup_internal(BAT **groups, BAT **ex
BAT *b, BAT *g, BAT *e, BAT *h, int subsorted)
{
BAT *gn = NULL, *en = NULL, *hn = NULL;
+ int t;
int (*cmp)(const void *, const void *);
const oid *grps = NULL;
oid *ngrps, ngrp, prev = 0;
@@ -543,6 +544,16 @@ BATgroup_internal(BAT **groups, BAT **ex
BATseqbase(gn, b->hseqbase);
if (g)
grps = (const oid *) Tloc(g, BUNfirst(g));
+
+ /* figure out if we can use the storage type also for
+ * comparing values */
+ t = b->ttype;
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) &&
+ BATatoms[ATOMstorage(t)].atomCmp == cmp &&
+ BATatoms[ATOMstorage(t)].atomHash == BATatoms[t].atomHash)
+ t = ATOMstorage(t);
+
if (((b->tsorted || b->trevsorted) &&
(g == NULL || g->tsorted || g->trevsorted)) ||
subsorted) {
@@ -566,7 +577,7 @@ BATgroup_internal(BAT **groups, BAT **ex
if (histo)
cnts[0] = 1;
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
GRP_compare_consecutive_values_tpe(bte);
break;
@@ -639,7 +650,7 @@ BATgroup_internal(BAT **groups, BAT **ex
ngrp++; /* the next group to be assigned */
gn->tsorted = 1; /* be optimistic */
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
GRP_subscan_old_groups_tpe(bte);
break;
@@ -678,7 +689,7 @@ BATgroup_internal(BAT **groups, BAT **ex
hs = b->T->hash;
gn->tsorted = 1; /* be optimistic */
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
GRP_use_existing_hash_table_tpe(bte);
break;
@@ -755,7 +766,7 @@ BATgroup_internal(BAT **groups, BAT **ex
}
gn->tsorted = 1; /* be optimistic */
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
GRP_create_partial_hash_table_tpe(bte);
break;
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -1450,7 +1450,14 @@ hashjoin(BAT *r1, BAT *r2, BAT *l, BAT *
break;
}
} else {
- switch (r->htype) {
+ int t = r->htype;
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t)
&&
+ BATatoms[ATOMstorage(t)].atomCmp ==
BATatoms[t].atomCmp &&
+ BATatoms[ATOMstorage(t)].atomHash ==
BATatoms[t].atomHash)
+ t = ATOMstorage(t);
+
+ switch (t) {
case TYPE_int:
#if SIZEOF_OID == SIZEOF_INT
case TYPE_oid:
@@ -1832,6 +1839,7 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT *
const oid *rcand = NULL, *rcandend = NULL;
const char *lvals, *rvals;
int lwidth, rwidth;
+ int t;
const void *nil = ATOMnilptr(l->ttype);
int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp;
const char *vl, *vr;
@@ -1865,7 +1873,13 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT *
assert(sl == NULL || sl->tsorted);
assert(sr == NULL || sr->tsorted);
- switch (ATOMtype(l->ttype)) {
+ t = ATOMtype(l->ttype);
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == nil &&
+ BATatoms[ATOMstorage(t)].atomCmp == cmp)
+ t = ATOMstorage(t);
+
+ switch (t) {
case TYPE_bte:
if (*(const bte *)c1 == bte_nil ||
*(const bte *)c2 == bte_nil ||
@@ -2178,6 +2192,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT
int lwidth, rlwidth, rhwidth;
const void *nil = ATOMnilptr(l->ttype);
int (*cmp)(const void *, const void *) = BATatoms[l->ttype].atomCmp;
+ int t;
const char *vl, *vrl, *vrh;
const oid *p;
oid lastr = 0;
@@ -2185,7 +2200,6 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT
oid lo, ro;
int c;
int lskipped = 0;
- int type = ATOMtype(l->ttype);
wrd loff = 0;
oid lval = oid_nil, rlval = oid_nil, rhval = oid_nil;
@@ -2197,8 +2211,6 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT
assert(sl == NULL || sl->tsorted);
assert(sr == NULL || sr->tsorted);
- if (cmp == BATatoms[ATOMstorage(l->ttype)].atomCmp)
- type = ATOMstorage(l->ttype);
ALGODEBUG fprintf(stderr, "#rangejoin(l=%s#" BUNFMT "[%s]%s%s,"
"rl=%s#" BUNFMT "[%s]%s%s,rh=%s#" BUNFMT "[%s]%s%s,"
"sl=%s#" BUNFMT "%s%s,sr=%s#" BUNFMT "%s%s)\n",
@@ -2254,6 +2266,12 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT
loff = (wrd) l->tseqbase - (wrd) l->hseqbase;
}
+ t = ATOMtype(l->ttype);
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == nil &&
+ BATatoms[ATOMstorage(t)].atomCmp == cmp)
+ t = ATOMstorage(t);
+
/* nested loop implementation for range join */
for (;;) {
if (lcand) {
@@ -2319,7 +2337,7 @@ rangejoin(BAT *r1, BAT *r2, BAT *l, BAT
}
ro = n++ + rl->hseqbase;
}
- switch (type) {
+ switch (t) {
case TYPE_bte:
if (*(const bte*)vrl == bte_nil ||
*(const bte*)vrh == bte_nil ||
diff --git a/gdk/gdk_qsort.c b/gdk/gdk_qsort.c
--- a/gdk/gdk_qsort.c
+++ b/gdk/gdk_qsort.c
@@ -314,7 +314,12 @@ GDKqsort(void *h, void *t, const void *b
if (base)
tpe = TYPE_str; /* we need the default case */
- switch (ATOMstorage(tpe)) {
+ if (tpe != ATOMstorage(tpe) &&
+ ATOMnilptr(ATOMstorage(tpe)) == ATOMnilptr(tpe) &&
+ BATatoms[ATOMstorage(tpe)].atomCmp == BATatoms[tpe].atomCmp)
+ tpe = ATOMstorage(tpe);
+
+ switch (tpe) {
case TYPE_bte:
GDKqsort_impl_bte(&buf, h, t, n);
break;
@@ -361,7 +366,12 @@ GDKqsort_rev(void *h, void *t, const voi
if (base)
tpe = TYPE_str; /* we need the default case */
- switch (ATOMstorage(tpe)) {
+ if (tpe != ATOMstorage(tpe) &&
+ ATOMnilptr(ATOMstorage(tpe)) == ATOMnilptr(tpe) &&
+ BATatoms[ATOMstorage(tpe)].atomCmp == BATatoms[tpe].atomCmp)
+ tpe = ATOMstorage(tpe);
+
+ switch (tpe) {
case TYPE_bte:
GDKqsort_impl_bte_rev(&buf, h, t, n);
break;
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -610,6 +610,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
#ifndef NDEBUG
int (*cmp)(const void *, const void *);
#endif
+ int t;
BUN p, q, cnt;
oid o, *dst;
/* off must be signed as it can be negative,
@@ -646,6 +647,12 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
dst = (oid *) Tloc(bn, BUNfirst(bn));
cnt = 0;
+ t = b->ttype;
+ if (t != ATOMstorage(t) &&
+ ATOMnilptr(ATOMstorage(t)) == ATOMnilptr(t) &&
+ BATatoms[ATOMstorage(t)].atomCmp == BATatoms[t].atomCmp)
+ t = ATOMstorage(t);
+
if (s && !BATtdense(s)) {
assert(s->tsorted);
@@ -661,7 +668,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
/* call type-specific core scan select function */
assert(b->batCapacity >= BATcount(b));
assert(s->batCapacity >= BATcount(s));
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
cnt = candscan_bte(scanargs);
break;
@@ -703,7 +710,7 @@ BAT_scanselect(BAT *b, BAT *s, BAT *bn,
}
candlist = NULL;
/* call type-specific core scan select function */
- switch (ATOMstorage(b->ttype)) {
+ switch (t) {
case TYPE_bte:
cnt = fullscan_bte(scanargs);
break;
diff --git a/gdk/gdk_setop.c b/gdk/gdk_setop.c
--- a/gdk/gdk_setop.c
+++ b/gdk/gdk_setop.c
@@ -172,42 +172,49 @@
(void) cmp; \
}
#define elim_doubles(a1) \
- switch (ATOMstorage(b->htype)) { \
- case TYPE_bte: \
- elim(a1,loc,_bte,simple_CMP(h,BUNhloc(bi,r),bte)); \
- break; \
- case TYPE_sht: \
- elim(a1,loc,_sht,simple_CMP(h,BUNhloc(bi,r),sht)); \
- break; \
- case TYPE_int: \
- elim(a1,loc,_int,simple_CMP(h,BUNhloc(bi,r),int)); \
- break; \
- case TYPE_flt: \
- elim(a1,loc,_flt,simple_CMP(h,BUNhloc(bi,r),flt)); \
- break; \
- case TYPE_dbl: \
- elim(a1,loc,_dbl,simple_CMP(h,BUNhloc(bi,r),dbl)); \
- break; \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list