def mark_tile_updated(cls, tile_key_name, gt_key_name=None): """Insert points that are not in the GeoTree.""" if not gt_key_name: gt_key_name = cls._GEO_TREE_KEY gt = cls.get_by_key_name(gt_key_name) if gt: tiles = sorted_tiles_set(gt.tiles_updated) tiles_new = sorted_tiles_set([tile_key_name]) tiles.extend(tiles_new) gt.tiles_updated = list(tiles) else: gt = cls(key_name=gt_key_name, number_points = len(points_list), tiles_updated = list(sorted_tiles_set(tile_keys)) ) gt.put()
def remove_from_geotree_by_key_name(cls, key_name, coord, gt_key_name=None, max_z=None): """this method removes mentionings of a point from geotree coord is GeoPtProperty the points itself is not changed (it may not even exist in datastore) """ #delete from native tile if not gt_key_name: gt_key_name = cls._GEO_TREE_KEY if not max_z: max_z = get_max_z(gt_key_name) tile_str = tile_tuple_to_str(lat_lon_to_tile(coord.lat, coord.lon, max_z)) tile_key_name = '%s,%s' % (tile_str,gt_key_name) logging.debug(tile_key_name) t = Tile.get_by_key_name(tile_key_name) points = json.loads(t.points_native) for i in range(len(points)): if points[i]['key_name'] == key_name: del(points[i]) break t.points_native = json.dumps(points) t.put() #mark this tile updated and update all tiles gt = cls.get_by_key_name(gt_key_name) tiles_updated = sorted_tiles_set(gt.tiles_updated) tiles_updated.insert(tile_key_name) gt.tiles_updated = list(tiles_updated) #decrease points count gt.number_points -= 1 gt.put() gt.update_tiles()
def remove_point_by_key_name(cls, key_name, gt_key_name=None, max_z=None): #delete from native tile if not gt_key_name: gt_key_name = cls._GEO_TREE_KEY if not max_z: max_z = get_max_z(gt_key_name) p = Point.get_by_key_name(key_name) tile_str = tile_tuple_to_str(lat_lon_to_tile(p.coord.lat, p.coord.lon, max_z)) tile_key_name = '%s,%s' % (tile_str,gt_key_name) t = Tile.get_by_key_name(tile_key_name) points = json.loads(t.points_native) for i in range(len(points)): if points[i]['key_name'] == key_name: del(points[i]) break t.points_native = json.dumps(points) t.put() #mark this tile updated and update all tiles gt = cls.get_by_key_name(gt_key_name) tiles_updated = sorted_tiles_set(gt.tiles_updated) tiles_updated.insert(tile_key_name) gt.tiles_updated = list(tiles_updated) #decrease points count gt.number_points -= 1 gt.put() gt.update_tiles() #delete point p.delete()
def test_insertion(self): l = sorted_tiles_set(self.normal_list) # insert existing tile l.insert('0,0,2') self.assertEqual(len(l), 5) # insert another existing tile in the middle l.insert('1,2,3') self.assertEqual(len(l), 5) # insert nonexistent tile in the beginning l.insert('1,2,4') self.assertEqual(len(l), 6) # insert nonexistent tile at the end l.insert('0,0,1') self.assertEqual(len(l), 7) # insert nonexistent tile in the middle l.insert('1,0,3') self.assertEqual(len(l), 8) # check that remains sorted # tiles with large z are earlier zs = [int(s.split(',')[:3][-1]) for s in l] for i in range(len(zs) - 1): self.assertTrue(zs[i] >= zs[i + 1])
def test_insertion(self): l = sorted_tiles_set(self.normal_list) # insert existing tile l.insert('0,0,2') self.assertEqual(len(l),5) # insert another existing tile in the middle l.insert('1,2,3') self.assertEqual(len(l),5) # insert nonexistent tile in the beginning l.insert('1,2,4') self.assertEqual(len(l),6) # insert nonexistent tile at the end l.insert('0,0,1') self.assertEqual(len(l),7) # insert nonexistent tile in the middle l.insert('1,0,3') self.assertEqual(len(l),8) # check that remains sorted # tiles with large z are earlier zs = [int(s.split(',')[:3][-1]) for s in l] for i in range(len(zs)-1): self.assertTrue(zs[i]>=zs[i+1])
def test_removal(self): l = sorted_tiles_set(self.normal_list) len_initial = len(l) l.remove(['0,0,2,a', '1,2,3,a']) self.assertFalse('0,0,2,a' in l) self.assertFalse('1,2,3,a' in l) self.assertTrue(len(l) == len_initial - 2) l.remove('2,2,3,a') self.assertTrue(len(l) == len_initial - 3)
def test_removal(self): l = sorted_tiles_set(self.normal_list) len_initial = len(l) l.remove(['0,0,2,a','1,2,3,a']) self.assertFalse('0,0,2,a' in l) self.assertFalse('1,2,3,a' in l) self.assertTrue(len(l)==len_initial-2) l.remove('2,2,3,a') self.assertTrue(len(l)==len_initial-3)
def insert_points_list(cls, points_list, gt_key_name=None, max_z=None): """Insert points that are not in the GeoTree.""" if not gt_key_name: gt_key_name = cls._GEO_TREE_KEY tile_keys = [] for p in points_list: tile_keys.append(p.insert_to_tile(gt_key_name=gt_key_name, max_z=max_z)) gt = cls.get_by_key_name(gt_key_name) if gt: gt.number_points += len(points_list) tiles = sorted_tiles_set(gt.tiles_updated) tiles_new = sorted_tiles_set(tile_keys) tiles.extend(tiles_new) gt.tiles_updated = list(tiles) else: gt = cls(key_name=gt_key_name, number_points = len(points_list), tiles_updated = list(sorted_tiles_set(tile_keys)) ) gt.put() return True
def test_initialization(self): """test that sorted set is initialized """ l = sorted_tiles_set(self.normal_list) # no repeated tiles self.assertEqual(len(l), 5) # tiles with large z are earlier zs = [int(s.split(',')[:3][-1]) for s in l] for i in range(len(zs) - 1): self.assertTrue(zs[i] >= zs[i + 1])
def test_initialization(self): """test that sorted set is initialized """ l = sorted_tiles_set(self.normal_list) # no repeated tiles self.assertEqual(len(l),5) # tiles with large z are earlier zs = [int(s.split(',')[:3][-1]) for s in l] for i in range(len(zs)-1): self.assertTrue(zs[i]>=zs[i+1])
def test_extension(self): l = sorted_tiles_set(self.normal_list) # extend by the same list l.extend(l) self.assertEqual(len(l), 5) # extend by list with nonexistent tiles l.extend(['1,2,2', '0,0,3']) self.assertEqual(len(l), 7) # extend by one existing and one not tiles l.extend(['2,2,2', '0,0,3']) self.assertEqual(len(l), 8) self.assertTrue('2,2,2' in l)
def test_extension(self): l = sorted_tiles_set(self.normal_list) # extend by the same list l.extend(l) self.assertEqual(len(l),5) # extend by list with nonexistent tiles l.extend(['1,2,2','0,0,3']) self.assertEqual(len(l),7) # extend by one existing and one not tiles l.extend(['2,2,2','0,0,3']) self.assertEqual(len(l),8) self.assertTrue('2,2,2' in l)
def update_tiles(cls, count=config.COUNT_UPDATE, gt_key_name=None): """Update several tiles and puts them into datastore.""" if not gt_key_name: gt_key_name = cls._GEO_TREE_KEY gt = cls.get_by_key_name(gt_key_name) if gt: # check if the first tile has larger z than min_z, if not - nothing to update logging.debug(gt_key_name) logging.debug(gt.tiles_updated) x,y,z = tile_str_to_tuple(gt.tiles_updated[0]) min_z = get_min_z(gt_key_name) if not (z > min_z): r = '\n\nInfo: updated 0 tiles, nothing to update' return r needs_update = True count_updated = 0 while count_updated < count and needs_update: # get a group of tiles with a common parent (starting with the first) first_tile = gt.tiles_updated[0] p = tile_parent(first_tile,return_str=True) c = tile_children(p,return_str=True) c_in_updated = [first_tile] for t in gt.tiles_updated[1:]: if t in c: c_in_updated.append(t) # update parent, use all children for update t = cls.update_tile(p, c, gt_key_name=gt_key_name) t.put() # remove the group of updated children tiles from tiles_updated tiles_updated = sorted_tiles_set(gt.tiles_updated) tiles_updated.remove(c_in_updated) # insert updated tile tiles_updated.insert(p) gt.tiles_updated = list(tiles_updated) gt.put() # check if the first tile has smaller z than min_z, if not needs_update = False x,y,z = tile_str_to_tuple(tiles_updated[0]) min_z = get_min_z(gt_key_name) if z == min_z: needs_update = False # increase count_updated count_updated += 1 else: return '\n\nError: no GeoTree exists'