more performance improvements

This commit is contained in:
Laura Klünder 2018-12-24 03:58:16 +01:00
parent 170c72de2b
commit 0e6aa29e36
3 changed files with 45 additions and 23 deletions

View file

@ -60,14 +60,16 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
space_holes_geom = cascaded_union(holes) space_holes_geom = cascaded_union(holes)
holes_geom.append(space_holes_geom.intersection(space.geometry)) holes_geom.append(space_holes_geom.intersection(space.geometry))
space.geometry = space.geometry.difference(space_holes_geom) space.geometry = space.geometry.difference(space_holes_geom)
holes_geom = cascaded_union(holes_geom)
holes_geom_prep = prepared.prep(holes_geom)
for building in buildings: for building in buildings:
building.original_geometry = building.geometry building.original_geometry = building.geometry
for obj in buildings:
if holes_geom_prep.intersects(obj.geometry): if holes_geom:
obj.geometry = obj.geometry.difference(holes_geom) holes_geom = cascaded_union(holes_geom)
holes_geom_prep = prepared.prep(holes_geom)
for obj in buildings:
if holes_geom_prep.intersects(obj.geometry):
obj.geometry = obj.geometry.difference(holes_geom)
results = [] results = []
results.extend(buildings) results.extend(buildings)
@ -106,6 +108,9 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
Level = request.changeset.wrap_model('Level') Level = request.changeset.wrap_model('Level')
Space = request.changeset.wrap_model('Space') Space = request.changeset.wrap_model('Space')
Column = request.changeset.wrap_model('Column') Column = request.changeset.wrap_model('Column')
Hole = request.changeset.wrap_model('Hole')
AltitudeMarker = request.changeset.wrap_model('AltitudeMarker')
Building = request.changeset.wrap_model('Building')
Door = request.changeset.wrap_model('Door') Door = request.changeset.wrap_model('Door')
LocationGroup = request.changeset.wrap_model('LocationGroup') LocationGroup = request.changeset.wrap_model('LocationGroup')
@ -129,13 +134,16 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
Prefetch('spaces', Space.objects.filter(Space.q_for_request(request)).only( Prefetch('spaces', Space.objects.filter(Space.q_for_request(request)).only(
'geometry', 'level', 'outside' 'geometry', 'level', 'outside'
)), )),
Prefetch('doors', Door.objects.filter(Door.q_for_request(request))), Prefetch('doors', Door.objects.filter(Door.q_for_request(request)).only('geometry', 'level')),
Prefetch('spaces__columns', Column.objects.filter(Q(access_restriction__isnull=True) | Prefetch('spaces__columns', Column.objects.filter(
~Column.q_for_request(request))), Q(access_restriction__isnull=True) | ~Column.q_for_request(request)
).only('geometry', 'space')),
Prefetch('spaces__groups', LocationGroup.objects.only( Prefetch('spaces__groups', LocationGroup.objects.only(
'color', 'category', 'priority', 'category__priority', 'category__allow_spaces' 'color', 'category', 'priority', 'category__priority', 'category__allow_spaces'
)), )),
'buildings', 'spaces__holes', 'spaces__altitudemarkers', Prefetch('buildings', Building.objects.only('geometry', 'level')),
Prefetch('spaces__holes', Hole.objects.only('geometry', 'space')),
Prefetch('spaces__altitudemarkers', AltitudeMarker.objects.only('geometry', 'space')),
# Prefetch('spaces__graphnodes', graphnodes_qs) # Prefetch('spaces__graphnodes', graphnodes_qs)
) )
@ -270,14 +278,14 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
other_spaces, other_spaces,
[space], [space],
areas, areas,
space.holes.all(), space.holes.all().only('geometry', 'space'),
space.stairs.all(), space.stairs.all().only('geometry', 'space'),
space.ramps.all(), space.ramps.all().only('geometry', 'space'),
space.obstacles.all(), space.obstacles.all().only('geometry', 'space'),
space.lineobstacles.all(), space.lineobstacles.all().only('geometry', 'width', 'space'),
space.columns.all(), space.columns.all().only('geometry', 'space'),
space.altitudemarkers.all(), space.altitudemarkers.all().only('geometry', 'space'),
space.wifi_measurements.all().only('geometry'), space.wifi_measurements.all().only('geometry', 'space'),
space.pois.filter(POI.q_for_request(request)).only('geometry', 'space').prefetch_related( space.pois.filter(POI.q_for_request(request)).only('geometry', 'space').prefetch_related(
Prefetch('groups', LocationGroup.objects.only( Prefetch('groups', LocationGroup.objects.only(
'color', 'category', 'priority', 'category__priority', 'category__allow_pois' 'color', 'category', 'priority', 'category__priority', 'category__allow_pois'

View file

@ -20,6 +20,7 @@ from rest_framework.viewsets import GenericViewSet, ReadOnlyModelViewSet, ViewSe
from c3nav.mapdata.models import AccessRestriction, Building, Door, Hole, LocationGroup, MapUpdate, Source, Space from c3nav.mapdata.models import AccessRestriction, Building, Door, Hole, LocationGroup, MapUpdate, Source, Space
from c3nav.mapdata.models.access import AccessPermission, AccessRestrictionGroup from c3nav.mapdata.models.access import AccessPermission, AccessRestrictionGroup
from c3nav.mapdata.models.geometry.base import GeometryMixin
from c3nav.mapdata.models.geometry.level import LevelGeometryMixin from c3nav.mapdata.models.geometry.level import LevelGeometryMixin
from c3nav.mapdata.models.geometry.space import (POI, Area, Column, CrossDescription, LeaveDescription, LineObstacle, from c3nav.mapdata.models.geometry.space import (POI, Area, Column, CrossDescription, LeaveDescription, LineObstacle,
Obstacle, Ramp, SpaceGeometryMixin, Stair) Obstacle, Ramp, SpaceGeometryMixin, Stair)
@ -67,7 +68,8 @@ def api_etag(permissions=True, etag_func=AccessPermission.etag_func, cache_param
response = Response(data) response = Response(data)
if response is None: if response is None:
response = func(self, request, *args, **kwargs) with GeometryMixin.dont_keep_originals():
response = func(self, request, *args, **kwargs)
if cache_parameters is not None and response.status_code == 200: if cache_parameters is not None and response.status_code == 200:
cache.set(cache_key, response.data, 300) cache.set(cache_key, response.data, 300)

View file

@ -1,4 +1,5 @@
import math import math
from contextlib import contextmanager
from django.db import models from django.db import models
from django.utils.functional import cached_property from django.utils.functional import cached_property
@ -14,6 +15,8 @@ geometry_affecting_fields = ('height', 'width', 'access_restriction')
class GeometryMixin(SerializableMixin): class GeometryMixin(SerializableMixin):
no_orig = False
""" """
A map feature with a geometry A map feature with a geometry
""" """
@ -25,11 +28,20 @@ class GeometryMixin(SerializableMixin):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry if not self.no_orig:
self._orig = {field.attname: (None if field.attname in self.get_deferred_fields() self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
else getattr(self, field.attname)) self._orig = {field.attname: (None if field.attname in self.get_deferred_fields()
for field in self._meta.get_fields() else getattr(self, field.attname))
if field.name in geometry_affecting_fields} for field in self._meta.get_fields()
if field.name in geometry_affecting_fields}
@classmethod
@contextmanager
def dont_keep_originals(cls):
# to do: invert this and to no_orig being True by default
cls.no_orig = True
yield
cls.no_orig = False
def get_geojson_properties(self, *args, **kwargs) -> dict: def get_geojson_properties(self, *args, **kwargs) -> dict:
result = { result = {