Commit 08f9effb authored by Marius Kriegerowski's avatar Marius Kriegerowski
Browse files

Changed to return results from rules instead of async yielding

parent b0b010cd
Pipeline #27986 passed with stage
in 2 minutes and 19 seconds
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see http://www.gnu.org/licenses/. # along with this program. If not, see http://www.gnu.org/licenses/.
import logging import logging
from typing import Tuple, Iterator from typing import Optional
from rabotnik import Rule from rabotnik import Rule
...@@ -25,21 +25,23 @@ logger = logging.getLogger(__name__) ...@@ -25,21 +25,23 @@ logger = logging.getLogger(__name__)
class GetBuildingLandUse(Rule): class GetBuildingLandUse(Rule):
"""A rule to get the land use of a building.""" """A rule to get the land use of a building. If more than one land
use is found, returns None."""
def __init__(self, storage): def __init__(self, storage):
self.storage = storage self.storage = storage
async def evaluate(self, payload: dict) -> Iterator[Tuple[int]]: async def evaluate(self, payload: dict) -> Optional[str]:
building_id = payload["building_id"] building_id = payload["building_id"]
logger.debug("evaluating %s", building_id)
async for land_use in self.storage.iter_results( land_use = await self.storage.expect_one(
f"""SELECT land.class f"""SELECT land.class
FROM osm_building_relations AS building, osm_lands AS land FROM osm_building_relations AS building, osm_lands AS land
WHERE {building_id} = building.id WHERE {building_id} = building.id
AND ST_INTERSECTS(land.geometry, building.geometry); AND ST_INTERSECTS(land.geometry, building.geometry);
""" """
): )
yield land_use logger.info("Land use of %s: %s", building_id, land_use)
return land_use
...@@ -47,4 +47,9 @@ class GetFloorspace(Rule): ...@@ -47,4 +47,9 @@ class GetFloorspace(Rule):
""" """
floorspace = await self.storage.expect_one(query_floorspace) floorspace = await self.storage.expect_one(query_floorspace)
logger.info("building %s floorspace: %s.", building_id, floorspace)
if floorspace is None:
return
await upsert(self.storage_target, building_id, floorspace) await upsert(self.storage_target, building_id, floorspace)
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see http://www.gnu.org/licenses/. # along with this program. If not, see http://www.gnu.org/licenses/.
import logging import logging
from typing import Tuple, Iterator
from rabotnik import Rule from rabotnik import Rule
...@@ -29,10 +28,11 @@ class GetPointsInBuilding(Rule): ...@@ -29,10 +28,11 @@ class GetPointsInBuilding(Rule):
def __init__(self, storage): def __init__(self, storage):
self.storage = storage self.storage = storage
async def evaluate(self, payload: dict) -> Iterator[Tuple[int]]: async def evaluate(self, payload: dict) -> int:
building_id = payload["building_id"] building_id = payload["building_id"]
logger.debug("evaluating %s", building_id) logger.debug("evaluating %s", building_id)
n_points_total = 0
async for n_points, _ in self.storage.iter_results( async for n_points, _ in self.storage.iter_results(
f"""SELECT COUNT(ST_NPOINTS(spots.geometry)), buildings.osm_id f"""SELECT COUNT(ST_NPOINTS(spots.geometry)), buildings.osm_id
FROM OSM_SPOTS as spots, OSM_Building_polygons as buildings FROM OSM_SPOTS as spots, OSM_Building_polygons as buildings
...@@ -42,4 +42,6 @@ class GetPointsInBuilding(Rule): ...@@ -42,4 +42,6 @@ class GetPointsInBuilding(Rule):
""" """
): ):
yield n_points n_points_total += n_points
return n_points_total
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment