cubicweb #1700896 Buggy related rql for some schema + fetch_attrs config [resolved]

In french from an email to syt :

Ça produit des résultats vides quand il y a des ambiguités sur des relations présentes dans fetch_attr. On avait déjà fixé un bug de ce type, il y a récidive ici, dans le cas plus complexe suivant (je pense avoir simplifié au max, c'est dire) :

Schema

class SegmentFuel(EntityType):
   sf_segment = SubjectRelation(('GTSegment', 'BoilerSegment'),
cardinality='1*')

class GTSegment(EntityType):
   order = Int(required=True, default=1)
   segment_of = SubjectRelation('GasTurbine', cardinality='1*')

class BoilerSegment(EntityType):
   order = Int(required=True, default=1)
   segment_of = SubjectRelation('Boiler', cardinality='1*')

class GasTurbine(EntityType):
   of_plant = SubjectRelation('Plant', cardinality='1*')
   power_output = SubjectRelation('Market', cardinality='1*')

class Boiler(EntityType):
   of_plant = SubjectRelation('Plant', cardinality='1*')

entities

class GTSegment(AnyEntity):
   __regid__ = 'GTSegment'
   fetch_attrs, fetch_order = fetch_config(['segment_of', 'order'], 'order')

class BoilerSegment(AnyEntity):
   __regid__ = 'BoilerSegment'
   fetch_attrs, fetch_order = fetch_config(['segment_of', 'order'], 'order')

class GasTurbine(AnyEntity):
   __regid__ = 'GasTurbine'
   fetch_attrs, fetch_order = fetch_config(['name', 'power_output'], 'name')

class Boiler(AnyEntity):
   __regid__ = 'Boiler'
   fetch_attrs, fetch_order = fetch_config(['name'], 'name')

Quand on récupère une instance de SegmentFuel sf et qu'on appelle : sf.sf_segment, alors la méthode cw_related_rql récupère 'segment_of' du fetch_attr (ce qui est correct, car la relation est commune à tous les targettypes possible de sf_segment et présente dans leur fetch_attr). Mais ensuite dans _fetch_restrictions (appelée dans cw_related_rql via fetch_rql), dans la boucle sur les relations, on restreignait les targettypes possibles en ne prenant que rschema.objects(cls.e_schema.type) et non rschema.objects() (sans restriction sur le type du sujet). Pour segment_of cela conduit dans mon cas, à ne conserver que GasTurbine, dont le fetch_attr contient power_ouput, qui par contre n'est pas une relation de Boiler... donc lorsque sf.sf_segment[0].segment_of[0] est un Boiler, on obtient un crash violent très étrange quand on regarde le schéma, car le sf.sf_segment calculé par cw_related_rql est vide.

priorityimportant
typebug
done in3.12.6
load0.200
load left0.000
closed by#7e9d1d6fcba7 [entity fetch_attrs] remove ambiguous relations on different etypes from fetched attrs or it may produce wrong related results; closes #1700896