0

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:
Cliff Meyers
2020-04-15 07:34:54 -04:00
parent dc6f8cfcbd
commit 0a1560431a

View File

@@ -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: