diff options
Diffstat (limited to 'searx/answerers/statistics.py')
| -rw-r--r-- | searx/answerers/statistics.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/searx/answerers/statistics.py b/searx/answerers/statistics.py new file mode 100644 index 000000000..e6cbdd008 --- /dev/null +++ b/searx/answerers/statistics.py @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# pylint: disable=missing-module-docstring +from __future__ import annotations + +from functools import reduce +from operator import mul + +import babel +import babel.numbers +from flask_babel import gettext + +from searx.extended_types import sxng_request +from searx.result_types import Answer +from searx.result_types.answer import BaseAnswer + +from . import Answerer, AnswererInfo + +kw2func = [ + ("min", min), + ("max", max), + ("avg", lambda args: sum(args) / len(args)), + ("sum", sum), + ("prod", lambda args: reduce(mul, args, 1)), +] + + +class SXNGAnswerer(Answerer): + """Statistics functions""" + + keywords = [kw for kw, _ in kw2func] + + def info(self): + + return AnswererInfo( + name=gettext(self.__doc__), + description=gettext(f"Compute {'/'.join(self.keywords)} of the arguments"), + keywords=self.keywords, + examples=["avg 123 548 2.04 24.2"], + ) + + def answer(self, query: str) -> list[BaseAnswer]: + + results = [] + parts = query.split() + if len(parts) < 2: + return results + + ui_locale = babel.Locale.parse(sxng_request.preferences.get_value('locale'), sep='-') + + try: + args = [babel.numbers.parse_decimal(num, ui_locale, numbering_system="latn") for num in parts[1:]] + except: # pylint: disable=bare-except + # seems one of the args is not a float type, can't be converted to float + return results + + for k, func in kw2func: + if k == parts[0]: + res = func(args) + res = babel.numbers.format_decimal(res, locale=ui_locale) + f_str = ', '.join(babel.numbers.format_decimal(arg, locale=ui_locale) for arg in args) + results.append(Answer(answer=f"[{ui_locale}] {k}({f_str}) = {res} ")) + break + + return results |