--- a/entity.py Tue May 24 10:33:43 2011 +0200
+++ b/entity.py Wed May 25 08:35:20 2011 +0200
@@ -62,6 +62,23 @@
return True
+def remove_ambiguous_rels(attr_set, subjtypes, schema):
+ '''remove from `attr_set` the relations of entity types `subjtypes` that have
+ different entity type sets as target'''
+ for attr in attr_set.copy():
+ rschema = schema.rschema(attr)
+ if rschema.final:
+ continue
+ ttypes = None
+ for subjtype in subjtypes:
+ cur_ttypes = rschema.objects(subjtype)
+ if ttypes is None:
+ ttypes = cur_ttypes
+ elif cur_ttypes != ttypes:
+ attr_set.remove(attr)
+ break
+
+
class Entity(AppObject):
"""an entity instance has e_schema automagically set on
the class and instances has access to their issuing cursor.
@@ -222,6 +239,7 @@
if len(targettypes) > 1:
# find fetch_attrs common to all destination types
fetchattrs = user._cw.vreg['etypes'].fetch_attrs(targettypes)
+ remove_ambiguous_rels(fetchattrs, targettypes, user._cw.vreg.schema)
else:
fetchattrs = etypecls.fetch_attrs
etypecls._fetch_restrictions(var, varmaker, fetchattrs,
@@ -739,6 +757,10 @@
etypecls = self._cw.vreg['etypes'].etype_class(targettypes[0])
if len(targettypes) > 1:
fetchattrs = self._cw.vreg['etypes'].fetch_attrs(targettypes)
+ # XXX we should fetch ambiguous relation objects too but not
+ # recurse on them in _fetch_restrictions; it is easier to remove
+ # them completely for now, as it would require an deeper api rewrite
+ remove_ambiguous_rels(fetchattrs, targettypes, self._cw.vreg.schema)
else:
fetchattrs = etypecls.fetch_attrs
rql = etypecls.fetch_rql(self._cw.user, [restriction], fetchattrs,