From 0a1560431a22e18aa1e958b219cb64820fd3a7c3 Mon Sep 17 00:00:00 2001 From: Cliff Meyers Date: Wed, 15 Apr 2020 07:34:54 -0400 Subject: [PATCH] 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). --- overviewer_core/aux_files/genPOI.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/overviewer_core/aux_files/genPOI.py b/overviewer_core/aux_files/genPOI.py index 2e69450..0b009e6 100644 --- a/overviewer_core/aux_files/genPOI.py +++ b/overviewer_core/aux_files/genPOI.py @@ -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: