Changeset: d390e699cbfd for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d390e699cbfd
Branch: default
Log Message:
Merge second head
diffs (truncated from 753 to 300 lines):
diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3674,7 +3674,7 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
if (oidxh != NULL) {
const oid *ords = (const oid *) oidxh->base +
ORDERIDXOFF;
BUN r;
- if (!bi.nonil) {
+ if (skipnil && !bi.nonil) {
MT_thread_setalgorithm(usepoidx ?
"binsearch on parent oidx" : "binsearch on oidx");
r = binsearch(ords, 0, bi.type, bi.base,
bi.vh ? bi.vh->base :
NULL,
@@ -3817,8 +3817,16 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
if (BATordered(b)) {
pos = bi.count - 1 + b->hseqbase;
+ if (skipnil && !bi.nonil &&
+ ATOMcmp(bi.type, BUNtail(bi, bi.count - 1),
+ ATOMnilptr(bi.type)) == 0)
+ pos = oid_nil; /* no non-nil values */
} else if (BATordered_rev(b)) {
pos = b->hseqbase;
+ if (skipnil && !bi.nonil &&
+ ATOMcmp(bi.type, BUNtail(bi, 0),
+ ATOMnilptr(bi.type)) == 0)
+ pos = oid_nil; /* no non-nil values */
} else {
if (BATcheckorderidx(b)) {
MT_lock_set(&b->batIdxLock);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1099,152 +1099,8 @@ BUNappendmulti(BAT *b, const void *value
return rc;
}
+ const void *t = b->ttype == TYPE_msk ? &(msk){false} :
ATOMnilptr(b->ttype);
MT_lock_set(&b->theaplock);
- if (count > BATcount(b) / gdk_unique_estimate_keep_fraction)
- b->tunique_est = 0;
-
- const void *t = b->ttype == TYPE_msk ? &(msk){false} :
ATOMnilptr(b->ttype);
- if (b->ttype == TYPE_oid) {
- /* spend extra effort on oid (possible candidate list) */
- if (values == NULL || is_oid_nil(((oid *) values)[0])) {
- b->tnil = true;
- b->tnonil = false;
- b->tsorted = false;
- b->trevsorted = false;
- b->tkey = false;
- b->tseqbase = oid_nil;
- } else {
- if (b->batCount == 0) {
- b->tsorted = true;
- b->trevsorted = true;
- b->tkey = true;
- b->tseqbase = count == 1 ? ((oid *) values)[0]
: oid_nil;
- b->tnil = false;
- b->tnonil = true;
- } else {
- if (!is_oid_nil(b->tseqbase) &&
- (count > 1 ||
- b->tseqbase + b->batCount != ((oid *)
values)[0]))
- b->tseqbase = oid_nil;
- if (b->tsorted && ((oid *)
b->theap->base)[b->batCount - 1] > ((oid *) values)[0]) {
- b->tsorted = false;
- if (b->tnosorted == 0)
- b->tnosorted = b->batCount;
- }
- if (b->trevsorted && ((oid *)
b->theap->base)[b->batCount - 1] < ((oid *) values)[0]) {
- b->trevsorted = false;
- if (b->tnorevsorted == 0)
- b->tnorevsorted = b->batCount;
- }
- if (b->tkey) {
- if (((oid *)
b->theap->base)[b->batCount - 1] == ((oid *) values)[0]) {
- b->tkey = false;
- if (b->tnokey[1] == 0) {
- b->tnokey[0] =
b->batCount - 1;
- b->tnokey[1] =
b->batCount;
- }
- } else if (!b->tsorted &&
!b->trevsorted)
- b->tkey = false;
- }
- }
- for (BUN i = 1; i < count; i++) {
- if (is_oid_nil(((oid *) values)[i])) {
- b->tnil = true;
- b->tnonil = false;
- b->tsorted = false;
- b->trevsorted = false;
- b->tkey = false;
- b->tseqbase = oid_nil;
- break;
- }
- if (((oid *) values)[i - 1] == ((oid *)
values)[i]) {
- b->tkey = false;
- if (b->tnokey[1] == 0) {
- b->tnokey[0] = b->batCount + i
- 1;
- b->tnokey[1] = b->batCount + i;
- }
- } else if (((oid *) values)[i - 1] > ((oid *)
values)[i]) {
- b->tsorted = false;
- if (b->tnosorted == 0)
- b->tnosorted = b->batCount + i;
- if (!b->trevsorted)
- b->tkey = false;
- } else {
- if (((oid *) values)[i - 1] + 1 !=
((oid *) values)[i])
- b->tseqbase = oid_nil;
- b->trevsorted = false;
- if (b->tnorevsorted == 0)
- b->tnorevsorted = b->batCount +
i;
- if (!b->tsorted)
- b->tkey = false;
- }
- }
- }
- } else if (!ATOMlinear(b->ttype)) {
- b->tnil = b->tnonil = false;
- b->tsorted = b->trevsorted = b->tkey = false;
- } else if (b->batCount == 0) {
- if (values == NULL) {
- b->tsorted = b->trevsorted = true;
- b->tkey = count == 1;
- b->tnil = true;
- b->tnonil = false;
- b->tunique_est = 1;
- } else {
- int c;
- b->tnil = b->tnonil = false;
- switch (count) {
- case 1:
- b->tsorted = b->trevsorted = b->tkey = true;
- b->tunique_est = 1;
- break;
- case 2:
- if (b->tvheap)
- c = ATOMcmp(b->ttype,
- ((void **) values)[0],
- ((void **) values)[1]);
- else
- c = ATOMcmp(b->ttype,
- values,
- (char *) values +
b->twidth);
- b->tsorted = c <= 0;
- b->tnosorted = !b->tsorted;
- b->trevsorted = c >= 0;
- b->tnorevsorted = !b->trevsorted;
- b->tkey = c != 0;
- b->tnokey[0] = 0;
- b->tnokey[1] = !b->tkey;
- b->tunique_est = (double) (1 + b->tkey);
- break;
- default:
- b->tsorted = b->trevsorted = b->tkey = false;
- break;
- }
- }
- } else if (b->batCount == 1 && count == 1) {
- BATiter bi = bat_iterator_nolock(b);
- if (values != NULL) {
- if (b->tvheap)
- t = ((void **) values)[0];
- else
- t = values;
- }
- int c = ATOMcmp(b->ttype, BUNtail(bi, 0), t);
- b->tsorted = c <= 0;
- b->tnosorted = !b->tsorted;
- b->trevsorted = c >= 0;
- b->tnorevsorted = !b->trevsorted;
- b->tkey = c != 0;
- b->tnokey[0] = 0;
- b->tnokey[1] = !b->tkey;
- b->tunique_est = (double) (1 + b->tkey);
- b->tnil |= values == NULL;
- b->tnonil = false;
- } else {
- b->tnil |= values == NULL;
- b->tnonil = false;
- b->tsorted = b->trevsorted = b->tkey = false;
- }
BATiter bi = bat_iterator_nolock(b);
MT_lock_unset(&b->theaplock);
MT_rwlock_wrlock(&b->thashlock);
@@ -1375,6 +1231,151 @@ BUNappendmulti(BAT *b, const void *value
nunique = b->thash ? b->thash->nunique : 0;
}
MT_lock_set(&b->theaplock);
+ if (count > BATcount(b) / gdk_unique_estimate_keep_fraction)
+ b->tunique_est = 0;
+
+ if (b->ttype == TYPE_oid) {
+ /* spend extra effort on oid (possible candidate list) */
+ if (values == NULL || is_oid_nil(((oid *) values)[0])) {
+ b->tnil = true;
+ b->tnonil = false;
+ b->tsorted = false;
+ b->trevsorted = false;
+ b->tkey = false;
+ b->tseqbase = oid_nil;
+ } else {
+ if (b->batCount == 0) {
+ b->tsorted = true;
+ b->trevsorted = true;
+ b->tkey = true;
+ b->tseqbase = count == 1 ? ((oid *) values)[0]
: oid_nil;
+ b->tnil = false;
+ b->tnonil = true;
+ } else {
+ if (!is_oid_nil(b->tseqbase) &&
+ (count > 1 ||
+ b->tseqbase + b->batCount != ((oid *)
values)[0]))
+ b->tseqbase = oid_nil;
+ if (b->tsorted && ((oid *)
b->theap->base)[b->batCount - 1] > ((oid *) values)[0]) {
+ b->tsorted = false;
+ if (b->tnosorted == 0)
+ b->tnosorted = b->batCount;
+ }
+ if (b->trevsorted && ((oid *)
b->theap->base)[b->batCount - 1] < ((oid *) values)[0]) {
+ b->trevsorted = false;
+ if (b->tnorevsorted == 0)
+ b->tnorevsorted = b->batCount;
+ }
+ if (b->tkey) {
+ if (((oid *)
b->theap->base)[b->batCount - 1] == ((oid *) values)[0]) {
+ b->tkey = false;
+ if (b->tnokey[1] == 0) {
+ b->tnokey[0] =
b->batCount - 1;
+ b->tnokey[1] =
b->batCount;
+ }
+ } else if (!b->tsorted &&
!b->trevsorted)
+ b->tkey = false;
+ }
+ }
+ for (BUN i = 1; i < count; i++) {
+ if (is_oid_nil(((oid *) values)[i])) {
+ b->tnil = true;
+ b->tnonil = false;
+ b->tsorted = false;
+ b->trevsorted = false;
+ b->tkey = false;
+ b->tseqbase = oid_nil;
+ break;
+ }
+ if (((oid *) values)[i - 1] == ((oid *)
values)[i]) {
+ b->tkey = false;
+ if (b->tnokey[1] == 0) {
+ b->tnokey[0] = b->batCount + i
- 1;
+ b->tnokey[1] = b->batCount + i;
+ }
+ } else if (((oid *) values)[i - 1] > ((oid *)
values)[i]) {
+ b->tsorted = false;
+ if (b->tnosorted == 0)
+ b->tnosorted = b->batCount + i;
+ if (!b->trevsorted)
+ b->tkey = false;
+ } else {
+ if (((oid *) values)[i - 1] + 1 !=
((oid *) values)[i])
+ b->tseqbase = oid_nil;
+ b->trevsorted = false;
+ if (b->tnorevsorted == 0)
+ b->tnorevsorted = b->batCount +
i;
+ if (!b->tsorted)
+ b->tkey = false;
+ }
+ }
+ }
+ } else if (!ATOMlinear(b->ttype)) {
+ b->tnil = b->tnonil = false;
+ b->tsorted = b->trevsorted = b->tkey = false;
+ } else if (b->batCount == 0) {
+ if (values == NULL) {
+ b->tsorted = b->trevsorted = true;
+ b->tkey = count == 1;
+ b->tnil = true;
+ b->tnonil = false;
+ b->tunique_est = 1;
+ } else {
+ int c;
+ b->tnil = b->tnonil = false;
+ switch (count) {
+ case 1:
+ b->tsorted = b->trevsorted = b->tkey = true;
+ b->tunique_est = 1;
+ break;
+ case 2:
+ if (b->tvheap)
+ c = ATOMcmp(b->ttype,
+ ((void **) values)[0],
+ ((void **) values)[1]);
+ else
+ c = ATOMcmp(b->ttype,
+ values,
+ (char *) values +
b->twidth);
+ b->tsorted = c <= 0;
+ b->tnosorted = !b->tsorted;
+ b->trevsorted = c >= 0;
+ b->tnorevsorted = !b->trevsorted;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]