more performance improvements
This commit is contained in:
parent
170c72de2b
commit
0e6aa29e36
3 changed files with 45 additions and 23 deletions
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue