Remove RawTextQuery.changeQuery in favor of getNewFullQuery

Also includes the following:
- Introduce typing in RawTextQuery
- Remove an outdated description based on the change
- Refactor setting the autocomplete_location, its more clear to set the
variable in the construct instead of within the method
- Update unit tests to reflect the new method

rephrasing

format

undo change
This commit is contained in:
Grant Lanham 2024-06-15 22:43:45 -04:00
parent f5eb56b63f
commit 81f0cb01e8
4 changed files with 39 additions and 25 deletions

View File

@ -1,9 +1,9 @@
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
# pylint: disable=invalid-name, missing-module-docstring, missing-class-docstring # pylint: disable=invalid-name, missing-module-docstring, missing-class-docstring
from __future__ import annotations
from abc import abstractmethod, ABC from abc import abstractmethod, ABC
import re import re
from searx import settings from searx import settings
from searx.sxng_locales import sxng_locales from searx.sxng_locales import sxng_locales
from searx.engines import categories, engines, engine_shortcuts from searx.engines import categories, engines, engine_shortcuts
@ -271,16 +271,19 @@ class RawTextQuery:
self.specific = False self.specific = False
self.autocomplete_list = [] self.autocomplete_list = []
# internal properties # internal properties
self.query_parts = [] # use self.getFullQuery() self.query_parts = [] # use self.getFullQuery() or self.getNewFullQuery(query)
self.user_query_parts = [] # use self.getQuery() self.user_query_parts = [] # use self.getQuery()
self.autocomplete_location = None
self.redirect_to_first_result = False self.redirect_to_first_result = False
self._parse_query() self.autocomplete_location = self._parse_query()
def _parse_query(self): def _parse_query(self):
""" """
parse self.query, if tags are set, which parse self.query, if tags are set, which
change the search engine or search-language change the search engine or search-language
Returns a tuple:
[0] The query parts as a list
[1] The indexor into the above list
""" """
# split query, including whitespaces # split query, including whitespaces
@ -306,28 +309,33 @@ class RawTextQuery:
qlist.append(query_part) qlist.append(query_part)
last_index_location = (qlist, len(qlist) - 1) last_index_location = (qlist, len(qlist) - 1)
self.autocomplete_location = last_index_location return last_index_location
def get_autocomplete_full_query(self, text): def get_autocomplete_full_query(self, text: str) -> str:
assert self.autocomplete_location is not None
qlist, position = self.autocomplete_location qlist, position = self.autocomplete_location
qlist[position] = text qlist[position] = text
return self.getFullQuery() return self.getFullQuery()
def changeQuery(self, query): def getNewFullQuery(self, query: str):
self.user_query_parts = query.strip().split() """
self.query = self.getFullQuery() Generate a new FullQuery based on the input query rather than the internal
self.autocomplete_location = (self.user_query_parts, len(self.user_query_parts) - 1) user_query_parts
self.autocomplete_list = [] """
return self return RawTextQuery._getFullQuery(self.query_parts, query.strip())
def getQuery(self): def getQuery(self) -> str:
return ' '.join(self.user_query_parts) return ' '.join(self.user_query_parts)
def getFullQuery(self): def getFullQuery(self) -> str:
""" """
get full query including whitespaces Get full query including whitespaces
""" """
return '{0} {1}'.format(' '.join(self.query_parts), self.getQuery()).strip() return RawTextQuery._getFullQuery(self.query_parts, self.getQuery())
@staticmethod
def _getFullQuery(query_parts: list[str], query: str) -> str:
return '{0} {1}'.format(' '.join(query_parts), query).strip()
def __str__(self): def __str__(self):
return self.getFullQuery() return self.getFullQuery()

View File

@ -144,6 +144,7 @@ class EngineProcessor(ABC):
- A page-number > 1 when engine does not support paging. - A page-number > 1 when engine does not support paging.
- A time range when the engine does not support time range. - A time range when the engine does not support time range.
""" """
# if paging is not supported, skip # if paging is not supported, skip
if search_query.pageno > 1 and not self.engine.paging: if search_query.pageno > 1 and not self.engine.paging:
return None return None

View File

@ -749,14 +749,14 @@ def search():
# suggestions: use RawTextQuery to get the suggestion URLs with the same bang # suggestions: use RawTextQuery to get the suggestion URLs with the same bang
suggestion_urls = list( suggestion_urls = list(
map( map(
lambda suggestion: {'url': raw_text_query.changeQuery(suggestion).getFullQuery(), 'title': suggestion}, lambda suggestion: {'url': raw_text_query.getNewFullQuery(suggestion), 'title': suggestion},
result_container.suggestions, result_container.suggestions,
) )
) )
correction_urls = list( correction_urls = list(
map( map(
lambda correction: {'url': raw_text_query.changeQuery(correction).getFullQuery(), 'title': correction}, lambda correction: {'url': raw_text_query.getNewFullQuery(correction), 'title': correction},
result_container.corrections, result_container.corrections,
) )
) )
@ -840,10 +840,8 @@ def autocompleter():
backend_name = request.preferences.get_value('autocomplete') backend_name = request.preferences.get_value('autocomplete')
for result in search_autocomplete(backend_name, sug_prefix, sxng_locale): for result in search_autocomplete(backend_name, sug_prefix, sxng_locale):
# attention: this loop will change raw_text_query object and this is
# the reason why the sug_prefix was stored before (see above)
if result != sug_prefix: if result != sug_prefix:
results.append(raw_text_query.changeQuery(result).getFullQuery()) results.append(raw_text_query.getNewFullQuery(result))
if len(raw_text_query.autocomplete_list) > 0: if len(raw_text_query.autocomplete_list) > 0:
for autocomplete_text in raw_text_query.autocomplete_list: for autocomplete_text in raw_text_query.autocomplete_list:

View File

@ -51,12 +51,19 @@ class TestQuery(SearxTestCase): # pylint:disable=missing-class-docstring
r = repr(query) r = repr(query)
self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' ")) self.assertTrue(r.startswith(f"<RawTextQuery query='{query_text}' "))
def test_change_query(self): def test_get_new_full_query(self):
query_text = '<8 the query' query_text = '<8 the query'
query = RawTextQuery(query_text, []) query = RawTextQuery(query_text, [])
another_query = query.changeQuery('another text') full_query = query.getFullQuery()
self.assertEqual(query, another_query) new_full_query = query.getNewFullQuery('another text')
self.assertEqual(query.getFullQuery(), '<8 another text') self.assertNotEqual(full_query, new_full_query)
def test_get_new_full_query_trim(self):
query_text = 'foo bar'
query = RawTextQuery(query_text, [])
new_query = 'bizz bazz'
new_full_query = query.getNewFullQuery(" " + new_query + " ")
self.assertEqual(new_query, new_full_query)
class TestLanguageParser(SearxTestCase): # pylint:disable=missing-class-docstring class TestLanguageParser(SearxTestCase): # pylint:disable=missing-class-docstring