PageRenderTime 29ms CodeModel.GetById 17ms app.highlight 10ms RepoModel.GetById 0ms app.codeStats 0ms

/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
  7from sqlalchemy import types as sqltypes, schema
  8from sqlalchemy.sql.expression import (
  9    ClauseList, Function, _literal_as_binds, text, _type_from_args
 10    )
 11from sqlalchemy.sql import operators
 12from sqlalchemy.sql.visitors import VisitableType
 13
 14class _GenericMeta(VisitableType):
 15    def __call__(self, *args, **kwargs):
 16        args = [_literal_as_binds(c) for c in args]
 17        return type.__call__(self, *args, **kwargs)
 18
 19class GenericFunction(Function):
 20    __metaclass__ = _GenericMeta
 21
 22    def __init__(self, type_=None, args=(), **kwargs):
 23        self.packagenames = []
 24        self.name = self.__class__.__name__
 25        self._bind = kwargs.get('bind', None)
 26        self.clause_expr = ClauseList(
 27                operator=operators.comma_op,
 28                group_contents=True, *args).self_group()
 29        self.type = sqltypes.to_instance(
 30            type_ or getattr(self, '__return_type__', None))
 31
 32
 33class next_value(Function):
 34    """Represent the 'next value', given a :class:`.Sequence`
 35    as it's single argument.
 36    
 37    Compiles into the appropriate function on each backend,
 38    or will raise NotImplementedError if used on a backend
 39    that does not provide support for sequences.
 40    
 41    """
 42    type = sqltypes.Integer()
 43    name = "next_value"
 44
 45    def __init__(self, seq, **kw):
 46        assert isinstance(seq, schema.Sequence), \
 47                "next_value() accepts a Sequence object as input."
 48        self._bind = kw.get('bind', None)
 49        self.sequence = seq
 50
 51    @property
 52    def _from_objects(self):
 53        return []
 54
 55class AnsiFunction(GenericFunction):
 56    def __init__(self, **kwargs):
 57        GenericFunction.__init__(self, **kwargs)
 58
 59class ReturnTypeFromArgs(GenericFunction):
 60    """Define a function whose return type is the same as its arguments."""
 61
 62    def __init__(self, *args, **kwargs):
 63        kwargs.setdefault('type_', _type_from_args(args))
 64        GenericFunction.__init__(self, args=args, **kwargs)
 65
 66class coalesce(ReturnTypeFromArgs):
 67    pass
 68
 69class max(ReturnTypeFromArgs):
 70    pass
 71
 72class min(ReturnTypeFromArgs):
 73    pass
 74
 75class sum(ReturnTypeFromArgs):
 76    pass
 77
 78
 79class now(GenericFunction):
 80    __return_type__ = sqltypes.DateTime
 81
 82class concat(GenericFunction):
 83    __return_type__ = sqltypes.String
 84    def __init__(self, *args, **kwargs):
 85        GenericFunction.__init__(self, args=args, **kwargs)
 86
 87class char_length(GenericFunction):
 88    __return_type__ = sqltypes.Integer
 89
 90    def __init__(self, arg, **kwargs):
 91        GenericFunction.__init__(self, args=[arg], **kwargs)
 92
 93class random(GenericFunction):
 94    def __init__(self, *args, **kwargs):
 95        kwargs.setdefault('type_', None)
 96        GenericFunction.__init__(self, args=args, **kwargs)
 97
 98class count(GenericFunction):
 99    """The ANSI COUNT aggregate function.  With no arguments, emits COUNT \*."""
100
101    __return_type__ = sqltypes.Integer
102
103    def __init__(self, expression=None, **kwargs):
104        if expression is None:
105            expression = text('*')
106        GenericFunction.__init__(self, args=(expression,), **kwargs)
107
108class current_date(AnsiFunction):
109    __return_type__ = sqltypes.Date
110
111class current_time(AnsiFunction):
112    __return_type__ = sqltypes.Time
113
114class current_timestamp(AnsiFunction):
115    __return_type__ = sqltypes.DateTime
116
117class current_user(AnsiFunction):
118    __return_type__ = sqltypes.String
119
120class localtime(AnsiFunction):
121    __return_type__ = sqltypes.DateTime
122
123class localtimestamp(AnsiFunction):
124    __return_type__ = sqltypes.DateTime
125
126class session_user(AnsiFunction):
127    __return_type__ = sqltypes.String
128
129class sysdate(AnsiFunction):
130    __return_type__ = sqltypes.DateTime
131
132class user(AnsiFunction):
133    __return_type__ = sqltypes.String
134