From adf90a8263d86f54ff331759be72b65aa2d6cd26 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Fri, 10 Apr 2020 00:57:41 +0300 Subject: [PATCH] Split basic and regex search functions --- eos/db/gamedata/queries.py | 24 +++++++++++++++++++++++- service/market.py | 4 ++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index 8a01e4dec..c88283bfb 100644 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -303,8 +303,30 @@ def getItemsByCategory(filter, where=None, eager=None): filter).all() +@cachedQuery(3, "where", "nameLike", "join") +def searchItems(nameLike, where=None, join=None, eager=None): + if not isinstance(nameLike, str): + raise TypeError("Need string as argument") + + if join is None: + join = tuple() + + if not hasattr(join, "__iter__"): + join = (join,) + + items = gamedata_session.query(Item).options(*processEager(eager)).join(*join) + for token in nameLike.split(' '): + token_safe = "%{0}%".format(sqlizeString(token)) + if where is not None: + items = items.filter(and_(Item.name.like(token_safe, escape="\\"), where)) + else: + items = items.filter(Item.name.like(token_safe, escape="\\")) + items = items.limit(100).all() + return items + + @cachedQuery(3, "tokens", "where", "join") -def searchItems(tokens, where=None, join=None, eager=None): +def searchItemsRegex(tokens, where=None, join=None, eager=None): if not isinstance(tokens, (tuple, list)) or not all(isinstance(t, str) for t in tokens): raise TypeError("Need tuple or list of strings as argument") diff --git a/service/market.py b/service/market.py index 305be6511..a67fbb4e4 100644 --- a/service/market.py +++ b/service/market.py @@ -153,7 +153,7 @@ class SearchWorkerThread(threading.Thread): all_results = set() if len(' '.join(requestTokens)) >= config.minItemSearchLength: for filter_ in filters: - filtered_results = eos.db.searchItems( + filtered_results = eos.db.searchItemsRegex( requestTokens, where=filter_, join=(types_Item.group, types_Group.category), eager=("group.category", "metaGroup")) @@ -846,7 +846,7 @@ class Market: def searchShips(self, name): """Find ships according to given text pattern""" filter_ = types_Category.name.in_(["Ship", "Structure"]) - results = eos.db.searchItems(name.split(), where=filter_, + results = eos.db.searchItems(name, where=filter_, join=(types_Item.group, types_Group.category), eager=("group.category", "metaGroup")) ships = set()