don't lock all mapupates during AltitudeArea.recalculate()
This commit is contained in:
parent
aaabc7e37c
commit
69bacc321f
1 changed files with 38 additions and 40 deletions
|
@ -439,51 +439,49 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
|||
level_areas[level] = set(area.tmpid for area in level_areas.get(level, []))
|
||||
|
||||
# save to database
|
||||
from c3nav.mapdata.models import MapUpdate
|
||||
with MapUpdate.lock():
|
||||
areas_to_save = set(range(len(areas)))
|
||||
areas_to_save = set(range(len(areas)))
|
||||
|
||||
all_candidates = AltitudeArea.objects.select_related('level')
|
||||
for candidate in all_candidates:
|
||||
candidate.area = candidate.geometry.area
|
||||
all_candidates = sorted(all_candidates, key=attrgetter('area'), reverse=True)
|
||||
all_candidates = AltitudeArea.objects.select_related('level')
|
||||
for candidate in all_candidates:
|
||||
candidate.area = candidate.geometry.area
|
||||
all_candidates = sorted(all_candidates, key=attrgetter('area'), reverse=True)
|
||||
|
||||
num_modified = 0
|
||||
num_deleted = 0
|
||||
num_created = 0
|
||||
num_modified = 0
|
||||
num_deleted = 0
|
||||
num_created = 0
|
||||
|
||||
for candidate in all_candidates:
|
||||
new_area = None
|
||||
for tmpid in level_areas.get(candidate.level, set()):
|
||||
area = areas[tmpid]
|
||||
if area.geometry.almost_equals(candidate.geometry, 1):
|
||||
new_area = area
|
||||
break
|
||||
for candidate in all_candidates:
|
||||
new_area = None
|
||||
for tmpid in level_areas.get(candidate.level, set()):
|
||||
area = areas[tmpid]
|
||||
if area.geometry.almost_equals(candidate.geometry, 1):
|
||||
new_area = area
|
||||
break
|
||||
|
||||
if new_area is None:
|
||||
potential_areas = [(tmpid, areas[tmpid].geometry.intersection(candidate.geometry.buffer(0)).area)
|
||||
for tmpid in level_areas.get(candidate.level, set())]
|
||||
potential_areas = [(tmpid, size) for tmpid, size in potential_areas
|
||||
if candidate.area and size/candidate.area > 0.9]
|
||||
if potential_areas:
|
||||
num_modified += 1
|
||||
new_area = areas[max(potential_areas, key=itemgetter(1))[0]]
|
||||
if new_area is None:
|
||||
potential_areas = [(tmpid, areas[tmpid].geometry.intersection(candidate.geometry.buffer(0)).area)
|
||||
for tmpid in level_areas.get(candidate.level, set())]
|
||||
potential_areas = [(tmpid, size) for tmpid, size in potential_areas
|
||||
if candidate.area and size/candidate.area > 0.9]
|
||||
if potential_areas:
|
||||
num_modified += 1
|
||||
new_area = areas[max(potential_areas, key=itemgetter(1))[0]]
|
||||
|
||||
if new_area is None:
|
||||
candidate.delete()
|
||||
num_deleted += 1
|
||||
continue
|
||||
if new_area is None:
|
||||
candidate.delete()
|
||||
num_deleted += 1
|
||||
continue
|
||||
|
||||
candidate.geometry = new_area.geometry
|
||||
candidate.altitude = new_area.altitude
|
||||
candidate.save()
|
||||
areas_to_save.discard(new_area.tmpid)
|
||||
level_areas[new_area.level].discard(new_area.tmpid)
|
||||
candidate.geometry = new_area.geometry
|
||||
candidate.altitude = new_area.altitude
|
||||
candidate.save()
|
||||
areas_to_save.discard(new_area.tmpid)
|
||||
level_areas[new_area.level].discard(new_area.tmpid)
|
||||
|
||||
for tmpid in areas_to_save:
|
||||
num_created += 1
|
||||
areas[tmpid].save()
|
||||
for tmpid in areas_to_save:
|
||||
num_created += 1
|
||||
areas[tmpid].save()
|
||||
|
||||
logger = logging.getLogger('c3nav')
|
||||
logger.info(_('%d altitude areas built.') % len(areas))
|
||||
logger.info(_('%d modified, %d deleted, %d created.') % (num_modified, num_deleted, num_created))
|
||||
logger = logging.getLogger('c3nav')
|
||||
logger.info(_('%d altitude areas built.') % len(areas))
|
||||
logger.info(_('%d modified, %d deleted, %d created.') % (num_modified, num_deleted, num_created))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue