final, ok for indirect recursion too . ########## import sqlalchemy
def join_via( keys, mapper): '''Query.join_via, input root mapper, return last mapper/table; alias and link properly recursive /self-referential joins ''' clause = None c = None self_table = None self_colequivalents = None xmappers = [mapper] #mapper === parent for key in keys: prop = mapper.props[key] c = prop.get_join( mapper) #SA rev>=2285 parent_table = self_table self_table = prop.target parent_colequivalents = self_colequivalents self_colequivalents = prop.mapper._get_inherited_column_equivalents() print key,prop.primaryjoin,prop.foreignkey,prop.remote_side if prop.mapper in xmappers: self_table = self_table.alias() print '>>', self_table.name c.accept_visitor( sqlalchemy.sql_util.ClauseAdapter( self_table, include=prop.remote_side, equivalents= self_colequivalents )) xmappers.append( prop.mapper) if mapper in xmappers: if parent_table: c.accept_visitor( sqlalchemy.sql_util.ClauseAdapter( parent_table, include=prop.foreignkey, equivalents= parent_colequivalents )) print '>>>', c if clause is None: clause = c else: clause &= c mapper = prop.mapper return clause, mapper, self_table ########## Anyone interested in the resulting expression-translator? It is independent from the sawrap-per, although will be used inside. e.g. convert plain python-func/method def myfilter( person): return ( (person.friend.address.owner.friend.age > 20) & person.name.startswith('a') ) into SA-query... --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---