Changeset: 7d58e725c06a for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d58e725c06a Modified Files: geom/monetdb5/grid.c geom/sql/Tests/grid.sql geom/sql/Tests/grid.stable.out Branch: grid Log Message:
2D grid produces correct results diffs (truncated from 697 to 300 lines): diff --git a/geom/monetdb5/grid.c b/geom/monetdb5/grid.c --- a/geom/monetdb5/grid.c +++ b/geom/monetdb5/grid.c @@ -35,24 +35,24 @@ do { max = res + add; \ } while (0) -#define GRIDextend(g1, g2, cellR, cellS, r1, r2, msg) \ -do { \ -/* make space to cater for the worst case where all points qualify */ \ -BUN maxSize = BATcount((r1)) + \ - ((g1)->dir[(cellR)+1]-(g1)->dir[(cellR)])* \ - ((g2)->dir[(cellS)+1]-(g2)->dir[(cellS)]); \ - if (maxSize > GDK_oid_max) { \ - (msg) = createException(MAL,"grid.distance","overflow of head value"); \ - goto distancejoin_fail; \ - } \ - while (maxSize > BATcapacity((r1))) { \ - if ((BATextend((r1), BATgrows((r1))) != GDK_SUCCEED) || \ - (BATextend((r2), BATgrows((r2))) != GDK_SUCCEED)) { \ - (msg) = createException(MAL, "grid.distance", \ - "could not extend BATs for storing the join results"); \ - goto distancejoin_fail; \ - } \ - } \ +#define GRIDextend(g1, g2, cellR, cellS, r1, r2, msg) \ +do { \ +/* make space to cater for the worst case where all points qualify */ \ +BUN maxSize = BATcount((r1)) + \ + ((g1)->dir[(cellR)+1]-(g1)->dir[(cellR)])* \ + ((g2)->dir[(cellS)+1]-(g2)->dir[(cellS)]); \ + if (maxSize > GDK_oid_max) { \ + (msg) = createException(MAL,"grid.distance","overflow of head value");\ + goto distancejoin_fail; \ + } \ + while (maxSize > BATcapacity((r1))) { \ + if ((BATextend((r1), BATgrows((r1))) != GDK_SUCCEED) || \ + (BATextend((r2), BATgrows((r2))) != GDK_SUCCEED)) { \ + (msg) = createException(MAL, "grid.distance", \ + "could not extend BATs for storing the join results"); \ + goto distancejoin_fail; \ + } \ + } \ } while (0) #define GRIDdist(r1Vals, oid1, seq1, r1b, x1v, y1v, \ @@ -82,12 +82,13 @@ do { m = (g1)->dir[(cellR)]; \ if (GRIDcount(g1, cellR) > 16) { \ /* compare points of R in cellR with points of S in cellS */ \ - for (m = (g1)->dir[(cellR)]; m < (g1)->dir[(cellR)+1]-16; m+=16) { \ + for (; m < (g1)->dir[(cellR)+1]-16; m+=16) { \ for (oid n = (g2)->dir[(cellS)]; n < (g2)->dir[(cellS)+1]; n++) { \ - oid oid2 = n; \ + oid oid2 = (g2)->oids[n]; \ lng x2v = (x2Vals)[oid2]; \ lng y2v = (y2Vals)[oid2]; \ - for(oid oid1 = m; oid1 < m+16; oid1++) { \ + for(oid o1 = m; o1 < m+16; o1++) { \ + oid oid1 = (g1)->oids[o1]; \ lng x1v = (x1Vals)[oid1]; \ lng y1v = (y1Vals)[oid1]; \ GRIDdist(r1Vals, oid1, seq1, r1b, x1v, y1v, \ @@ -97,11 +98,11 @@ do { } \ } \ for (; m < (g1)->dir[(cellR)+1]; m++) { \ - oid oid1 = m; \ + oid oid1 = (g1)->oids[m]; \ lng x1v = (x1Vals)[oid1]; \ lng y1v = (y1Vals)[oid1]; \ for (oid n = (g2)->dir[(cellS)]; n < (g2)->dir[(cellS)+1]; n++) { \ - oid oid2 = n; \ + oid oid2 = (g2)->oids[n]; \ lng x2v = (x2Vals)[oid2]; \ lng y2v = (y2Vals)[oid2]; \ GRIDdist(r1Vals, oid1, seq1, r1b, x1v, y1v, \ @@ -144,7 +145,6 @@ countSetBits(uint64_t *resBitvector, siz return num; } - #if 0 static void grid_print(Grid * g) @@ -183,6 +183,17 @@ grid_print(Grid * g) for (size_t i = 0; i < g->cellsX; i++) fprintf(stderr, "%*zu|", m, i); fprintf(stderr, "\n"); + + fprintf(stderr, "- Directory\n["); + for (size_t i = 0; i <= g->cellsNum; i++) + fprintf(stderr, "%zu,",g->dir[i]); + fprintf(stderr, "\r]\n"); + fprintf(stderr, "- Directory\n"); + for (size_t i = 0; i < g->cellsNum; i++) + if (g->dir[i] != g->dir[i+1]) + fprintf(stderr, "[%zu] %zu,", i, g->dir[i]); + fprintf(stderr, "\r\n"); + fprintf(stderr, "- OIDs\n["); for (size_t i = 0; i < g->dir[g->cellsNum]; i++) { fprintf(stderr, "%zu,", g->oids[i]); @@ -406,6 +417,11 @@ grid_create_mbr(Grid * g, BAT *bx, BAT * g->cellsPerAxis = 0; +#if 0 +#ifndef NDEBUG + grid_print(g); +#endif +#endif return MAL_SUCCEED; } @@ -910,11 +926,11 @@ GRIDdistancesubjoin(bat *res1, bat * res size_t R[] = {min, min, min, min, min+1, min+g1->cellsX, min+g1->cellsX+1}; size_t S[] = {min+g1->cellsX, min+g1->cellsX+1, min+1, min, min, min, min }; for (size_t k = 0; k < 7; k++) { - if (GRIDcount(g1,R[k]) > GRIDcount(g2,S[k])) { +// if (GRIDcount(g1,R[k]) > GRIDcount(g2,S[k])) { GRIDcmp(x1Vals, y1Vals, g1, x2Vals, y2Vals, g2, R[k], S[k], r1, r2, seq1, seq2, msg); - } else { - GRIDcmp(x2Vals, y2Vals, g2, x1Vals, y1Vals, g1, S[k], R[k], r2, r1, seq2, seq1, msg); - } +// } else { +// GRIDcmp(x2Vals, y2Vals, g2, x1Vals, y1Vals, g1, S[k], R[k], r2, r1, seq2, seq1, msg); +// } } } } diff --git a/geom/sql/Tests/grid.sql b/geom/sql/Tests/grid.sql --- a/geom/sql/Tests/grid.sql +++ b/geom/sql/Tests/grid.sql @@ -10,10 +10,28 @@ SELECT * FROM points1 p1 WHERE [p1.x, p1 SELECT * FROM points2 p2 WHERE [p2.x, p2.y] distance [150,150, 5] ORDER BY p2.x, p2.y; -- join -SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 1] ORDER BY p1.x, p1.y; -SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,1.5] ORDER BY p1.x, p1.y; -SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 31] ORDER BY p1.x, p1.y; -SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,500] ORDER BY p1.x, p1.y; +SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 1] ORDER BY p1.x, p1.y, p2.x, p2.y; +SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,1.5] ORDER BY p1.x, p1.y, p2.x, p2.y; +SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 31] ORDER BY p1.x, p1.y, p2.x, p2.y; +SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,500] ORDER BY p1.x, p1.y, p2.x, p2.y; + +INSERT INTO points1 VALUES ( 95,95), ( 95, 96), ( 96, 96), ( 97, 97), ( 98, 97); +INSERT INTO points1 VALUES ( 95,99), ( 99,102), (101,100), (102,100), (101,101); +INSERT INTO points1 VALUES (101,99), (100, 97), (102, 99), (103, 99), (101,102); +INSERT INTO points1 VALUES (103,98), (103, 96), (101,103), (101, 99), (102,102); + +INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); + +-- expecting 21*21 results +SELECT COUNT(*) FROM points1 p1 WHERE [p1.x, p1.y] distance [100, 100, 15]; +SELECT COUNT(*) FROM points2 p2 WHERE [p2.x, p2.y] distance [100, 100, 15]; +SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 15] ORDER BY p1.x, p1.y, p2.x, p2.y; +SELECT COUNT(*) FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 15]; +SELECT COUNT(*) FROM points1 p1, points2 p2 WHERE (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) <= 15*15; + DROP TABLE points1; DROP TABLE points2; diff --git a/geom/sql/Tests/grid.stable.out b/geom/sql/Tests/grid.stable.out --- a/geom/sql/Tests/grid.stable.out +++ b/geom/sql/Tests/grid.stable.out @@ -112,27 +112,516 @@ Ready. [ 100, 100, 99, 101 ] [ 100, 150, 101, 180 ] [ 150, 150, 149, 149 ] -#SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,500] ORDER BY p1.x, p1.y; +[ 150, 150, 149, 151 ] +#SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y,500] ORDER BY p1.x, p1.y, p2.x, p2.y; % sys.p1, sys.p1, sys.p2, sys.p2 # table_name % x, y, x, y # name % bigint, bigint, bigint, bigint # type % 3, 3, 3, 3 # length [ 100, 100, 99, 101 ] -[ 100, 100, 149, 151 ] [ 100, 100, 101, 180 ] [ 100, 100, 149, 149 ] +[ 100, 100, 149, 151 ] +[ 100, 150, 99, 101 ] +[ 100, 150, 101, 180 ] +[ 100, 150, 149, 149 ] [ 100, 150, 149, 151 ] -[ 100, 150, 99, 101 ] -[ 100, 150, 149, 149 ] -[ 100, 150, 101, 180 ] +[ 150, 100, 99, 101 ] +[ 150, 100, 101, 180 ] +[ 150, 100, 149, 149 ] [ 150, 100, 149, 151 ] -[ 150, 100, 99, 101 ] -[ 150, 100, 149, 149 ] -[ 150, 100, 101, 180 ] -[ 150, 150, 149, 151 ] +[ 150, 150, 99, 101 ] [ 150, 150, 101, 180 ] [ 150, 150, 149, 149 ] -[ 150, 150, 99, 101 ] +[ 150, 150, 149, 151 ] +#INSERT INTO points1 VALUES ( 95,95), ( 95, 96), ( 96, 96), ( 97, 97), ( 98, 97); +[ 5 ] +#INSERT INTO points1 VALUES ( 95,99), ( 99,102), (101,100), (102,100), (101,101); +[ 5 ] +#INSERT INTO points1 VALUES (101,99), (100, 97), (102, 99), (103, 99), (101,102); +[ 5 ] +#INSERT INTO points1 VALUES (103,98), (103, 96), (101,103), (101, 99), (102,102); +[ 5 ] +#INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +[ 5 ] +#INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +[ 5 ] +#INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +[ 5 ] +#INSERT INTO points2 VALUES ( 99,99), (101, 97), (103, 98), (102, 97), (102,102); +[ 5 ] +#SELECT COUNT(*) FROM points1 p1 WHERE [p1.x, p1.y] distance [100, 100, 15]; +% sys.L1 # table_name +% L1 # name +% wrd # type +% 2 # length +[ 21 ] +#SELECT COUNT(*) FROM points2 p2 WHERE [p2.x, p2.y] distance [100, 100, 15]; +% sys.L1 # table_name +% L1 # name +% wrd # type +% 2 # length +[ 21 ] +#SELECT * FROM points1 p1, points2 p2 WHERE [p1.x, p1.y] distance [p2.x, p2.y, 15] ORDER BY p1.x, p1.y, p2.x, p2.y; +% sys.p1, sys.p1, sys.p2, sys.p2 # table_name +% x, y, x, y # name +% bigint, bigint, bigint, bigint # type +% 3, 3, 3, 3 # length +[ 95, 95, 99, 99 ] +[ 95, 95, 99, 99 ] +[ 95, 95, 99, 99 ] +[ 95, 95, 99, 99 ] +[ 95, 95, 99, 101 ] +[ 95, 95, 101, 97 ] +[ 95, 95, 101, 97 ] +[ 95, 95, 101, 97 ] +[ 95, 95, 101, 97 ] +[ 95, 95, 102, 97 ] +[ 95, 95, 102, 97 ] +[ 95, 95, 102, 97 ] +[ 95, 95, 102, 97 ] +[ 95, 95, 102, 102 ] +[ 95, 95, 102, 102 ] +[ 95, 95, 102, 102 ] +[ 95, 95, 102, 102 ] +[ 95, 95, 103, 98 ] +[ 95, 95, 103, 98 ] +[ 95, 95, 103, 98 ] +[ 95, 95, 103, 98 ] +[ 95, 96, 99, 99 ] +[ 95, 96, 99, 99 ] +[ 95, 96, 99, 99 ] +[ 95, 96, 99, 99 ] +[ 95, 96, 99, 101 ] +[ 95, 96, 101, 97 ] +[ 95, 96, 101, 97 ] +[ 95, 96, 101, 97 ] +[ 95, 96, 101, 97 ] +[ 95, 96, 102, 97 ] +[ 95, 96, 102, 97 ] +[ 95, 96, 102, 97 ] +[ 95, 96, 102, 97 ] +[ 95, 96, 102, 102 ] +[ 95, 96, 102, 102 ] +[ 95, 96, 102, 102 ] +[ 95, 96, 102, 102 ] +[ 95, 96, 103, 98 ] +[ 95, 96, 103, 98 ] +[ 95, 96, 103, 98 ] +[ 95, 96, 103, 98 ] +[ 95, 99, 99, 99 ] +[ 95, 99, 99, 99 ] +[ 95, 99, 99, 99 ] +[ 95, 99, 99, 99 ] +[ 95, 99, 99, 101 ] +[ 95, 99, 101, 97 ] +[ 95, 99, 101, 97 ] +[ 95, 99, 101, 97 ] +[ 95, 99, 101, 97 ] +[ 95, 99, 102, 97 ] +[ 95, 99, 102, 97 ] +[ 95, 99, 102, 97 ] +[ 95, 99, 102, 97 ] +[ 95, 99, 102, 102 ] +[ 95, 99, 102, 102 ] +[ 95, 99, 102, 102 ] +[ 95, 99, 102, 102 ] +[ 95, 99, 103, 98 ] +[ 95, 99, 103, 98 ] _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list