Skip to content

Commit ed01a0d

Browse files
authored
Merge pull request #122 from tilezen/add_toi_loader
Add a command to load tiles of interest from file
2 parents 8c819c8 + 5e2cad4 commit ed01a0d

File tree

3 files changed

+89
-2
lines changed

3 files changed

+89
-2
lines changed

logging.conf.sample

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[loggers]
2-
keys=root,process,seed,intersect,drain,enqueue_tiles_of_interest,dump_tiles_of_interest,wof_process_neighbourhoods,query
2+
keys=root,process,seed,intersect,drain,enqueue_tiles_of_interest,dump_tiles_of_interest,load_tiles_of_interest,wof_process_neighbourhoods,query
33

44
[handlers]
55
keys=consoleHandler
@@ -23,6 +23,12 @@ handlers=consoleHandler
2323
qualName=dump_tiles_of_interest
2424
propagate=0
2525

26+
[logger_load_tiles_of_interest]
27+
level=INFO
28+
handlers=consoleHandler
29+
qualName=load_tiles_of_interest
30+
propagate=0
31+
2632
[logger_process]
2733
level=INFO
2834
handlers=consoleHandler

tilequeue/command.py

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
from tilequeue.tile import coord_int_zoom_up
2222
from tilequeue.tile import coord_marshall_int
2323
from tilequeue.tile import coord_unmarshall_int
24-
from tilequeue.tile import parse_expired_coord_string
24+
from tilequeue.tile import parse_expired_coord_string, deserialize_coord
2525
from tilequeue.tile import seed_tiles
2626
from tilequeue.tile import tile_generator_for_multiple_bounds
2727
from tilequeue.tile import tile_generator_for_single_bounds
2828
from tilequeue.tile import zoom_mask
2929
from tilequeue.top_tiles import parse_top_tiles
30+
from tilequeue.utils import grouper
3031
from tilequeue.worker import DataFetch
3132
from tilequeue.worker import ProcessAndFormatData
3233
from tilequeue.worker import QueuePrint
@@ -1214,6 +1215,79 @@ def tilequeue_dump_tiles_of_interest(cfg, peripherals):
12141215
)
12151216

12161217

1218+
def tilequeue_load_tiles_of_interest(cfg, peripherals):
1219+
"""
1220+
Given a newline-delimited file containing tile coordinates in
1221+
`zoom/column/row` format, load those tiles into a new Redis SET
1222+
alongside the existing one, then RENAME the new to the old.
1223+
"""
1224+
logger = make_logger(cfg, 'load_tiles_of_interest')
1225+
logger.info('Loading tiles of interest')
1226+
1227+
toi_filename = "toi.txt"
1228+
chunk_size = 10000
1229+
new_toi_key = cfg.redis_cache_set_key + "-new"
1230+
old_toi_key = cfg.redis_cache_set_key + "-old"
1231+
1232+
# Make a raw Redis client so we can do low-level set manipulation
1233+
redis_client = make_redis_client(cfg)
1234+
1235+
logger.info(
1236+
'Adding tiles of interest from %s to key %s',
1237+
toi_filename,
1238+
new_toi_key,
1239+
)
1240+
1241+
if redis_client.exists(new_toi_key):
1242+
raise Exception(
1243+
"Can't load new TOI because key {} exists. "
1244+
"Delete it and try again".format(new_toi_key)
1245+
)
1246+
1247+
n_added = 0
1248+
with open(toi_filename, 'r') as f:
1249+
for lines in grouper(f, chunk_size):
1250+
coords = [
1251+
coord_marshall_int(deserialize_coord(l))
1252+
for l in lines if l is not None
1253+
]
1254+
n_added += redis_client.sadd(new_toi_key, *coords)
1255+
logger.info("%s total tiles added", n_added)
1256+
1257+
logger.info(
1258+
'Finished adding %s tiles of interest from %s to key %s',
1259+
n_added,
1260+
toi_filename,
1261+
new_toi_key,
1262+
)
1263+
1264+
if redis_client.rename(cfg.redis_cache_set_key, old_toi_key):
1265+
logger.info(
1266+
'Successfully moved existing TOI at %s to %s',
1267+
cfg.redis_cache_set_key,
1268+
old_toi_key,
1269+
)
1270+
else:
1271+
raise Exception(
1272+
"Moving existing TOI failed. WARNING: There's "
1273+
"probably no TOI key and this is bad!"
1274+
)
1275+
1276+
if redis_client.rename(new_toi_key, cfg.redis_cache_set_key):
1277+
logger.info(
1278+
'Successfully moved new TOI at %s into use at %s',
1279+
new_toi_key,
1280+
cfg.redis_cache_set_key,
1281+
)
1282+
else:
1283+
raise Exception(
1284+
"Moving new TOI failed. WARNING: There's "
1285+
"probably no TOI key and this is bad!"
1286+
)
1287+
1288+
logger.info("Finished loading TOI.")
1289+
1290+
12171291
class TileArgumentParser(argparse.ArgumentParser):
12181292
def error(self, message):
12191293
sys.stderr.write('error: %s\n' % message)
@@ -1235,6 +1309,8 @@ def tilequeue_main(argv_args=None):
12351309
('intersect', create_command_parser(tilequeue_intersect)),
12361310
('dump-tiles-of-interest',
12371311
create_command_parser(tilequeue_dump_tiles_of_interest)),
1312+
('load-tiles-of-interest',
1313+
create_command_parser(tilequeue_load_tiles_of_interest)),
12381314
('enqueue-tiles-of-interest',
12391315
create_command_parser(tilequeue_enqueue_tiles_of_interest)),
12401316
('tile-size', create_command_parser(tilequeue_tile_sizes)),

tilequeue/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ def format_stacktrace_one_line(exc_info=None):
1212
stacktrace = ' | '.join([x.replace('\n', '')
1313
for x in exception_lines])
1414
return stacktrace
15+
16+
17+
def grouper(seq, size):
18+
"""Collect data into fixed-length chunks or blocks"""
19+
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))

0 commit comments

Comments
 (0)