On Thu, Apr 19, 2018 at 9:52 AM, Антонио Антуан <a.ch....@gmail.com> wrote: > So, anyway, I must implement BitAnd class? Or I can check if 'element.op == > &' inside compile function?
uh sure you can do that, it would be sqlalchemy.sql.operators.and_op or something like that > > чт, 19 апр. 2018 г., 16:31 Mike Bayer <mike...@zzzcomputing.com>: >> >> On Thu, Apr 19, 2018 at 5:21 AM, Антонио Антуан <a.ch....@gmail.com> >> wrote: >> > Hi guys. >> > >> > Is there any mechanism in SQLAlchemy which allows to redefine operator >> > compilation? I want to the same thing as already exists for functions. >> > An example for functions: >> > >> > >> > class IntDiv(GenericFunction): >> > type = Integer >> > package = 'adc_custom' >> > name = 'div' >> > identifier = 'div' >> > >> > >> > @compiles(IntDiv) >> > def visit_div_default(element, compiler, **kwargs): >> > params = [compiler.process(c.self_group()) for c in >> > element.clause_expr.element.get_children()] >> > return '%s / %s' % (params[0], params[1]) >> > >> > >> > @compiles(IntDiv, 'clickhouse') >> > def visit_div_ch(element, compiler, **kwargs): >> > return 'intDiv(%s)' % compiler.process(element.clause_expr.element) >> > >> > What I want to do: >> > >> > class BitAdd(CustomOp): >> > pass >> > >> > @compiles(BitAdd) >> > def visit_bit_add_default(element, compiler, **kwargs): >> > return '%s & %s' % (element.left, element.right) >> > >> > >> > @compiles(IntDiv, 'clickhouse') >> > def visit_bit_add_ch(element, compiler, **kwargs): >> > return 'bitAnd(%s, %s)' % (element.left, element.right) >> > >> > Statement looks like that: >> > some_col.op('&')(some_int_flag) >> > >> > >> > I understand that I can define generic function and use it instead of >> > `.op('&')`, but at first I want to find another way. >> >> So in this case you are looking to override the compilation for >> BinaryElement in any case since you want to run a function around them >> in one case, that is the whole left/operator/right object. >> >> from sqlalchemy.sql.expression import BinaryExpression >> @compiles(BinaryExpression, "clickhouse") >> def visit_binary(element, compiler, **kw): >> if isinstance(element.operator, BitAdd): >> return "bitAnd(%s, %s)" % (compiler.process(element.left, >> **kw), compiler.process(element.right, **kw)) >> else: >> return compiler.visit_binary(element, **kw) >> >> For the part where you want op('&') to be magic, it can't work that >> way, though you can get at the '&' operator directly but you normally >> need to use a subclass of Integer: >> >> >> http://docs.sqlalchemy.org/en/latest/core/custom_types.html#redefining-and-creating-new-operators >> >> so here you'd be saying: >> >> from sqlalchemy import Integer >> >> class MyInt(Integer): >> class comparator_factory(Integer.Comparator): >> def __and__(self, other): >> return BitAnd()(self.expr, other) >> >> then you'd use the MyInt datatype in your mappings where you want your >> special operator to take place. >> >> If you want the base Integer to do this, you'd need to monkeypatch the >> comparator, this is less recommended as it can cause surprises: >> >> >> class comparator_factory_mixin(object): >> def __and__(self, other): >> return BitAnd()(self.expr, other) >> >> Integer.Comparator.__bases__ = (comparator_factory_mixin, ) + >> Integer.Comparator.__bases__ >> >> >> >> >> >> > -- >> > SQLAlchemy - >> > The Python SQL Toolkit and Object Relational Mapper >> > >> > http://www.sqlalchemy.org/ >> > >> > To post example code, please provide an MCVE: Minimal, Complete, and >> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> > description. >> > --- >> > 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 https://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. >> >> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> 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 https://groups.google.com/group/sqlalchemy. >> For more options, visit https://groups.google.com/d/optout. > > -- > > Антон > > -- > SQLAlchemy - > The Python SQL Toolkit and Object Relational Mapper > > http://www.sqlalchemy.org/ > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > --- > 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 https://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- 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 https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.