744 lines
28 KiB
Plaintext
744 lines
28 KiB
Plaintext
|
|
#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;
|
||
|
|
|