802 def related_cache(self, rtype, role, entities=True, limit=None): |
802 def related_cache(self, rtype, role, entities=True, limit=None): |
803 """return values for the given relation if it's cached on the instance, |
803 """return values for the given relation if it's cached on the instance, |
804 else raise `KeyError` |
804 else raise `KeyError` |
805 """ |
805 """ |
806 res = self._related_cache['%s_%s' % (rtype, role)][entities] |
806 res = self._related_cache['%s_%s' % (rtype, role)][entities] |
807 if limit: |
807 if limit is not None: |
808 if entities: |
808 if entities: |
809 res = res[:limit] |
809 res = res[:limit] |
810 else: |
810 else: |
811 res = res.limit(limit) |
811 res = res.limit(limit) |
812 return res |
812 return res |
813 |
813 |
814 def set_related_cache(self, rtype, role, rset, col=0): |
814 def set_related_cache(self, rtype, role, rset, col=0): |
815 """set cached values for the given relation""" |
815 """set cached values for the given relation""" |
816 if rset: |
816 if rset: |
817 related = list(rset.entities(col)) |
817 related = tuple(rset.entities(col)) |
818 rschema = self.schema.rschema(rtype) |
818 rschema = self.schema.rschema(rtype) |
819 if role == 'subject': |
819 if role == 'subject': |
820 rcard = rschema.rproperty(self.e_schema, related[0].e_schema, |
820 rcard = rschema.rproperty(self.e_schema, related[0].e_schema, |
821 'cardinality')[1] |
821 'cardinality')[1] |
822 target = 'object' |
822 target = 'object' |
824 rcard = rschema.rproperty(related[0].e_schema, self.e_schema, |
824 rcard = rschema.rproperty(related[0].e_schema, self.e_schema, |
825 'cardinality')[0] |
825 'cardinality')[0] |
826 target = 'subject' |
826 target = 'subject' |
827 if rcard in '?1': |
827 if rcard in '?1': |
828 for rentity in related: |
828 for rentity in related: |
829 rentity._related_cache['%s_%s' % (rtype, target)] = (self.as_rset(), [self]) |
829 rentity._related_cache['%s_%s' % (rtype, target)] = ( |
830 else: |
830 self.as_rset(), (self,)) |
831 related = [] |
831 else: |
|
832 related = () |
832 self._related_cache['%s_%s' % (rtype, role)] = (rset, related) |
833 self._related_cache['%s_%s' % (rtype, role)] = (rset, related) |
833 |
834 |
834 def clear_related_cache(self, rtype=None, role=None): |
835 def clear_related_cache(self, rtype=None, role=None): |
835 """clear cached values for the given relation or the entire cache if |
836 """clear cached values for the given relation or the entire cache if |
836 no relation is given |
837 no relation is given |