Gmail warns you before posting something with "I've attached" and no 
attachment, but apparently Google Groups does not.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.
from sqlalchemy.sql.expression import FromClause, ColumnClause, _anonymous_label, _truncated_label, func
from sqlalchemy.ext.compiler import compiles

__all__ = ['PGSetReturningFunction', 'srfunc', 'compiles_srf']
class PGSetReturningFunction(FromClause):
    named_with_column = True

    def __init__(self, func, columns, alias=None):
        self.func = func
        self._column_args = [ ColumnClause(c) if isinstance(c, str) else c for c in columns ]
        self.name = alias or func.name
        self._from_objects = [self]

    def alias(self, name=None):
        if name is None:
            if self.named_with_column:
                name = getattr(self, 'name', None)
            name = _anonymous_label('%%(%d %s)s' % (id(self), name or 'anon'))
        return self.__class__(self.func, self.c, name)

    def column_alias(self, from_, to):
        pg = self.__class__(self.func, self.c, self.name)
        pg.c
        pg._columns[to] = pg._columns[from_]._make_proxy(pg, to)
        pg._columns.remove(pg.c[from_])
        return pg

    def column_map(self, iterable):
        pg = self.__class__(self.func, self.c, self.name)
        pg.c
        _new_columns = dict()

        for from_, to in iterable:
            _new_columns[to] = pg._columns[from_]._make_proxy(pg, to)
            pg._columns.remove(pg.c[from_])
        pg._columns.update(_new_columns)
        return pg

    def _populate_column_collection(self):
        for c in self._column_args:
            c._make_proxy(self)

    class Generator():
        def __getattr__(self, key):
            def create_function(*args, **kw):
                columns = kw['columns']
                return PGSetReturningFunction(getattr(func, key)(*args), columns)
            return create_function

srfunc = PGSetReturningFunction.Generator()

@compiles(PGSetReturningFunction)
def compile_srf(element, compiler, **kw):
    col_kwargs = kw.copy()
    col_kwargs['include_table'] = False
    alias=element.name
    if isinstance(alias, _truncated_label):
        alias = compiler._truncated_identifier("alias", alias)

    return "{function} AS {alias}({columns})".format(
        function=compiler.process(element.func, **kw),
        alias=alias,
        columns=", ".join(compiler.process(expr, **col_kwargs) for expr in element.c)
    )

series = srfunc.generate_series(1, 10, columns=['value']).alias().column_map({'value': 'v'}.items())
print(str(series))

Reply via email to