unittests_temporal_conditionals.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. """
  2. (C) 2014 by the GRASS Development Team
  3. This program is free software under the GNU General Public
  4. License (>=v2). Read the file COPYING that comes with GRASS
  5. for details.
  6. :authors: Thomas leppelt and Soeren Gebbert
  7. """
  8. import grass.script
  9. import grass.temporal as tgis
  10. from grass.gunittest.case import TestCase
  11. from grass.gunittest.main import test
  12. import datetime
  13. import os
  14. class TestTemporalConditionals(TestCase):
  15. @classmethod
  16. def setUpClass(cls):
  17. """Initiate the temporal GIS and set the region"""
  18. tgis.init(True) # Raise on error instead of exit(1)
  19. cls.use_temp_region()
  20. cls.runModule("g.region", n=80.0, s=0.0, e=120.0, w=0.0, t=1.0, b=0.0, res=10.0)
  21. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="a1 = 1")
  22. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="a2 = 2")
  23. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="a3 = 3")
  24. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="a4 = 4")
  25. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="b1 = 5")
  26. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="b2 = 6")
  27. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="c1 = 7")
  28. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="d1 = 8")
  29. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="d2 = 9")
  30. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="d3 = 10")
  31. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="e1 = 11")
  32. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="e2 = 12")
  33. cls.runModule("r.mapcalc", overwrite=True, quiet=True, expression="e3 = 13")
  34. cls.runModule(
  35. "r.mapcalc", overwrite=True, quiet=True, expression="singletmap = 99"
  36. )
  37. tgis.open_new_stds(
  38. name="A",
  39. type="strds",
  40. temporaltype="absolute",
  41. title="A",
  42. descr="A",
  43. semantic="field",
  44. overwrite=True,
  45. )
  46. tgis.open_new_stds(
  47. name="B",
  48. type="strds",
  49. temporaltype="absolute",
  50. title="B",
  51. descr="B",
  52. semantic="field",
  53. overwrite=True,
  54. )
  55. tgis.open_new_stds(
  56. name="C",
  57. type="strds",
  58. temporaltype="absolute",
  59. title="C",
  60. descr="C",
  61. semantic="field",
  62. overwrite=True,
  63. )
  64. tgis.open_new_stds(
  65. name="D",
  66. type="strds",
  67. temporaltype="absolute",
  68. title="D",
  69. descr="D",
  70. semantic="field",
  71. overwrite=True,
  72. )
  73. tgis.open_new_stds(
  74. name="E",
  75. type="strds",
  76. temporaltype="absolute",
  77. title="E",
  78. descr="E",
  79. semantic="field",
  80. overwrite=True,
  81. )
  82. tgis.register_maps_in_space_time_dataset(
  83. type="raster",
  84. name="A",
  85. maps="a1,a2,a3,a4",
  86. start="2001-01-01",
  87. increment="1 day",
  88. interval=True,
  89. )
  90. tgis.register_maps_in_space_time_dataset(
  91. type="raster",
  92. name="B",
  93. maps="b1,b2",
  94. start="2001-01-01",
  95. increment="2 day",
  96. interval=True,
  97. )
  98. tgis.register_maps_in_space_time_dataset(
  99. type="raster",
  100. name="C",
  101. maps="c1",
  102. start="2001-01-02",
  103. increment="2 day",
  104. interval=True,
  105. )
  106. tgis.register_maps_in_space_time_dataset(
  107. type="raster",
  108. name="D",
  109. maps="d1,d2,d3",
  110. start="2001-01-03",
  111. increment="1 day",
  112. interval=True,
  113. )
  114. tgis.register_maps_in_space_time_dataset(
  115. type="raster",
  116. name="E",
  117. maps="e1,e2,e3",
  118. start="2000-12-31",
  119. increment="2 day",
  120. interval=True,
  121. )
  122. tgis.register_maps_in_space_time_dataset(
  123. type="raster",
  124. name=None,
  125. maps="singletmap",
  126. start="2001-01-03",
  127. end="2001-01-04",
  128. )
  129. def tearDown(self):
  130. self.runModule("t.remove", inputs="R", quiet=True)
  131. @classmethod
  132. def tearDownClass(cls):
  133. """Remove the temporary region"""
  134. cls.runModule("t.remove", flags="rf", inputs="A,B,C,D,E", quiet=True)
  135. cls.del_temp_region()
  136. def test_temporal_condition_1(self):
  137. """Testing the temporal select operator with equal relations."""
  138. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  139. ta.parse(
  140. expression='R = if(start_date(A) >= "2001-01-03", A)',
  141. basename="r",
  142. overwrite=True,
  143. )
  144. D = tgis.open_old_stds("R", type="strds")
  145. D.select()
  146. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  147. self.assertEqual(D.metadata.get_min_min(), 3)
  148. self.assertEqual(D.metadata.get_max_max(), 4)
  149. start, end = D.get_absolute_time()
  150. self.assertEqual(start, datetime.datetime(2001, 1, 3))
  151. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  152. self.assertEqual(D.check_temporal_topology(), True)
  153. self.assertEqual(D.get_granularity(), "1 day")
  154. def test_temporal_condition_2(self):
  155. """Testing the temporal select operator with equal relations."""
  156. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  157. ta.parse(expression="R = if(td(A) == 1, A)", basename="r", overwrite=True)
  158. D = tgis.open_old_stds("R", type="strds")
  159. D.select()
  160. self.assertEqual(D.metadata.get_number_of_maps(), 4)
  161. self.assertEqual(D.metadata.get_min_min(), 1)
  162. self.assertEqual(D.metadata.get_max_max(), 4)
  163. start, end = D.get_absolute_time()
  164. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  165. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  166. self.assertEqual(D.check_temporal_topology(), True)
  167. self.assertEqual(D.get_granularity(), "1 day")
  168. def test_temporal_condition_3(self):
  169. """Testing the temporal select operator with equal relations."""
  170. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  171. ta.parse(
  172. expression='R = if(td(A) == 1 || start_date(A) >= "2001-01-03", A)',
  173. basename="r",
  174. overwrite=True,
  175. )
  176. D = tgis.open_old_stds("R", type="strds")
  177. D.select()
  178. self.assertEqual(D.metadata.get_number_of_maps(), 4)
  179. self.assertEqual(D.metadata.get_min_min(), 1)
  180. self.assertEqual(D.metadata.get_max_max(), 4)
  181. start, end = D.get_absolute_time()
  182. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  183. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  184. self.assertEqual(D.check_temporal_topology(), True)
  185. self.assertEqual(D.get_granularity(), "1 day")
  186. def test_temporal_condition_4(self):
  187. """Testing the temporal select operator with equal relations."""
  188. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  189. ta.parse(
  190. expression='R = if(start_date(A) >= "2001-01-03", A)',
  191. basename="r",
  192. overwrite=True,
  193. )
  194. D = tgis.open_old_stds("R", type="strds")
  195. D.select()
  196. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  197. self.assertEqual(D.metadata.get_min_min(), 3)
  198. self.assertEqual(D.metadata.get_max_max(), 4)
  199. start, end = D.get_absolute_time()
  200. self.assertEqual(start, datetime.datetime(2001, 1, 3))
  201. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  202. self.assertEqual(D.check_temporal_topology(), True)
  203. self.assertEqual(D.get_granularity(), "1 day")
  204. def test_temporal_condition_5(self):
  205. """Testing the temporal select operator with equal relations."""
  206. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  207. ta.parse(
  208. expression="R = if(start_day(A) <= 2, A)", basename="r", overwrite=True
  209. )
  210. D = tgis.open_old_stds("R", type="strds")
  211. D.select()
  212. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  213. self.assertEqual(D.metadata.get_min_min(), 1)
  214. self.assertEqual(D.metadata.get_max_max(), 2)
  215. start, end = D.get_absolute_time()
  216. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  217. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  218. self.assertEqual(D.check_temporal_topology(), True)
  219. self.assertEqual(D.get_granularity(), "1 day")
  220. def test_temporal_condition_6(self):
  221. """Testing the temporal select operator with equal relations."""
  222. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  223. ta.parse(
  224. expression='R = if(td(A) == 1 {||,during} start_date(C) < "2001-01-02", A)',
  225. basename="r",
  226. overwrite=True,
  227. )
  228. D = tgis.open_old_stds("R", type="strds")
  229. D.select()
  230. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  231. self.assertEqual(D.metadata.get_min_min(), 2)
  232. self.assertEqual(D.metadata.get_max_max(), 3)
  233. start, end = D.get_absolute_time()
  234. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  235. self.assertEqual(end, datetime.datetime(2001, 1, 4))
  236. self.assertEqual(D.check_temporal_topology(), True)
  237. self.assertEqual(D.get_granularity(), "1 day")
  238. def test_temporal_condition_7(self):
  239. """Testing the temporal select operator with equal relations."""
  240. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  241. ta.parse(
  242. expression='R = if({over},start_date(C) == "2001-01-02" {&&,contains} td(A) == 1, B)',
  243. basename="r",
  244. overwrite=True,
  245. )
  246. D = tgis.open_old_stds("R", type="strds")
  247. D.select()
  248. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  249. self.assertEqual(D.metadata.get_min_min(), 5)
  250. self.assertEqual(D.metadata.get_max_max(), 6)
  251. start, end = D.get_absolute_time()
  252. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  253. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  254. self.assertEqual(D.check_temporal_topology(), True)
  255. self.assertEqual(D.get_granularity(), "2 days")
  256. def test_temporal_condition_8(self):
  257. """Testing the temporal select operator with equal relations."""
  258. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  259. ta.parse(
  260. expression='R = if(start_date(B) <= "2001-01-01" {||,over,|} td(E) == 2, B)',
  261. basename="r",
  262. overwrite=True,
  263. )
  264. D = tgis.open_old_stds("R", type="strds")
  265. D.select()
  266. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  267. self.assertEqual(D.metadata.get_min_min(), 5)
  268. self.assertEqual(D.metadata.get_max_max(), 6)
  269. start, end = D.get_absolute_time()
  270. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  271. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  272. self.assertEqual(D.check_temporal_topology(), True)
  273. self.assertEqual(D.get_granularity(), "2 days")
  274. def test_temporal_condition_9(self):
  275. """Testing the temporal select operator with equal relations."""
  276. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  277. ta.parse(
  278. expression='R = if(start_date(B) <= "2001-01-01" {&&,over,&} td(E) == 2, B)',
  279. basename="r",
  280. overwrite=True,
  281. )
  282. D = tgis.open_old_stds("R", type="strds")
  283. D.select()
  284. self.assertEqual(D.metadata.get_number_of_maps(), 1)
  285. self.assertEqual(D.metadata.get_min_min(), 5)
  286. self.assertEqual(D.metadata.get_max_max(), 5)
  287. start, end = D.get_absolute_time()
  288. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  289. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  290. self.assertEqual(D.check_temporal_topology(), True)
  291. self.assertEqual(D.get_granularity(), "2 days")
  292. def test_temporal_condition_10(self):
  293. """Testing the temporal select operator with equal relations."""
  294. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  295. ta.parse(
  296. expression='R = if(start_date(B) <= "2001-01-01" {||,over,|,r} td(E) == 2, E)',
  297. basename="r",
  298. overwrite=True,
  299. )
  300. D = tgis.open_old_stds("R", type="strds")
  301. D.select()
  302. self.assertEqual(D.metadata.get_number_of_maps(), 3)
  303. self.assertEqual(D.metadata.get_min_min(), 11)
  304. self.assertEqual(D.metadata.get_max_max(), 13)
  305. start, end = D.get_absolute_time()
  306. self.assertEqual(start, datetime.datetime(2000, 12, 31))
  307. self.assertEqual(end, datetime.datetime(2001, 1, 6))
  308. self.assertEqual(D.check_temporal_topology(), True)
  309. self.assertEqual(D.get_granularity(), "2 days")
  310. def test_temporal_condition_11(self):
  311. """Testing the temporal select operator with equal relations."""
  312. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  313. ta.parse(
  314. expression='R = if(start_date(B) <= "2001-01-01" {&&,over,r} td(E) == 2, E)',
  315. basename="r",
  316. overwrite=True,
  317. )
  318. D = tgis.open_old_stds("R", type="strds")
  319. D.select()
  320. self.assertEqual(D.metadata.get_number_of_maps(), 1)
  321. self.assertEqual(D.metadata.get_min_min(), 11)
  322. self.assertEqual(D.metadata.get_max_max(), 11)
  323. start, end = D.get_absolute_time()
  324. self.assertEqual(start, datetime.datetime(2000, 12, 31))
  325. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  326. self.assertEqual(D.check_temporal_topology(), True)
  327. self.assertEqual(D.get_granularity(), "2 days")
  328. def test_temporal_condition_12(self):
  329. """Testing the temporal select operator with equal relations."""
  330. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  331. ta.parse(
  332. expression='R = if(start_date(B) <= "2001-01-01" {&&,over,|,r} td(E) == 2, E)',
  333. basename="r",
  334. overwrite=True,
  335. )
  336. D = tgis.open_old_stds("R", type="strds")
  337. D.select()
  338. self.assertEqual(D.metadata.get_number_of_maps(), 1)
  339. self.assertEqual(D.metadata.get_min_min(), 11)
  340. self.assertEqual(D.metadata.get_max_max(), 11)
  341. start, end = D.get_absolute_time()
  342. self.assertEqual(start, datetime.datetime(2000, 12, 31))
  343. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  344. self.assertEqual(D.check_temporal_topology(), True)
  345. self.assertEqual(D.get_granularity(), "2 days")
  346. def test_temporal_conditional_13(self):
  347. """Testing the hash operator function in conditional statement."""
  348. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  349. ta.parse(
  350. expression="R = if({equal|during},td(B) == 2 {&&,contains} td(A) == 1, A)",
  351. basename="r",
  352. overwrite=True,
  353. )
  354. D = tgis.open_old_stds("R", type="strds")
  355. D.select()
  356. maplist = D.get_registered_maps_as_objects()
  357. self.assertEqual(D.metadata.get_number_of_maps(), 4)
  358. self.assertEqual(D.metadata.get_min_min(), 1)
  359. self.assertEqual(D.metadata.get_max_max(), 4)
  360. start, end = D.get_absolute_time()
  361. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  362. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  363. self.assertEqual(D.check_temporal_topology(), True)
  364. self.assertEqual(D.get_granularity(), "1 day")
  365. def test_temporal_condition_else_1(self):
  366. """Testing the temporal select operator with equal relations."""
  367. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  368. ta.parse(
  369. expression='R = if(start_date(A) <= "2001-01-03", A, D)',
  370. basename="r",
  371. overwrite=True,
  372. )
  373. D = tgis.open_old_stds("R", type="strds")
  374. D.select()
  375. self.assertEqual(D.metadata.get_number_of_maps(), 4)
  376. self.assertEqual(D.metadata.get_min_min(), 1)
  377. self.assertEqual(D.metadata.get_max_max(), 9)
  378. start, end = D.get_absolute_time()
  379. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  380. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  381. self.assertEqual(D.check_temporal_topology(), True)
  382. self.assertEqual(D.get_granularity(), "1 day")
  383. def test_temporal_condition_else_2(self):
  384. """Testing the temporal select operator with equal relations."""
  385. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  386. ta.parse(
  387. expression='R = if(td(D) == 1 && start_date(A) >= "2001-01-04", A, D)',
  388. basename="r",
  389. overwrite=True,
  390. )
  391. D = tgis.open_old_stds("R", type="strds")
  392. D.select()
  393. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  394. self.assertEqual(D.metadata.get_min_min(), 4)
  395. self.assertEqual(D.metadata.get_max_max(), 8)
  396. start, end = D.get_absolute_time()
  397. self.assertEqual(start, datetime.datetime(2001, 1, 3))
  398. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  399. self.assertEqual(D.check_temporal_topology(), True)
  400. self.assertEqual(D.get_granularity(), "1 day")
  401. def test_temporal_condition_else_3(self):
  402. """Testing the temporal select operator with equal relations."""
  403. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  404. ta.parse(
  405. expression='R = if({during},td(B) == 2 {&&,contains} start_date(D) >= "2001-01-04", A, D)',
  406. basename="r",
  407. overwrite=True,
  408. )
  409. D = tgis.open_old_stds("R", type="strds")
  410. D.select()
  411. self.assertEqual(D.metadata.get_number_of_maps(), 2)
  412. self.assertEqual(D.metadata.get_min_min(), 8)
  413. self.assertEqual(D.metadata.get_max_max(), 9)
  414. start, end = D.get_absolute_time()
  415. self.assertEqual(start, datetime.datetime(2001, 1, 3))
  416. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  417. self.assertEqual(D.check_temporal_topology(), True)
  418. self.assertEqual(D.get_granularity(), "1 day")
  419. def test_temporal_condition_else_4(self):
  420. """Testing the temporal select operator with equal relations."""
  421. ta = tgis.TemporalAlgebraParser(run=True, debug=True)
  422. ta.parse(
  423. expression='R = if({equal|over},start_date(B) <= "2001-01-01" {&&,over,|,r} td(E) == 2, E, B)',
  424. basename="r",
  425. overwrite=True,
  426. )
  427. D = tgis.open_old_stds("R", type="strds")
  428. D.select()
  429. for map in D.get_registered_maps_as_objects():
  430. print(map.get_map_id())
  431. self.assertEqual(D.metadata.get_number_of_maps(), 3)
  432. self.assertEqual(D.metadata.get_min_min(), 5)
  433. self.assertEqual(D.metadata.get_max_max(), 11)
  434. start, end = D.get_absolute_time()
  435. self.assertEqual(start, datetime.datetime(2000, 12, 31))
  436. self.assertEqual(end, datetime.datetime(2001, 1, 5))
  437. self.assertEqual(D.check_temporal_topology(), False)
  438. self.assertEqual(D.get_granularity(), "2 days")
  439. if __name__ == "__main__":
  440. test()