[Sqlalchemy-commits] [4016] sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm: so this is
Brought to you by:
zzzeek
From: <co...@sq...> - 2008-01-06 00:29:41
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[4016] sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm: so this is the "barely works" version</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>4016</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2008-01-05 19:29:36 -0500 (Sat, 05 Jan 2008)</dd> </dl> <h3>Log Message</h3> <pre>so this is the "barely works" version</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchessmarter_polymorphiclibsqlalchemyormmapperpy">sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/mapper.py</a></li> <li><a href="#sqlalchemybranchessmarter_polymorphiclibsqlalchemyormquerypy">sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/query.py</a></li> <li><a href="#sqlalchemybranchessmarter_polymorphiclibsqlalchemyormutilpy">sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/util.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchessmarter_polymorphiclibsqlalchemyormmapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/mapper.py (4015 => 4016)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/mapper.py 2008-01-05 23:49:01 UTC (rev 4015) +++ sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/mapper.py 2008-01-06 00:29:36 UTC (rev 4016) </span><span class="lines">@@ -206,10 +206,27 @@ </span><span class="cx"> return prop </span><span class="cx"> </span><span class="cx"> def iterate_properties(self): </span><ins>+ """return an iterator of all MapperProperty objects attached to this mapper.""" </ins><span class="cx"> self.compile() </span><span class="cx"> return self.__props.itervalues() </span><del>- iterate_properties = property(iterate_properties, doc="returns an iterator of all MapperProperty objects.") </del><ins>+ iterate_properties = property(iterate_properties) </ins><span class="cx"> </span><ins>+ def iterate_polymorphic_properties(self): + """return an iterator of MapperProperty objects attached to this mapper and submappers. + + For the root mapper, all MapperProperty objects are iterated. For + inheriting mappers, only column-based properties are iterated. + """ + for mapper in self.polymorphic_iterator(): + if mapper is self: + for prop in mapper.iterate_properties: + yield prop + else: + for prop in mapper.iterate_properties: + if isinstance(prop, ColumnProperty): + yield prop + iterate_polymorphic_properties = property(iterate_polymorphic_properties) + </ins><span class="cx"> def properties(self): </span><span class="cx"> raise NotImplementedError("Public collection of MapperProperty objects is provided by the get_property() and iterate_properties accessors.") </span><span class="cx"> properties = property(properties) </span></span></pre></div> <a id="sqlalchemybranchessmarter_polymorphiclibsqlalchemyormquerypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/query.py (4015 => 4016)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/query.py 2008-01-05 23:49:01 UTC (rev 4015) +++ sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/query.py 2008-01-06 00:29:36 UTC (rev 4016) </span><span class="lines">@@ -957,6 +957,17 @@ </span><span class="cx"> def compile(self): </span><span class="cx"> """compiles and returns a SQL statement based on the criterion and conditions within this Query.""" </span><span class="cx"> return self._compile_context().statement </span><ins>+ + def _make_primary_adapter(self, from_obj): + return mapperutil.create_row_multi_adapter(from_obj, + [(m.local_table, m._get_equivalent_columns()) for m in self.mapper.polymorphic_iterator()] + ) + + def _make_clause_adapter(self, from_obj): + equivs = {} + for m in self.mapper.polymorphic_iterator(): + equivs.update(m._get_equivalent_columns()) + return sql_util.ClauseAdapter(from_obj, equivalents=equivs) </ins><span class="cx"> </span><span class="cx"> def _compile_context(self): </span><span class="cx"> </span><span class="lines">@@ -1011,7 +1022,11 @@ </span><span class="cx"> </span><span class="cx"> # TODO: for polymorphic, need to call select_mapper.iterate_polymorphic_properties. </span><span class="cx"> # this should be called in all cases. </span><del>- for value in self.select_mapper.iterate_properties: </del><ins>+ if self.select_mapper.polymorphic_fetch == 'union': + iterator = self.select_mapper.iterate_polymorphic_properties + else: + iterator = self.select_mapper.iterate_properties + for value in iterator: </ins><span class="cx"> if self._only_load_props and value.key not in self._only_load_props: </span><span class="cx"> continue </span><span class="cx"> context.exec_with_path(self.select_mapper, value.key, value.setup, context, only_load_props=self._only_load_props) </span><span class="lines">@@ -1067,10 +1082,15 @@ </span><span class="cx"> else: </span><span class="cx"> if adapt_criterion: </span><span class="cx"> # TODO - detect loading polymorphically, set up ClauseAdapter at the beginning </span><del>- adapter = sql_util.ClauseAdapter(from_obj, equivalents=self.mapper._get_equivalent_columns()) - context.primary_columns = [adapter.convert_element(c) for c in context.primary_columns] </del><ins>+ adapter = self._make_clause_adapter(from_obj) +# foo = [] +# for c in context.primary_columns: +# c2 = adapter.convert_element(c) +# if c2 is None: +# raise "no conversion available for "+ str(c) + " full selectable: " + str(from_obj) + context.primary_columns = [col for col in [adapter.convert_element(c) for c in context.primary_columns] if col is not None] </ins><span class="cx"> #context.primary_columns = [from_obj.corresponding_column(c) or c for c in context.primary_columns] </span><del>- self._primary_adapter = mapperutil.create_row_adapter(from_obj, self.table, equivalent_columns=self.mapper._get_equivalent_columns()) </del><ins>+ self._primary_adapter = self._make_primary_adapter(from_obj) </ins><span class="cx"> print [c.key for c in context.primary_columns] </span><span class="cx"> </span><span class="cx"> if adapt_criterion or self._distinct: </span></span></pre></div> <a id="sqlalchemybranchessmarter_polymorphiclibsqlalchemyormutilpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/util.py (4015 => 4016)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/util.py 2008-01-05 23:49:01 UTC (rev 4015) +++ sqlalchemy/branches/smarter_polymorphic/lib/sqlalchemy/orm/util.py 2008-01-06 00:29:36 UTC (rev 4016) </span><span class="lines">@@ -196,19 +196,22 @@ </span><span class="cx"> adapter class itself *is* fairly expensive so caching should be used to prevent </span><span class="cx"> repeated calls to this function. </span><span class="cx"> """ </span><ins>+ return create_row_multi_adapter(from_, [(to, equivalent_columns)]) </ins><span class="cx"> </span><ins>+def create_row_multi_adapter(from_, tuples): </ins><span class="cx"> map = {} </span><del>- for c in to.c: - corr = from_.corresponding_column(c) - if corr: - map[c] = corr - elif equivalent_columns: - if c in equivalent_columns: - for c2 in equivalent_columns[c]: - corr = from_.corresponding_column(c2) - if corr: - map[c] = corr - break </del><ins>+ for to, equivalent_columns in tuples: + for c in to.c: + corr = from_.corresponding_column(c) + if corr: + map[c] = corr + elif equivalent_columns: + if c in equivalent_columns: + for c2 in equivalent_columns[c]: + corr = from_.corresponding_column(c2) + if corr: + map[c] = corr + break </ins><span class="cx"> </span><span class="cx"> class AliasedRow(object): </span><span class="cx"> def __init__(self, row): </span></span></pre> </div> </div> </body> </html> |