/SQLAlchemy-0.7.8/lib/sqlalchemy/sql/functions.py

# · Python · 134 lines · 119 code · 8 blank · 7 comment · 5 complexity · 837cbd9ff98b767d663cded1f4f09e73 MD5 · raw file

  1. # sql/functions.py
  2. # Copyright (C) 2005-2012 the SQLAlchemy authors and contributors <see AUTHORS file>
  3. #
  4. # This module is part of SQLAlchemy and is released under
  5. # the MIT License: http://www.opensource.org/licenses/mit-license.php
  6. from sqlalchemy import types as sqltypes, schema
  7. from sqlalchemy.sql.expression import (
  8. ClauseList, Function, _literal_as_binds, text, _type_from_args
  9. )
  10. from sqlalchemy.sql import operators
  11. from sqlalchemy.sql.visitors import VisitableType
  12. class _GenericMeta(VisitableType):
  13. def __call__(self, *args, **kwargs):
  14. args = [_literal_as_binds(c) for c in args]
  15. return type.__call__(self, *args, **kwargs)
  16. class GenericFunction(Function):
  17. __metaclass__ = _GenericMeta
  18. def __init__(self, type_=None, args=(), **kwargs):
  19. self.packagenames = []
  20. self.name = self.__class__.__name__
  21. self._bind = kwargs.get('bind', None)
  22. self.clause_expr = ClauseList(
  23. operator=operators.comma_op,
  24. group_contents=True, *args).self_group()
  25. self.type = sqltypes.to_instance(
  26. type_ or getattr(self, '__return_type__', None))
  27. class next_value(Function):
  28. """Represent the 'next value', given a :class:`.Sequence`
  29. as it's single argument.
  30. Compiles into the appropriate function on each backend,
  31. or will raise NotImplementedError if used on a backend
  32. that does not provide support for sequences.
  33. """
  34. type = sqltypes.Integer()
  35. name = "next_value"
  36. def __init__(self, seq, **kw):
  37. assert isinstance(seq, schema.Sequence), \
  38. "next_value() accepts a Sequence object as input."
  39. self._bind = kw.get('bind', None)
  40. self.sequence = seq
  41. @property
  42. def _from_objects(self):
  43. return []
  44. class AnsiFunction(GenericFunction):
  45. def __init__(self, **kwargs):
  46. GenericFunction.__init__(self, **kwargs)
  47. class ReturnTypeFromArgs(GenericFunction):
  48. """Define a function whose return type is the same as its arguments."""
  49. def __init__(self, *args, **kwargs):
  50. kwargs.setdefault('type_', _type_from_args(args))
  51. GenericFunction.__init__(self, args=args, **kwargs)
  52. class coalesce(ReturnTypeFromArgs):
  53. pass
  54. class max(ReturnTypeFromArgs):
  55. pass
  56. class min(ReturnTypeFromArgs):
  57. pass
  58. class sum(ReturnTypeFromArgs):
  59. pass
  60. class now(GenericFunction):
  61. __return_type__ = sqltypes.DateTime
  62. class concat(GenericFunction):
  63. __return_type__ = sqltypes.String
  64. def __init__(self, *args, **kwargs):
  65. GenericFunction.__init__(self, args=args, **kwargs)
  66. class char_length(GenericFunction):
  67. __return_type__ = sqltypes.Integer
  68. def __init__(self, arg, **kwargs):
  69. GenericFunction.__init__(self, args=[arg], **kwargs)
  70. class random(GenericFunction):
  71. def __init__(self, *args, **kwargs):
  72. kwargs.setdefault('type_', None)
  73. GenericFunction.__init__(self, args=args, **kwargs)
  74. class count(GenericFunction):
  75. """The ANSI COUNT aggregate function. With no arguments, emits COUNT \*."""
  76. __return_type__ = sqltypes.Integer
  77. def __init__(self, expression=None, **kwargs):
  78. if expression is None:
  79. expression = text('*')
  80. GenericFunction.__init__(self, args=(expression,), **kwargs)
  81. class current_date(AnsiFunction):
  82. __return_type__ = sqltypes.Date
  83. class current_time(AnsiFunction):
  84. __return_type__ = sqltypes.Time
  85. class current_timestamp(AnsiFunction):
  86. __return_type__ = sqltypes.DateTime
  87. class current_user(AnsiFunction):
  88. __return_type__ = sqltypes.String
  89. class localtime(AnsiFunction):
  90. __return_type__ = sqltypes.DateTime
  91. class localtimestamp(AnsiFunction):
  92. __return_type__ = sqltypes.DateTime
  93. class session_user(AnsiFunction):
  94. __return_type__ = sqltypes.String
  95. class sysdate(AnsiFunction):
  96. __return_type__ = sqltypes.DateTime
  97. class user(AnsiFunction):
  98. __return_type__ = sqltypes.String