Skip to content
Snippets Groups Projects

Resolve "Expand the `create_damage_view` function with an overwrite option"

+ 41
12
@@ -251,7 +251,9 @@ class ExposureDatabase(SpatialiteDatabase):
self.connection.execute(sql_statement)
logger.debug("Table DamageMethod created")
def create_damage_view(self, view_name, entity, method_id, damage_state_id=None):
def create_damage_view(
self, view_name, entity, method_id, damage_state_id=None, overwrite=True
):
"""
Creates a view of damage assessments with the geometry from the respective entity.
The `method_id` selects the assessments to be selected. If `damage_state_id` is given,
@@ -278,15 +280,27 @@ class ExposureDatabase(SpatialiteDatabase):
damage assessment to be displayed. `None` only works for `building` entities,
because deterministic damage assessment can only be provided for `building`s
and by sources other than the loss-calculator.
overwrite (bool):
If set, an potentially existing view of the same name is removed first.
"""
# Check for viable parameter combination
if (damage_state_id is None) and (entity != "building"):
raise ValueError("Invalid parameter combination for damage view")
# View names must be in lower case (SQLite requirement)
name = view_name.lower()
# If view already exists, overwrite or raise an exception if overwrite set to False
if self.view_exists(name):
if not overwrite:
raise Exception("View %s already exists" % name)
else:
self.delete_view(name)
# Create view
if (entity == "building") or (entity == "residual"):
sql_statement = "CREATE VIEW %s AS " % view_name.lower()
sql_statement = "CREATE VIEW %s AS " % name
sql_statement += "SELECT DamageAssessment.id AS idx, Entity.geom AS geometry, "
sql_statement += "Entity.quadkey, "
if damage_state_id is None:
@@ -305,7 +319,7 @@ class ExposureDatabase(SpatialiteDatabase):
if damage_state_id is not None:
sql_statement += "AND Damage.damage_state_id = %d " % damage_state_id
else: # entity == "tile"
sql_statement = "CREATE VIEW %s AS " % view_name.lower()
sql_statement = "CREATE VIEW %s AS " % name
sql_statement += "SELECT Entity.id as idx, Entity.geom as geometry, "
sql_statement += "Q.sum AS damage_probability "
sql_statement += "FROM "
@@ -324,17 +338,32 @@ class ExposureDatabase(SpatialiteDatabase):
sql_statement += "WHERE Entity.osm_id IS NULL"
self.connection.execute(sql_statement)
logger.debug("View %s created" % view_name.lower())
logger.debug("View %s created" % name)
# Insert necessary entry to the `view_geometry_columns` table
sql_statement = "INSERT INTO views_geometry_columns "
sql_statement += "(view_name, view_geometry, view_rowid, "
sql_statement += "f_table_name, f_geometry_column, read_only) "
sql_statement += (
"VALUES ('%s', 'geometry', 'idx', 'entity', 'geom', 1)" % view_name.lower()
)
sql_statement += "VALUES ('%s', 'geometry', 'idx', 'entity', 'geom', 1)" % name
self.connection.execute(sql_statement)
logger.debug("Geometry entry for view %s created" % view_name.lower())
logger.debug("Geometry entry for view %s created" % name)
def view_exists(self, view_name):
"""
Checks if a view with the given name exists in the database.
Args:
view_name (str):
Name of the view.
Returns:
True if the view exists, false if not.
"""
sql_statement = "SELECT COUNT(name) FROM sqlite_master WHERE type='view' "
sql_statement += "AND name='%s'" % view_name.lower()
self.cursor.execute(sql_statement)
return self.cursor.fetchone()[0] == 1
def delete_view(self, view_name):
"""
@@ -345,12 +374,12 @@ class ExposureDatabase(SpatialiteDatabase):
Name of the view to be deleted. The name must be in lower case in the geometry
table and will therefore be changed to lower case.
"""
self.connection.execute("DROP VIEW IF EXISTS %s" % view_name.lower())
name = view_name.lower()
self.connection.execute("DROP VIEW IF EXISTS %s" % name)
sql_statement = "DELETE FROM views_geometry_columns "
sql_statement += "WHERE view_name = '%s'" % view_name.lower()
sql_statement += "WHERE view_name = '%s'" % name
self.connection.execute(sql_statement)
logger.debug("View %s deleted" % view_name.lower())
logger.debug("View %s deleted" % name)
def insert_tile_entity(self, quadkey):
"""
Loading