Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
 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()
Exemplo n.º 4
0
    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])
Exemplo n.º 5
0
    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])
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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])
Exemplo n.º 10
0
    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])
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
    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'