fix a bug where multiple renders of the same world led to repeat genPOI scans
the code that calls handleEntities in genPOI was building a list of all filter funcs in the config, then used itertools.groupby to walk over each region set, calling handleEntities and passing filters funcs for the rset. this works fine when all of the renders point at a different world, since rsets are sorted via __lt__ using the regiondir. when an rset appears in the config multiple times, groupby can't sort the rsets reliably, so a single rset is passed multiple times to handleEntities with only some of the applicable filters. for a config with just two renders of the same world, handleEntities would frequently be called 5-7 times instead of just 2. this change eliminates group by, and just iterates over all the rsets, each time plucking the list of applicable filters based on rset associated with each filter (simple equality).
This commit is contained in:
@@ -502,6 +502,8 @@ def main():
|
||||
filters = set()
|
||||
marker_groups = defaultdict(list)
|
||||
|
||||
logging.info("Searching renders: %s", list(config['renders']))
|
||||
|
||||
# collect all filters and get regionsets
|
||||
for rname, render in config['renders'].items():
|
||||
# Convert render['world'] to the world path, and store the original
|
||||
@@ -559,14 +561,15 @@ def main():
|
||||
markers = dict((name, dict(created=False, raw=[], name=filter_name))
|
||||
for name, filter_name, __, __, __, __ in filters)
|
||||
|
||||
all_rsets = set(map(lambda f : f[3], filters))
|
||||
logging.info("Will search %s region sets using %s filters", len(all_rsets), len(filters))
|
||||
|
||||
# apply filters to regionsets
|
||||
if not args.skipscan:
|
||||
# group filters by rset
|
||||
def keyfunc(x):
|
||||
return x[3]
|
||||
sfilters = sorted(filters, key=keyfunc)
|
||||
for rset, rset_filters in itertools.groupby(sfilters, keyfunc):
|
||||
handleEntities(rset, config, args.config, list(rset_filters), markers)
|
||||
for rset in all_rsets:
|
||||
rset_filters = list(filter(lambda f : f[3] == rset, filters))
|
||||
logging.info("Calling handleEntities for %s with %s filters", rset, len(rset_filters))
|
||||
handleEntities(rset, config, args.config, rset_filters, markers)
|
||||
|
||||
# apply filters to players
|
||||
if not args.skipplayers:
|
||||
|
||||
Reference in New Issue
Block a user