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)
|
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'
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue