📄 radix.c
字号:
intM4_RDX_phash_join_h(BAT **res, BAT *l, BAT *r, int *radix, bit *cutoff){ if (l && r) { int hitrate = 1; return M4_RDX_phash_join(res, l, r, radix, &hitrate, cutoff); } else { return GDK_FAIL; }}intM4_RDX_phash_join_hc(BAT **res, BAT *l, BAT *r, int *radix){ if (l && r) { int hitrate = 1; bit cutoff = r->hkey; return M4_RDX_phash_join(res, l, r, radix, &hitrate, &cutoff); } else { return GDK_FAIL; }}intM4_RDX_phash_join_xh(BAT **res, BAT *l, BAT *r, bit *cutoff){ int rblt, rbrh; if (l && r && M4_RDX_radix_bits(&rblt, BATmirror(l)) == GDK_SUCCEED && M4_RDX_radix_bits(&rbrh, r) == GDK_SUCCEED) { int radix = MIN(rblt, rbrh); int hitrate = 1; return M4_RDX_phash_join(res, l, r, &radix, &hitrate, cutoff); } else { return GDK_FAIL; }}intM4_RDX_phash_join_xhc(BAT **res, BAT *l, BAT *r){ int rblt, rbrh; if (l && r && M4_RDX_radix_bits(&rblt, BATmirror(l)) == GDK_SUCCEED && M4_RDX_radix_bits(&rbrh, r) == GDK_SUCCEED) { int radix = MIN(rblt, rbrh); int hitrate = 1; bit cutoff = r->hkey; return M4_RDX_phash_join(res, l, r, &radix, &hitrate, &cutoff); } else { return GDK_FAIL; }}#line 2842 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx"intM4_RDX_radix_join(BAT **res, BAT *l, BAT *r, int *radix, int *hitrate){ size_t estimate = MIN(BATcount(r), BATcount(l)) * (*hitrate); BUN r_end, l_cur = BUNfirst(l), l_last = BUNlast(l); BUN l_end, r_cur = BUNfirst(r), r_last = BUNlast(r); int xx = BUNsize(l), yy = BUNsize(r); size_t rd = (1 << *radix) - 1; int any = ATOMstorage(l->ttype); ptr nil = ATOMnilptr(any); BAT *bn; if (*radix != (BATtordered(l) >> 1)) { GDKerror("radix_join: tail of %s is radix clustered on %d bits.\n", BATgetId(l), BATtordered(l) >> 1); return GDK_FAIL; } if (*radix != (BAThordered(r) >> 1)) { GDKerror("radix_join: head of %s is radix clustered on %d bits.\n", BATgetId(r), BAThordered(r) >> 1); return GDK_FAIL; } /* set properties on result bat; so we can return in any moment */ bn = *res = BATnew(HTYPE(l), TTYPE(r), estimate); if (bn == NULL) return GDK_FAIL; bn->hsorted = BAThordered(l); bn->tsorted = 0; if (l->hkey && r->hkey) BATkey(bn, TRUE); if (r->tkey && l->tkey) BATkey(BATmirror(bn), TRUE); if (BATcount(r) == 0) return GDK_SUCCEED;#line 2894 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" if (ATOMstorage(l->htype) == TYPE_int && ATOMstorage(r->ttype) == TYPE_int) { int *_dst = (int *) (bn->batBuns->base + bn->batBuns->free); int *_end = (int *) (bn->batBuns->base + bn->batBuns->size); if (l->ttype == TYPE_oid) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = oid_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = oid_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (oid_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = oid_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = oid_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, oid)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), oid)) { intfastINSERT(bn, BUNhloc(l,l_cur), BUNtloc(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2901 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else if (any == TYPE_int || any == TYPE_flt) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = int_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = int_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (int_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = int_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = int_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, int)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), int)) { intfastINSERT(bn, BUNhloc(l,l_cur), BUNtloc(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2903 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else if (any == TYPE_lng || any == TYPE_dbl) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = lng_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = lng_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (lng_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = lng_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = lng_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, lng)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), lng)) { intfastINSERT(bn, BUNhloc(l,l_cur), BUNtloc(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2905 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = any_RADIX(BUNhead(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = any_RADIX(BUNtail(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (any_RADIX(BUNtail(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = any_RADIX(BUNhead(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = any_RADIX(BUNhead(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtail(l,l_cur); if (!atom_EQ(p, nil, any)) while (r_var < r_end) { if (atom_EQ(p, BUNhead(r,r_var), any)) { intfastINSERT(bn, BUNhloc(l,l_cur), BUNtloc(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2907 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } bn->batBuns->free = ((BUN) _dst) - bn->batBuns->base; BATsetcount(bn, bn->batBuns->free/BUNsize(bn)); } else { if (l->ttype == TYPE_oid) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = oid_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = oid_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (oid_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = oid_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = oid_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, oid)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), oid)) { bunfastINSERT(bn, BUNhead(l,l_cur), BUNtail(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2913 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else if (any == TYPE_int || any == TYPE_flt) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = int_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = int_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (int_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = int_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = int_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, int)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), int)) { bunfastINSERT(bn, BUNhead(l,l_cur), BUNtail(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2915 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else if (any == TYPE_lng || any == TYPE_dbl) { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = lng_RADIX(BUNhloc(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = lng_RADIX(BUNtloc(l,l_cur),rd); for(l_end=l_cur+xx; l_end < l_last; l_end += xx) { if (lng_RADIX(BUNtloc(l,l_end),rd) != x) break; } /* find matching r */ while (y < x) { if ((r_cur += yy) >= r_last) return GDK_SUCCEED; y = lng_RADIX(BUNhloc(r,r_cur),rd); } if (x == y) { /* radix hits found */ /* find r range */ for (r_end=r_cur+yy; r_end < r_last; r_end += yy) { y = lng_RADIX(BUNhloc(r,r_end),rd); if (y != x) break; } /* filter the radix hits; L1 gushes with oil */ while (l_cur < l_end) { BUN r_var = r_cur; ptr p = BUNtloc(l,l_cur); if (!simple_EQ(p, nil, lng)) while (r_var < r_end) { if (simple_EQ(p, BUNhloc(r,r_var), lng)) { bunfastINSERT(bn, BUNhead(l,l_cur), BUNtail(r,r_var), l, l_cur, r, r_var); } r_var += yy; } l_cur += xx; } r_cur = r_end; } l_cur = l_end; }#line 2917 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" } else { #line 2949 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/radix.mx" hash_t y = any_RADIX(BUNhead(r,r_cur),rd); /* merge join on radix number */ while(l_cur < l_last) { /* find l range */ hash_t x = any_RADIX(BUNtail(l,l_cur),rd); for(l_end=l_cur+xx; l_end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -