#This file is part of SECONDO. # #Copyright (C) 2004, University in Hagen, Department of Computer Science, #Database Systems for New Applications. # #SECONDO is free software; you can redistribute it and/or modify #it under the terms of the GNU General Public License as published by #the Free Software Foundation; either version 2 of the License, or #(at your option) any later version. # #SECONDO is distributed in the hope that it will be useful, #but WITHOUT ANY WARRANTY; without even the implied warranty of #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #GNU General Public License for more details. # #You should have received a copy of the GNU General Public License #along with SECONDO; if not, write to the Free Software #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # a test for the spatial algebra # run with : TestRunner -c SecondoConfig.ini < spatial.test # clean up what may be left over from e.g. a segfault delete database spatialtest; #setup create database spatialtest; open database spatialtest; create pointrel: rel(tuple([No: int, P: point])); update pointrel := [const rel(tuple([No: int, P: point])) value ( (1 undefined) (2 (0.0 0.0)) (3 (0.0 0.25)) (4 (0.0 0.5)) (5 (0.0 0.75)) (6 (0.0 1.0)) (7 (0.25 0.0)) (8 (0.25 0.25)) (9 (0.25 0.5)) (10 (0.25 0.75)) (11 (0.25 1.0)) (12 (0.5 0.0)) (13 (0.5 0.25)) (14 (0.5 0.5)) (15 (0.5 0.75)) (16 (0.5 1.0)) (17 (0.75 0.0)) (18 (0.75 0.25)) (19 (0.75 0.5)) (20 (0.75 0.75)) (21 (0.75 1.0)) (22 (1.0 0.0)) (23 (1.0 0.25)) (24 (1.0 0.5)) (25 (1.0 0.75)) (26 (1.0 1.0)) )]; create pointsrel: rel(tuple([No: int, Ps: points])); update pointsrel := [const rel(tuple([No: int, Ps: points])) value ( (1 ()) (2 ((0 0))) (3 ((1 1))) (4 ((0 0) (0 1) (1 0) (1 1))) (5 ((0 0) (1 0))) (6 ((0 1) (1 1))) (7 ((0.3 0.5)(0.25 0.75))) (8 ((0.3333333333333333 0.5)(0.25 0.7784)(0.5540816326530610 0.4887755102040820))) )]; create linerel: rel(tuple([No: int, L: line])); update linerel := [const rel(tuple([No: int, L: line])) value ( (1 ()) (2 ((0.0 0.0 0.25 0.5) (0.25 0.5 0.5 0.5) (0.5 0.5 0.5 0.25) (0.5 0.25 0.75 0.5) (0.75 0.5 0.5 0.75) (0.5 0.75 1.0 1.0))) (3 ((0.0 1.0 0.25 0.75) (0.25 0.75 0.5 0.0) (0.5 0.0 0.75 0.25) (0.75 0.25 1.0 0.0))) (4 ((0.0 0.25 0.0 0.75) (0.0 0.75 0.25 0.75) (0.25 0.75 0.25 1.0))) (5 ((1.0 0.25 1.0 0.5) (1.0 0.5 0.75 0.5) (0.75 0.5 0.75 0.75) (0.75 0.75 1.0 0.75) (1.0 0.75 1.0 1.0))) (6 ((0.3 0.5 0.5 0.5) (0.5 0.5 0.5 0.3) (0.5 0.75 1.0 1.0))) (7 ((0.0 0.0 0.25 0.5) (0.25 0.5 0.5 0.5) (0.5 0.5 0.5 0.25) (0.5 0.25 0.75 0.5) (0.75 0.5 0.5 0.75) (0.5 0.75 1.0 1.0) (0.5 0.75 0.25 1.0) (0.25 1.0 0.0 1.0) (0.75 0.5 1.0 0.5) (0.25 0.0 0.75 0.0) (0.75 0.0 0.75 0.25) (0.75 0.25 1.0 0.25))) )]; create regionrel: rel(tuple([No: int, R: region])); update regionrel := [const rel(tuple([No: int, R: region])) value ( (1 ()) (2 ((((0.44530005310674453 0.9218761854184053) (0.25 0.80) (0.25 0.75) (0.4203683332068887 0.7586867460738942) (0.37277141339807296 0.7020237463014946) (0.45889917305212047 0.624962066611031) (0.6538198922691754 0.7224224262195584) (0.5948903725058797 0.8674797056369016) (0.6764850921781352 0.9672065852363251) (0.4974300128973522 0.8697462256277976))))) (3 ((((0.04081632653061224 0.1683673469387755) (0.10204081632653061 0.42857142857142855) (0.3469387755102041 0.34183673469387754) (0.20408163265306123 0.24489795918367346) (0.30612244897959184 0.15816326530612246) (0.1377551020408163 0.05612244897959184))))) (4 ((((0.6224489795918368 0.5051020408163265) (0.6887755102040817 0.6530612244897959) (0.923469387755102 0.6071428571428571) (0.9540816326530612 0.39285714285714285) (0.8316326530612245 0.3163265306122449) (0.9387755102040817 0.14285714285714285) (0.8010204081632653 0.07653061224489796) (0.5561224489795918 0.17857142857142858) (0.6938775510204082 0.3010204081632653) (0.5663265306122449 0.42346938775510207) (0.5357142857142857 0.5867346938775511))))) (5 ((((0.10204081632653061 0.6428571428571429) (0.19387755102040816 0.9081632653061225) (0.5255102040816326 0.8316326530612245) (0.826530612244898 0.8520408163265306) (0.7142857142857143 0.7040816326530612) (0.9387755102040817 0.6377551020408163) (0.8010204081632653 0.4744897959183674) (0.9336734693877551 0.2755102040816326) (0.6479591836734694 0.061224489795918366) (0.6173469387755102 0.3010204081632653) (0.3877551020408163 0.12244897959183673) (0.3112244897959184 0.23469387755102042) (0.2193877551020408 0.061224489795918366) (0.0 0.11734693877551021) (0.15306122448979592 0.17346938775510204) (0.04591836734693878 0.34183673469387754) (0.3163265306122449 0.37244897959183676) (0.2857142857142857 0.5561224489795918) (0.1326530612244898 0.39285714285714285))))) (6 ((((0.061224489795918366 0.7959183673469388) (0.413265306122449 0.9438775510204082) (0.3979591836734694 0.6224489795918368) (0.9591836734693877 0.7295918367346939) (0.7602040816326531 0.32653061224489793) (0.9744897959183674 0.45918367346938777) (0.7755102040816326 0.05612244897959184) (0.413265306122449 0.061224489795918366) (0.6632653061224489 0.20918367346938777) (0.6326530612244898 0.4744897959183674) (0.3469387755102041 0.08673469387755102) (0.04081632653061224 0.25510204081632654) (0.336734693877551 0.3469387755102041) (0.04081632653061224 0.5969387755102041) (0.20408163265306123 0.673469387755102))))) (7 ((((0.10204081632653061 0.42857142857142855) (0.3469387755102041 0.34183673469387754) (0.4372771413398073 0.43943934451103867) (0.4989188984143843 0.40387679235262886) (0.5540816326530610 0.4887755102040820) (0.3803770578863515 0.5603520218496321) (0.4416736211213110 0.6403744025491240) (0.3899969653288820 0.6866114103634020) (0.15514756088308929 0.6030270844397239) (0.0 0.6670396783248616) (0.0 0.5484978377968288) (0.1907101130414991 0.5010811015856157))))) (8 ((((0.0 0.0) (1.0 0.0) (1.0 1.0) (0.0 1.0))))) )]; #testcase isempty_p #yields (int 1) query pointrel feed filter[isempty(.P)] count; #testcase isempty_ps #yields (int 1) query pointsrel feed filter[isempty(.Ps)] count; #testcase isempty_l #yields (int 1) query linerel feed filter[isempty(.L)] count; #testcase isempty_r #yields (int 1) query regionrel feed filter[isempty(.R)] count; #testcase equal_pp #yields (bool TRUE) query pointrel feed {a} pointrel feed {b} symmjoin[.P_a = ..P_b] count = pointrel count - 1; #testcase equal_psps #yields (bool TRUE) query pointsrel feed {a} pointsrel feed {b} symmjoin[.Ps_a = ..Ps_b] count = pointsrel count; #testcase equal_ll #yields (bool TRUE) query linerel feed {a} linerel feed {b} symmjoin[.L_a = ..L_b] count = linerel count; #testcase equal_rr #yields (bool TRUE) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a = ..R_b] count = regionrel count; #testcase notequal_pp #yields (bool TRUE) query pointrel feed {a} pointrel feed {b} symmjoin[.P_a # ..P_b] count = pointrel feed {a} pointrel feed {b} product filter[(not (isempty(.P_a))) and (not (isempty(.P_b)))] count - pointrel feed {a} pointrel feed {b} symmjoin[.P_a = ..P_b] count; #testcase notequal_psps #yields (bool TRUE) query pointsrel feed {a} pointsrel feed {b} symmjoin[.Ps_a # ..Ps_b] count = pointsrel feed {a} pointsrel feed {b} product count - pointsrel feed {a} pointsrel feed {b} symmjoin[.Ps_a = ..Ps_b] count; #testcase notequal_ll #yields (bool TRUE) query linerel feed {a} linerel feed {b} symmjoin[.L_a # ..L_b] count = linerel feed {a} linerel feed {b} product count - linerel feed {a} linerel feed {b} symmjoin[.L_a = ..L_b] count; #testcase notequal_rr #yields (bool TRUE) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a # ..R_b] count = regionrel feed {a} regionrel feed {b} product count - regionrel feed {a} regionrel feed {b} symmjoin[.R_a = ..R_b] count; #testcase intersects1_psps #yields (int 19) query pointsrel feed {a} pointsrel feed {b} symmjoin[.Ps_a intersects1 ..Ps_b] count; #testcase intersects1_psl #yields (int 29) query pointsrel feed {a} linerel feed {b} symmjoin[.Ps_a intersects1 ..L_b] count; #testcase intersects1_lps #yields (int 29) query linerel feed {a} pointsrel feed {b} symmjoin[.L_a intersects1 ..Ps_b] count; #testcase intersects1_psr #yields (int 16) query pointsrel feed {a} regionrel feed {b} symmjoin[.Ps_a intersects1 ..R_b] count; #testcase intersects1_rps #yields (int 16) query regionrel feed {a} pointsrel feed {b} symmjoin[.R_a intersects1 ..Ps_b] count; #testcase intersects1_ll #yields (int 28) query linerel feed {a} linerel feed {b} symmjoin[.L_a intersects1 ..L_b] count; #testcase intersects1_lr #yields (int 34) query linerel feed {a} regionrel feed {b} symmjoin[.L_a intersects1 ..R_b] count; #testcase intersects1_rl #yields (int 34) query regionrel feed {a} linerel feed {b} symmjoin[.R_a intersects1 ..L_b] count; #testcase intersects1_rr #yields (int 43) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a intersects1 ..R_b] count; #testcase inside_pps #yields (int 11) query pointrel feed {a} pointsrel feed {b} symmjoin[.P_a inside ..Ps_b] count; #testcase inside_pl #yields (int 41) query pointrel feed {a} linerel feed {b} symmjoin[.P_a inside ..L_b] count; #testcase inside_pr #yields (int 44) query pointrel feed {a} regionrel feed {b} symmjoin[.P_a inside ..R_b] count; #testcase inside_psps #yields (int 14) query pointsrel feed {a} pointsrel feed {b} symmjoin[.Ps_a inside ..Ps_b] count; #testcase inside_psl #yields (int 14) query pointsrel feed {a} linerel feed {b} symmjoin[.Ps_a inside ..L_b] count; #testcase inside_lps #yields error query linerel feed {a} pointsrel feed {b} symmjoin[.L_a inside ..Ps_b] count; #testcase inside_psr #yields (int 19) query pointsrel feed {a} regionrel feed {b} symmjoin[.Ps_a inside ..R_b] count; #testcase inside_rps #yields error query regionrel feed {a} pointsrel feed {b} symmjoin[.R_a inside ..Ps_b] count; #testcase inside_ll #yields (int 16) query linerel feed {a} linerel feed {b} symmjoin[.L_a inside ..L_b] count; #testcase inside_lr #yields (int 14) query linerel feed {a} regionrel feed {b} symmjoin[.L_a inside ..R_b] count; #testcase inside_rl #yields error query regionrel feed {a} linerel feed {b} symmjoin[.R_a inside ..L_b] count; #testcase inside_rr #yields (int 21) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a inside ..R_b] count; #testcase adjacent_psr #yields (int 8) query pointsrel feed {a} regionrel feed {b} symmjoin[.Ps_a adjacent ..R_b] count; #testcase adjacent_rps #yields (int 8) query regionrel feed {a} pointsrel feed {b} symmjoin[.R_a adjacent ..Ps_b] count; #testcase adjacent_lr #yields (int 3) query linerel feed {a} regionrel feed {b} symmjoin[.L_a adjacent ..R_b] count; #testcase adjacent_rl #yields (int 3) query regionrel feed {a} linerel feed {b} symmjoin[.R_a adjacent ..L_b] count; #testcase adjacent_rr #yields (int 6) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a adjacent ..R_b] count; #testcase overlaps_rr #yields (int 37) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a overlaps ..R_b] count; #testcase overlaps_rr2 #yields (bool TRUE) query regionrel feed {a} regionrel feed {b} symmjoin[.R_a overlaps ..R_b] count = ((regionrel feed {a} regionrel feed {b} symmjoin[.R_a intersects1 ..R_b] count - regionrel feed {a} regionrel feed {b} symmjoin[.R_a adjacent ..R_b] count) ); #testcase onborder_pr #yields (int 17) query pointrel feed {a} regionrel feed {b} symmjoin[.P_a onborder ..R_b] count; #testcase ininterior_pr #yields (int 27) query pointrel feed {a} regionrel feed {b} symmjoin[.P_a ininterior ..R_b] count; #testcase onborder_ininterior_pr #yields (bool TRUE) query pointrel feed {a} regionrel feed {b} symmjoin[.P_a inside ..R_b] count = (pointrel feed {a} regionrel feed {b} symmjoin[.P_a onborder ..R_b] count + pointrel feed {a} regionrel feed {b} symmjoin[.P_a ininterior ..R_b] count); #testcase intersection_pp #yields (bool TRUE) query (pointrel feed {a} pointrel feed {b} symmjoin[ intersection1(.P_a, ..P_b) = .P_a ] count + pointrel feed {a} pointrel feed {b} symmjoin[ isempty(intersection1(.P_a, ..P_b)) ] count) = pointrel feed {a} pointrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_pps #yields (bool TRUE) query (pointrel feed {a} pointsrel feed {b} symmjoin[ intersection1(.P_a, ..Ps_b) = .P_a ] count + pointrel feed {a} pointsrel feed {b} symmjoin[ isempty(intersection1(.P_a, ..Ps_b)) ] count) = pointrel feed {a} pointsrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_pl #yields (bool TRUE) query (pointrel feed {a} linerel feed {b} symmjoin[ intersection1(.P_a, ..L_b) = .P_a ] count + pointrel feed {a} linerel feed {b} symmjoin[ isempty(intersection1(.P_a, ..L_b)) ] count) = pointrel feed {a} linerel feed {b} symmjoin[ TRUE ] count; #testcase intersection_pr #yields (bool TRUE) query (pointrel feed {a} regionrel feed {b} symmjoin[ intersection1(.P_a, ..R_b) = .P_a ] count + pointrel feed {a} regionrel feed {b} symmjoin[ isempty(intersection1(.P_a, ..R_b)) ] count) = pointrel feed {a} regionrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_psp #yields (bool TRUE) query (pointsrel feed {a} pointrel feed {b} symmjoin[ intersection1(.Ps_a, ..P_b) = ..P_b ] count + pointsrel feed {a} pointrel feed {b} symmjoin[ isempty(intersection1(.Ps_a, ..P_b)) ] count) = pointsrel feed {a} pointrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_psps #yields (int 31) query pointsrel feed {a} pointsrel feed {b} product extend[N: no_components(intersection1(.Ps_a, .Ps_b))] sum[N]; #testcase intersection_psl #yields (int 34) query pointsrel feed {a} linerel feed {b} product extend[N: no_components(intersection1(.Ps_a, .L_b))] sum[N]; #testcase intersection_psr #yields (int 31) query pointsrel feed {a} regionrel feed {b} product extend[N: no_components(intersection1(.Ps_a, .R_b))] sum[N]; #testcase intersection_lp #yields (bool TRUE) query (linerel feed {a} pointrel feed {b} symmjoin[ intersection1(.L_a, ..P_b) = ..P_b ] count + linerel feed {a} pointrel feed {b} symmjoin[ isempty(intersection1(.L_a, ..P_b)) ] count) = linerel feed {a} pointrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_lps #yields (int 34) query linerel feed {a} pointsrel feed {b} product extend[N: no_components(intersection1(.L_a, .Ps_b))] sum[N]; #testcase intersection_rp #yields (bool TRUE) query (regionrel feed {a} pointrel feed {b} symmjoin[ intersection1(.R_a, ..P_b) = ..P_b ] count + regionrel feed {a} pointrel feed {b} symmjoin[ isempty(intersection1(.R_a, ..P_b)) ] count) = regionrel feed {a} pointrel feed {b} symmjoin[ TRUE ] count; #testcase intersection_rps #yields (int 31) query regionrel feed {a} pointsrel feed {b} product extend[N: no_components(intersection1(.R_a, .Ps_b))] sum[N]; #testcase minus1_pp #yields (bool TRUE) query (pointrel feed {a} pointrel feed {b} symmjoin[ (.P_a minus1 ..P_b) = .P_a ] count + pointrel feed {a} pointrel feed {b} symmjoin[ isempty(.P_a minus1 ..P_b) ] count) = pointrel feed {a} pointrel feed {b} symmjoin[ TRUE ] count; #testcase minus1_pps #yields (bool TRUE) query (pointrel feed {a} pointsrel feed {b} symmjoin[ (.P_a minus1 ..Ps_b) = .P_a ] count + pointrel feed {a} pointsrel feed {b} symmjoin[ isempty(.P_a minus1 ..Ps_b) ] count) = pointrel feed {a} pointsrel feed {b} symmjoin[ TRUE ] count; #testcase minus1_pl #yields (bool TRUE) query (pointrel feed {a} linerel feed {b} symmjoin[ (.P_a minus1 ..L_b) = .P_a ] count + pointrel feed {a} linerel feed {b} symmjoin[ isempty(.P_a minus1 ..L_b) ] count) = pointrel feed {a} linerel feed {b} symmjoin[ TRUE ] count; #testcase minus1_pr #yields (bool TRUE) query (pointrel feed {a} regionrel feed {b} symmjoin[ (.P_a minus1 ..R_b) = .P_a ] count + pointrel feed {a} regionrel feed {b} symmjoin[ isempty(.P_a minus1 ..R_b) ] count) = pointrel feed {a} regionrel feed {b} symmjoin[ TRUE ] count; #testcase minus1_psp #yields (int 0) query pointsrel feed {a} pointrel feed filter[isdefined(.P)] {b} product extend[N1: no_components(.Ps_a) - ifthenelse(isempty(intersection1(.P_b,.Ps_a)),0,1), N2: no_components(.Ps_a minus1 .P_b)] filter[(.N1 # .N2) ] count #testcase minus1_psps #yields (int 89) query pointsrel feed {a} pointsrel feed {b} product extend[N: no_components(.Ps_a minus1 .Ps_b)] sum[N]; #testcase minus1_psl #yields (int 71) query pointsrel feed {a} linerel feed {b} product extend[N: no_components(.Ps_a minus1 .L_b)] sum[N]; #testcase minus1_psr #yields (int 89) query pointsrel feed {a} regionrel feed {b} product extend[N: no_components(.Ps_a minus1 .R_b)] sum[N]; #testcase minus1_lp #yields (bool TRUE) query linerel feed {a} pointrel feed {b} symmjoin[ (.L_a minus1 ..P_b) = .L_a ] count = (((linerel count) * (pointrel count)) - 7); #testcase minus1_lps #yields (bool TRUE) query linerel feed {a} pointsrel feed {b} symmjoin[ (.L_a minus1 ..Ps_b) = .L_a ] count = (linerel count) * (pointsrel count); #testcase minus1_rp #yields (bool TRUE) query regionrel feed {a} pointrel feed {b} symmjoin[ (.R_a minus1 ..P_b) = .R_a ] count = (((regionrel count) * (pointrel count)) - 8); #testcase minus1_rps #yields (bool TRUE) query regionrel feed {a} pointsrel feed {b} symmjoin[ (.R_a minus1 ..Ps_b) = .R_a ] count = (regionrel count) * (pointsrel count); #testcase minus1_rl #yields (bool TRUE) query regionrel feed {a} linerel feed {b} symmjoin[ (.R_a minus1 ..L_b) = .R_a ] count = (regionrel count) * (linerel count); #testcase union_pps #yields (int 29) query no_components(pointrel feed {a} pointsrel feed {b} product extend[Ps: .P_a union1 .Ps_b] filter[isdefined(.Ps)] aggregate[Ps; fun(ps1: points, ps2: points) ps1 union1 ps2; [const points value ()]]); #testcase union_psp #yields (int 29) query no_components(pointsrel feed {a} pointrel feed {b} product extend[Ps: .Ps_a union1 .P_b] filter[isdefined(.Ps)] aggregateB[Ps; fun(ps1: points, ps2: points) ps1 union1 ps2; [const points value ()]]); #testcase union_psps #yields (int 9) query no_components(pointsrel feed aggregate[Ps; fun(ps1: points, ps2: points) ps1 union1 ps2; [const points value ()]]); #testcase union_psps #yields (int 9) query no_components(pointsrel feed aggregateB[Ps; fun(ps1: points, ps2: points) ps1 union1 ps2; [const points value ()]]); #testcase setoperators_psps #yields (bool TRUE) query pointsrel feed {a} pointsrel feed {b} symmjoin[ no_components((.Ps_a minus1 ..Ps_b) union1 intersection1(.Ps_a, ..Ps_b)) = no_components(.Ps_a) ] count = ( (pointsrel count) * (pointsrel count) ); #testcase setoperators_psl #yields (bool TRUE) query pointsrel feed {a} linerel feed {b} symmjoin[ no_components((.Ps_a minus1 ..L_b) union1 intersection1(.Ps_a, ..L_b)) = no_components(.Ps_a) ] count = ( (pointsrel count) * (linerel count) ); #testcase setoperators_psr #yields (bool TRUE) query pointsrel feed {a} regionrel feed {b} symmjoin[ no_components((.Ps_a minus1 ..R_b) union1 intersection1(.Ps_a, ..R_b)) = no_components(.Ps_a) ] count = ( (pointsrel count) * (regionrel count) ); #testcase crossings_ll #yields (int 24) #query linerel feed {a} linerel feed {b} product extend[N: no_components(crossings(.L_a, .L_b))] sum[N]; #testcase commonborder_rr #yields (bool TRUE) query regionrel feed {a} regionrel feed {b} symmjoin[.No_a # ..No_b] extend[L: commonborder(.R_a, .R_b)] filter[ (isempty(.L)) or ((.L adjacent .R_a) and (.L adjacent .R_b)) ] count = (regionrel count) * ((regionrel count) - 1); #testcase single_ps #yields (int 2) query pointsrel feed {a} pointrel feed {b} symmjoin[single(.Ps_a) = ..P_b] count; #setting the tolerance #tolerance_real 0.0009 #testcase distance_pp #yields (real 0.25) query pointrel feed {a} pointrel feed {b} symmjoin[.No_a # ..No_b] extend[D: distance(.P_a, .P_b)] min[D]; #testcase distance_pp #yields (real 1.41421) query pointrel feed {a} pointrel feed {b} symmjoin[.No_a # ..No_b] extend[D: distance(.P_a, .P_b)] max[D]; #testcase distance_pps #yields (real 0.0284) query pointrel feed {a} pointsrel feed {b} symmjoin[not(.P_a inside ..Ps_b)] extend[D: distance(.P_a, .Ps_b)] min[D]; #testcase distance_pps #yields (real 1.41421) query pointrel feed {a} pointsrel feed {b} symmjoin[.No_a # ..No_b] extend[D: distance(.P_a, .Ps_b)] max[D]; #testcase distance_psp #yields (real 0.0284) query pointsrel feed {a} pointrel feed {b} symmjoin[not(..P_b inside .Ps_a)] extend[D: distance(.Ps_a, .P_b)] min[D]; #testcase distance_psp #yields (real 1.41421) query pointsrel feed {a} pointrel feed {b} symmjoin[.No_a # ..No_b] extend[D: distance(.Ps_a, .P_b)] max[D]; #testcase distance_pl #yields (real 0.05) query pointrel feed {a} linerel feed {b} symmjoin[not(.P_a inside ..L_b)] extend[D: distance(.P_a, .L_b)] min[D]; #testcase distance_pl #yields (real 1.03078) query pointrel feed {a} linerel feed {b} symmjoin[not(.P_a inside ..L_b)] extend[D: distance(.P_a, .L_b)] max[D]; #testcase distance_lp #yields (real 0.05) query pointrel feed {a} linerel feed {b} symmjoin[not(.P_a inside ..L_b)] extend[D: distance(.L_b, .P_a)] min[D]; #testcase distance_lp #yields (real 1.03078) query pointrel feed {a} linerel feed {b} symmjoin[not(.P_a inside ..L_b)] extend[D: distance(.L_b, .P_a)] max[D]; #testcase distance_pr #yields (real 0.0007) query pointrel feed {a} regionrel feed {b} symmjoin[not(.P_a inside ..R_b)] extend[D: distance(.P_a, .R_b)] min[D]; #testcase distance_pr #yields (real 0.927183) query pointrel feed {a} regionrel feed {b} symmjoin[not(.P_a inside ..R_b)] extend[D: distance(.P_a, .R_b)] max[D]; #testcase distance_rp #yields (real 0.0007) query pointrel feed {a} regionrel feed {b} symmjoin[not(.P_a inside ..R_b)] extend[D: distance(.R_b, .P_a)] min[D]; #testcase distance_rp #yields (real 0.927183) query pointrel feed {a} regionrel feed {b} symmjoin[not(.P_a inside ..R_b)] extend[D: distance(.R_b, .P_a)] max[D]; #testcase distance_psps #yields (real 0.0284) query pointsrel feed {a} pointsrel feed {b} symmjoin[not(.Ps_a intersects1 ..Ps_b)] extend[D: distance(.Ps_a, .Ps_b)] min[D]; #testcase distance_psps #yields (real 1.41421) query pointsrel feed {a} pointsrel feed {b} symmjoin[not(.Ps_a intersects1 ..Ps_b)] extend[D: distance(.Ps_a, .Ps_b)] max[D]; #testcase distance_psl #yields (real 0.19624) query pointsrel feed {a} linerel feed {b} symmjoin[not(.Ps_a intersects1 ..L_b)] extend[D: distance(.Ps_a, .L_b)] min[D]; #testcase distance_psl #yields (real 0.901388) query pointsrel feed {a} linerel feed {b} symmjoin[not(.Ps_a intersects1 ..L_b)] extend[D: distance(.Ps_a, .L_b)] max[D]; #testcase distance_lps #yields (real 0.19624) query linerel feed {a} pointsrel feed {b} symmjoin[not(.L_a intersects1 ..Ps_b)] extend[D: distance(.L_a, .Ps_b)] min[D]; #testcase distance_lps #yields (real 0.901388) query linerel feed {a} pointsrel feed {b} symmjoin[not(.L_a intersects1 ..Ps_b)] extend[D: distance(.L_a, .Ps_b)] max[D]; #testcase distance_psr #yields (real 0.113686) query pointsrel feed {a} regionrel feed {b} symmjoin[not(.Ps_a intersects1 ..R_b)] extend[D: distance(.Ps_a, .R_b)] min[D]; #testcase distance_psr #yields (real 0.927183) query pointsrel feed {a} regionrel feed {b} symmjoin[not(.Ps_a intersects1 ..R_b)] extend[D: distance(.Ps_a, .R_b)] max[D]; #testcase distance_rps #yields (real 0.113686) query regionrel feed {a} pointsrel feed {b} symmjoin[not(.R_a intersects1 ..Ps_b)] extend[D: distance(.R_a, .Ps_b)] min[D]; #testcase distance_rps #yields (real 0.927183) query regionrel feed {a} pointsrel feed {b} symmjoin[not(.R_a intersects1 ..Ps_b)] extend[D: distance(.R_a, .Ps_b)] max[D]; #testcase distance_ll #yields (real 0.111803) query linerel feed {a} linerel feed {b} symmjoin[not(.L_a intersects1 ..L_b)] extend[D: distance(.L_a, .L_b)] min[D]; #testcase distance_ll #yields (real 0.5) query linerel feed {a} linerel feed {b} symmjoin[not(.L_a intersects1 ..L_b)] extend[D: distance(.L_a, .L_b)] max[D]; #testcase distance_rr #yields (real 0.0685444) query regionrel feed {a} regionrel feed {b} symmjoin[not(.R_a intersects1 ..R_b)] extend[D: distance(.R_a, .R_b)] min[D]; #testcase distance_rr #yields (real 0.304459) query regionrel feed {a} regionrel feed {b} symmjoin[not(.R_a intersects1 ..R_b)] extend[D: distance(.R_a, .R_b)] max[D]; #testcase direction_pp #yields (real 0.0) query pointrel feed {a} pointrel feed {b} product extend[ A: ifthenelse( direction(.P_a, .P_b) < 180.0, direction(.P_a, .P_b), 180.0 - direction(.P_a, .P_b) )] sum[A]; #testcase no_components_ps #yields (int 15) query pointsrel feed extend[N: no_components(.Ps)] sum[N]; #testcase no_components_l #yields (int 8) query linerel feed extend[N: no_components(.L)] sum[N]; #testcase no_components_r #yields (int 7) query regionrel feed extend[N: no_components(.R)] sum[N]; #testcase no_segments_l #yields (int 33) query linerel feed extend[N: no_segments(.L)] sum[N]; #testcase no_segments_r #yields (int 77) query regionrel feed extend[N: no_segments(.R)] sum[N]; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.0 0.0)) ((0.0 1.0)) ((0.0 0.25)) ((1.0 0.25)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), 0.0, TRUE)] project[P] consume; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.0 0.0)) ((0.0 1.0)) ((0.0 0.25)) ((1.0 0.25)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), size(.L), FALSE)] project[P] consume; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((1.0 1.0)) ((1.0 0.0)) ((0.25 1.0)) ((1.0 1.0)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), 0.0, FALSE)] project[P] consume; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((1.0 1.0)) ((1.0 0.0)) ((0.25 1.0)) ((1.0 1.0)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), size(.L), TRUE)] project[P] consume; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.5732233 0.3232233)) ((0.4309017 0.207295)) ((0.0 0.75)) ((0.75 0.625)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), (size(.L)/2), TRUE)] project[P] consume; #testcase atposition_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.5732233 0.3232233)) ((0.4309017 0.207295)) ((0.0 0.75)) ((0.75 0.625)) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), (size(.L)/2), FALSE)] project[P] consume; #testcase atpoint_l #yields ((rel (tuple ((R real)))) ((undefined) (0.0) (undefined) (undefined) (undefined) (undefined) (undefined))) query linerel feed extend[R: atpoint(fromline(.L), [const point value (0.0 0.0)], TRUE)] project[R] consume; #testcase atpoint_l #yields ((rel (tuple ((R real)))) ((undefined) (2.32514) (undefined) (undefined) (undefined) (undefined) (undefined))) query linerel feed extend[R: atpoint(fromline(.L), [const point value (0.0 0.0)], FALSE)] project[R] consume; #testcase atpoint_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.3333333333333333 0.5)) ((0.3333333333333333 0.5)) (undefined) (undefined) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), atpoint(fromline(.L), [const point value (0.3333333333333333 0.5)], TRUE), TRUE)] project[P] consume; #testcase atpoint_l #yields ((rel (tuple ((P point)))) ((undefined) ((0.3333333333333333 0.5)) ((0.3333333333333333 0.5)) (undefined) (undefined) (undefined) (undefined))) query linerel feed extend[P: atposition(fromline(.L), atpoint(fromline(.L), [const point value (0.3333333333333333 0.5)], FALSE), FALSE)] project[P] consume; #teardown close database; #delete database spatialtest;