From 1a897c04192c64bed0d82deb0a8126e62ddac1e9 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Thu, 16 Apr 2020 15:13:32 +0300 Subject: [PATCH] Pass search results as set of item IDs --- eos/db/gamedata/queries.py | 10 ++++++++++ gui/builtinMarketBrowser/itemView.py | 4 +++- gui/builtinViews/implantEditor.py | 4 ++-- gui/propertyEditor.py | 3 ++- service/market.py | 11 ++++++++--- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index 8dd1c5c27..2f00c597d 100644 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -98,6 +98,16 @@ def getItem(lookfor, eager=None): raise TypeError("Need integer or string as argument") return item +@cachedQuery(1, "itemIDs") +def getItems(itemIDs, eager=None): + if not isinstance(itemIDs, (tuple, list, set)) or not all(isinstance(t, int) for t in itemIDs): + raise TypeError("Need iterable of integers as argument") + if eager is None: + items = get_gamedata_session().query(Item).filter(Item.ID.in_(itemIDs)).all() + else: + items = get_gamedata_session().query(Item).options(*processEager(eager)).filter(Item.ID.in_(itemIDs)).all() + return items + def getMutaplasmid(lookfor, eager=None): if isinstance(lookfor, int): diff --git a/gui/builtinMarketBrowser/itemView.py b/gui/builtinMarketBrowser/itemView.py index 67253c28f..a0d634f3b 100644 --- a/gui/builtinMarketBrowser/itemView.py +++ b/gui/builtinMarketBrowser/itemView.py @@ -9,6 +9,7 @@ from gui.contextMenu import ContextMenu from gui.display import Display from gui.utils.staticHelpers import DragDropHelper from service.fit import Fit +from service.market import Market pyfalog = Logger(__name__) @@ -193,10 +194,11 @@ class ItemView(Display): self.setToggles() self.filterItemStore() - def populateSearch(self, items): + def populateSearch(self, itemIDs): # If we're no longer searching, dump the results if self.marketBrowser.mode != 'search': return + items = Market.getItems(itemIDs) self.updateItemStore(items) self.setToggles() self.filterItemStore() diff --git a/gui/builtinViews/implantEditor.py b/gui/builtinViews/implantEditor.py index 8e99e0e8c..5cc1c1d72 100644 --- a/gui/builtinViews/implantEditor.py +++ b/gui/builtinViews/implantEditor.py @@ -311,12 +311,12 @@ class ItemView(d.Display): sMkt.searchItems(search, self.populateSearch, 'implants') - def populateSearch(self, items): + def populateSearch(self, itemIDs): if not self.IsShown(): self.parent.availableImplantsTree.Hide() self.Show() self.parent.Layout() - + items = Market.getItems(itemIDs) items = [i for i in items if i.group.name != 'Booster'] self.items = sorted(list(items), key=lambda i: i.name) diff --git a/gui/propertyEditor.py b/gui/propertyEditor.py index 6847bb86c..098b65a13 100644 --- a/gui/propertyEditor.py +++ b/gui/propertyEditor.py @@ -227,7 +227,8 @@ class ItemView(d.Display): return not isFittable, catname, mktgrpid, parentname, metatab, metalvl, item.name - def populateSearch(self, items): + def populateSearch(self, itemIDs): + items = Market.getItems(itemIDs) self.update(items) def populate(self, items): diff --git a/service/market.py b/service/market.py index 40559b7e4..0a4b391fe 100644 --- a/service/market.py +++ b/service/market.py @@ -159,12 +159,12 @@ class SearchWorkerThread(threading.Thread): eager=("group.category", "metaGroup")) all_results.update(filtered_results) - items = set() + item_IDs = set() # Return only published items, consult with Market service this time for item in all_results: if sMkt.getPublicityByItem(item): - items.add(item) - wx.CallAfter(callback, list(items)) + item_IDs.add(item.ID) + wx.CallAfter(callback, sorted(item_IDs)) def scheduleSearch(self, text, callback, filterName=None): self.cv.acquire() @@ -488,6 +488,11 @@ class Market: return item + @staticmethod + def getItems(itemIDs, eager=None): + items = eos.db.getItems(itemIDs, eager=eager) + return items + def getGroup(self, identity, *args, **kwargs): """Get group by its ID or name""" if isinstance(identity, types_Group):