Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

68 wiersze
1.7 KiB

  1. from pypika.functions import *
  2. from pypika.terms import Function, CustomFunction, ArithmeticExpression, Arithmetic
  3. from frappe.query_builder.utils import ImportMapper, db_type_is
  4. from frappe.query_builder.custom import GROUP_CONCAT, STRING_AGG, MATCH, TO_TSVECTOR
  5. from frappe.database.query import Query
  6. from .utils import Column
  7. class Concat_ws(Function):
  8. def __init__(self, *terms, **kwargs):
  9. super(Concat_ws, self).__init__("CONCAT_WS", *terms, **kwargs)
  10. GroupConcat = ImportMapper(
  11. {
  12. db_type_is.MARIADB: GROUP_CONCAT,
  13. db_type_is.POSTGRES: STRING_AGG
  14. }
  15. )
  16. Match = ImportMapper(
  17. {
  18. db_type_is.MARIADB: MATCH,
  19. db_type_is.POSTGRES: TO_TSVECTOR
  20. }
  21. )
  22. class _PostgresTimestamp(ArithmeticExpression):
  23. def __init__(self, datepart, timepart, alias=None):
  24. if isinstance(datepart, str):
  25. datepart = Cast(datepart, "date")
  26. if isinstance(timepart, str):
  27. timepart = Cast(timepart, "time")
  28. super().__init__(operator=Arithmetic.add,
  29. left=datepart, right=timepart, alias=alias)
  30. CombineDatetime = ImportMapper(
  31. {
  32. db_type_is.MARIADB: CustomFunction("TIMESTAMP", ["date", "time"]),
  33. db_type_is.POSTGRES: _PostgresTimestamp,
  34. }
  35. )
  36. def _aggregate(function, dt, fieldname, filters, **kwargs):
  37. return (
  38. Query()
  39. .build_conditions(dt, filters)
  40. .select(function(Column(fieldname)))
  41. .run(**kwargs)[0][0]
  42. or 0
  43. )
  44. def _max(dt, fieldname, filters=None, **kwargs):
  45. return _aggregate(Max, dt, fieldname, filters, **kwargs)
  46. def _min(dt, fieldname, filters=None, **kwargs):
  47. return _aggregate(Min, dt, fieldname, filters, **kwargs)
  48. def _avg(dt, fieldname, filters=None, **kwargs):
  49. return _aggregate(Avg, dt, fieldname, filters, **kwargs)
  50. def _sum(dt, fieldname, filters=None, **kwargs):
  51. return _aggregate(Sum, dt, fieldname, filters, **kwargs)