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)
holes_geom.append(space_holes_geom.intersection(space.geometry))
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:
building.original_geometry = building.geometry
for obj in buildings:
if holes_geom_prep.intersects(obj.geometry):
obj.geometry = obj.geometry.difference(holes_geom)
if 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.extend(buildings)
@ -106,6 +108,9 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
Level = request.changeset.wrap_model('Level')
Space = request.changeset.wrap_model('Space')
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')
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(
'geometry', 'level', 'outside'
)),
Prefetch('doors', Door.objects.filter(Door.q_for_request(request))),
Prefetch('spaces__columns', Column.objects.filter(Q(access_restriction__isnull=True) |
~Column.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) | ~Column.q_for_request(request)
).only('geometry', 'space')),
Prefetch('spaces__groups', LocationGroup.objects.only(
'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)
)
@ -270,14 +278,14 @@ class EditorViewSet(EditorViewSetMixin, ViewSet):
other_spaces,
[space],
areas,
space.holes.all(),
space.stairs.all(),
space.ramps.all(),
space.obstacles.all(),
space.lineobstacles.all(),
space.columns.all(),
space.altitudemarkers.all(),
space.wifi_measurements.all().only('geometry'),
space.holes.all().only('geometry', 'space'),
space.stairs.all().only('geometry', 'space'),
space.ramps.all().only('geometry', 'space'),
space.obstacles.all().only('geometry', 'space'),
space.lineobstacles.all().only('geometry', 'width', 'space'),
space.columns.all().only('geometry', 'space'),
space.altitudemarkers.all().only('geometry', 'space'),
space.wifi_measurements.all().only('geometry', 'space'),
space.pois.filter(POI.q_for_request(request)).only('geometry', 'space').prefetch_related(
Prefetch('groups', LocationGroup.objects.only(
'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.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.space import (POI, Area, Column, CrossDescription, LeaveDescription, LineObstacle,
Obstacle, Ramp, SpaceGeometryMixin, Stair)
@ -67,7 +68,8 @@ def api_etag(permissions=True, etag_func=AccessPermission.etag_func, cache_param
response = Response(data)
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:
cache.set(cache_key, response.data, 300)

View file

@ -1,4 +1,5 @@
import math
from contextlib import contextmanager
from django.db import models
from django.utils.functional import cached_property
@ -14,6 +15,8 @@ geometry_affecting_fields = ('height', 'width', 'access_restriction')
class GeometryMixin(SerializableMixin):
no_orig = False
"""
A map feature with a geometry
"""
@ -25,11 +28,20 @@ class GeometryMixin(SerializableMixin):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
self._orig = {field.attname: (None if field.attname in self.get_deferred_fields()
else getattr(self, field.attname))
for field in self._meta.get_fields()
if field.name in geometry_affecting_fields}
if not self.no_orig:
self.orig_geometry = None if 'geometry' in self.get_deferred_fields() else self.geometry
self._orig = {field.attname: (None if field.attname in self.get_deferred_fields()
else getattr(self, field.attname))
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:
result = {