Pārlūkot izejas kodu

Fixed relative time converstion bug in the C-interface, fixed unit request in the register function, added more register unittests.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@58575 15284696-431f-4ddb-bdfa-cd5b030d7da7
Soeren Gebbert 11 gadi atpakaļ
vecāks
revīzija
3c58ca4621

+ 3 - 4
lib/python/temporal/c_libraries_interface.py

@@ -514,8 +514,7 @@ def _convert_timestamp_from_grass(ts):
                             byref(dt1),
                             byref(dt2),
                             byref(count))
-
-
+    
     if dt1.mode == libdate.DATETIME_ABSOLUTE:
         pdt1 = None
         pdt2 = None
@@ -535,7 +534,7 @@ def _convert_timestamp_from_grass(ts):
         unit = None
         start = None
         end = None
-        if count >= 1:
+        if count.value >= 1:
             if dt1.year > 0:
                 unit = "years"
                 start = dt1.year
@@ -554,7 +553,7 @@ def _convert_timestamp_from_grass(ts):
             elif dt1.second > 0:
                 unit = "seconds"
                 start = dt1.second
-        if count == 2:
+        if count.value == 2:
             if dt2.year > 0:
                 end = dt2.year
             elif dt2.month > 0:

+ 1 - 1
lib/python/temporal/register.py

@@ -97,7 +97,7 @@ def register_maps_in_space_time_dataset(
     if name:
         sp = open_old_space_time_dataset(name, type, dbif)
 
-        if sp.is_time_relative() and not unit:
+        if sp.is_time_relative() and (start or end) and not unit:
             dbif.close()
             msgr.fatal(_("Space time %(sp)s dataset <%(name)s> with relative"
                          " time found, but no relative unit set for %(sp)s "

+ 139 - 31
lib/python/temporal/unittests_register.py

@@ -35,17 +35,18 @@ class TestRegisterFunctions(unittest.TestCase):
         ret += grass.run_command("r.mapcalc", overwrite=True, quiet=True, 
                           expression="register_map_2 = 2")
         self.assertEqual(ret, 0)
+        
+        
+        self.strds_abs = tgis.open_new_space_time_dataset(name="register_test_abs", type="strds", temporaltype="absolute", 
+                                            title="Test strds", descr="Test strds", semantic="field")
+        self.strds_rel = tgis.open_new_space_time_dataset(name="register_test_rel", type="strds", temporaltype="relative", 
+                                            title="Test strds", descr="Test strds", semantic="field")
 
-    def test_absolute_time_strds(self):
+    def test_absolute_time_strds_1(self):
         """!Test the registration of maps with absolute time in a
            space time raster dataset
         """
-        ret = grass.run_command("t.create", output="register_test", 
-                                title="Test strds", description="Test strds",
-                                temporaltype="absolute")
-        self.assertEqual(ret, 0)
-
-        tgis.register_maps_in_space_time_dataset(type="rast", name="register_test", 
+        tgis.register_maps_in_space_time_dataset(type="rast", name=self.strds_abs.get_name(), 
                  maps="register_map_1,register_map_2",
                  start="2001-01-01", increment="1 day", interval=True)
 
@@ -61,14 +62,45 @@ class TestRegisterFunctions(unittest.TestCase):
         self.assertEqual(start, datetime.datetime(2001, 1, 2))
         self.assertEqual(end, datetime.datetime(2001, 1, 3))
 
-        strds = tgis.SpaceTimeRasterDataset("register_test@" + tgis.get_current_mapset())
-        strds.select()
-        start, end = strds.get_absolute_time()
+        self.strds_abs.select()
+        start, end = self.strds_abs.get_absolute_time()
         self.assertEqual(start, datetime.datetime(2001, 1, 1))
         self.assertEqual(end, datetime.datetime(2001, 1, 3))
 
-        ret = grass.run_command("t.remove", input="register_test") 
-        self.assertEqual(ret, 0)
+        self.strds_abs.print_info()
+
+    def test_absolute_time_strds_2(self):
+        """!Test the registration of maps with absolute time in a
+           space time raster dataset.
+           The timestamps are set using the C-Interface beforehand, so that the register function needs
+           to read the timetsamp from the map metadata.
+        """
+
+        ciface = tgis.get_tgis_c_library_interface()
+        ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001")
+        ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "2 Jan 2001/3 Jan 2001")
+
+        tgis.register_maps_in_space_time_dataset(type="rast", name=self.strds_abs.get_name(), 
+                                                 maps="register_map_1,register_map_2")
+
+        map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
+        map.select()
+        start, end = map.get_absolute_time()
+        self.assertEqual(start, datetime.datetime(2001, 1, 1))
+        self.assertEqual(end, datetime.datetime(2001, 1, 2))
+
+        map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
+        map.select()
+        start, end = map.get_absolute_time()
+        self.assertEqual(start, datetime.datetime(2001, 1, 2))
+        self.assertEqual(end, datetime.datetime(2001, 1, 3))
+
+        self.strds_abs.select()
+        start, end = self.strds_abs.get_absolute_time()
+        self.assertEqual(start, datetime.datetime(2001, 1, 1))
+        self.assertEqual(end, datetime.datetime(2001, 1, 3))
+
+        self.strds_abs.print_info()
 
     def test_absolute_time_1(self):
         """!Test the registration of maps with absolute time
@@ -106,19 +138,37 @@ class TestRegisterFunctions(unittest.TestCase):
         start, end = map.get_absolute_time()
         self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
 
-    def test_relative_time_strds(self):
+    def test_absolute_time_3(self):
+        """!Test the registration of maps with absolute time. 
+           The timestamps are set using the C-Interface beforehand, so that the register function needs
+           to read the timetsamp from the map metadata.
+        """
+                 
+        ciface = tgis.get_tgis_c_library_interface()
+        ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 Jan 2001 10:30:01")
+        ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1 Jan 2001 18:30:01")
+
+        tgis.register_maps_in_space_time_dataset(type="rast", name=None, 
+                 maps="register_map_1,register_map_2")
+                 
+        map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
+        map.select()
+        start, end = map.get_absolute_time()
+        self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
+
+        map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
+        map.select()
+        start, end = map.get_absolute_time()
+        self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
+
+    def test_relative_time_strds_1(self):
         """!Test the registration of maps with relative time in a
            space time raster dataset
         """
-        ret = grass.run_command("t.create", output="register_test", 
-                                title="Test strds", description="Test strds",
-                                temporaltype="relative")
-        self.assertEqual(ret, 0)
 
-
-        tgis.register_maps_in_space_time_dataset(type="rast", name="register_test", 
-                 maps="register_map_1,register_map_2",
-                 start=0, increment=1, unit="day", interval=True)
+        tgis.register_maps_in_space_time_dataset(type="rast", name=self.strds_rel.get_name(), 
+                                                 maps="register_map_1,register_map_2", start=0, 
+                                                 increment=1, unit="day", interval=True)
 
         map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
         map.select()
@@ -134,18 +184,48 @@ class TestRegisterFunctions(unittest.TestCase):
         self.assertEqual(end, 2)
         self.assertEqual(unit, "day")
 
-        strds = tgis.SpaceTimeRasterDataset("register_test@" + tgis.get_current_mapset())
-        strds.select()
-        start, end, unit = strds.get_relative_time()
+        self.strds_rel.select()
+        start, end, unit = self.strds_rel.get_relative_time()
         self.assertEqual(start, 0)
         self.assertEqual(end, 2)
         self.assertEqual(unit, "day")
         
-        strds.print_info()
+        self.strds_rel.print_info()
 
-        ret = grass.run_command("t.remove", input="register_test") 
-        self.assertEqual(ret, 0)
+    def test_relative_time_strds_2(self):
+        """!Test the registration of maps with relative time in a
+           space time raster dataset. The timetsamps are set for the maps using the 
+           C-interface before registration.
+        """
+        ciface = tgis.get_tgis_c_library_interface()
+        ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1000000 seconds/1500000 seconds")
+        ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1500000 seconds/2000000 seconds")
+
+        tgis.register_maps_in_space_time_dataset(type="rast", name=self.strds_rel.get_name(), 
+                                                 maps="register_map_1,register_map_2")
+
+        map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
+        map.select()
+        start, end, unit = map.get_relative_time()
+        self.assertEqual(start, 1000000)
+        self.assertEqual(end, 1500000)
+        self.assertEqual(unit, "seconds")
+
+        map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
+        map.select()
+        start, end, unit = map.get_relative_time()
+        self.assertEqual(start, 1500000)
+        self.assertEqual(end, 2000000)
+        self.assertEqual(unit, "seconds")
 
+        self.strds_rel.select()
+        start, end, unit = self.strds_rel.get_relative_time()
+        self.assertEqual(start, 1000000)
+        self.assertEqual(end, 2000000)
+        self.assertEqual(unit, "seconds")
+        
+        self.strds_rel.print_info()
+        
     def test_relative_time_1(self):
         """!Test the registration of maps with relative time
         """
@@ -172,27 +252,55 @@ class TestRegisterFunctions(unittest.TestCase):
         """
         tgis.register_maps_in_space_time_dataset(type="rast", name=None, 
                  maps="register_map_1,register_map_2",
-                 start=1000000, increment=500000, unit="second", interval=True)
+                 start=1000000, increment=500000, unit="seconds", interval=True)
+
+        map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
+        map.select()
+        start, end, unit = map.get_relative_time()
+        self.assertEqual(start, 1000000)
+        self.assertEqual(end, 1500000)
+        self.assertEqual(unit, "seconds")
+
+        map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
+        map.select()
+        start, end, unit = map.get_relative_time()
+        self.assertEqual(start, 1500000)
+        self.assertEqual(end, 2000000)
+        self.assertEqual(unit, "seconds")
+
+    def test_relative_time_3(self):
+        """!Test the registration of maps with relative time. The timetsamps are set beforhand using
+           the C-interface.
+        """
+        ciface = tgis.get_tgis_c_library_interface()
+        ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1000000 seconds/1500000 seconds")
+        ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1500000 seconds/2000000 seconds")
+        
+        tgis.register_maps_in_space_time_dataset(type="rast", name=None, 
+                 maps="register_map_1,register_map_2")
 
         map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
         map.select()
         start, end, unit = map.get_relative_time()
         self.assertEqual(start, 1000000)
         self.assertEqual(end, 1500000)
-        self.assertEqual(unit, "second")
+        self.assertEqual(unit, "seconds")
 
         map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
         map.select()
         start, end, unit = map.get_relative_time()
         self.assertEqual(start, 1500000)
         self.assertEqual(end, 2000000)
-        self.assertEqual(unit, "second")
+        self.assertEqual(unit, "seconds")
 
     def tearDown(self):
         """!Remove maps from temporal database
         """
-        ret = grass.run_command("t.unregister", maps="register_map_1,register_map_2")
+        ret = grass.run_command("t.unregister", maps="register_map_1,register_map_2", quiet=True)
+        ret = grass.run_command("g.remove", rast="register_map_1,register_map_2", quiet=True)
         self.assertEqual(ret, 0)
+        self.strds_abs.delete()
+        self.strds_rel.delete()
 
     @classmethod
     def tearDownClass(cls):