entity.py
changeset 7223 7a58581d842c
parent 7216 6053bf221fa9
child 7246 ecae5b526437
equal deleted inserted replaced
7222:fcb8932082a5 7223:7a58581d842c
   264         rql = 'INSERT %s X' % cls.__regid__
   264         rql = 'INSERT %s X' % cls.__regid__
   265         relations = []
   265         relations = []
   266         restrictions = set()
   266         restrictions = set()
   267         pending_relations = []
   267         pending_relations = []
   268         eschema = cls.e_schema
   268         eschema = cls.e_schema
       
   269         cache = {}
   269         for attr, value in kwargs.items():
   270         for attr, value in kwargs.items():
   270             if attr.startswith('reverse_'):
   271             if attr.startswith('reverse_'):
   271                 attr = attr[len('reverse_'):]
   272                 attr = attr[len('reverse_'):]
   272                 role = 'object'
   273                 role = 'object'
   273             else:
   274             else:
   274                 role = 'subject'
   275                 role = 'subject'
   275             assert eschema.has_relation(attr, role)
   276             assert eschema.has_relation(attr, role)
   276             rschema = eschema.subjrels[attr] if role == 'subject' else eschema.objrels[attr]
   277             rschema = eschema.subjrels[attr] if role == 'subject' else eschema.objrels[attr]
   277             if not rschema.final and isinstance(value, (tuple, list, set, frozenset)):
   278             if rschema.final:
       
   279                 cache[attr] = value # XXX what if value is processed in pre add hook (eg timeseries)?
       
   280             elif isinstance(value, (tuple, list, set, frozenset)):
   278                 if len(value) == 1:
   281                 if len(value) == 1:
   279                     value = iter(value).next()
   282                     value = iter(value).next()
   280                 else:
   283                 else:
   281                     # prepare IN clause
   284                     # prepare IN clause
   282                     del kwargs[attr]
   285                     del kwargs[attr]
   297         if relations:
   300         if relations:
   298             rql = '%s: %s' % (rql, ', '.join(relations))
   301             rql = '%s: %s' % (rql, ', '.join(relations))
   299         if restrictions:
   302         if restrictions:
   300             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   303             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   301         created = execute(rql, kwargs).get_entity(0, 0)
   304         created = execute(rql, kwargs).get_entity(0, 0)
       
   305         created.cw_attr_cache.update(cache)
   302         for attr, values in pending_relations:
   306         for attr, values in pending_relations:
   303             if attr.startswith('reverse_'):
   307             if attr.startswith('reverse_'):
   304                 restr = 'Y %s X' % attr[len('reverse_'):]
   308                 restr = 'Y %s X' % attr[len('reverse_'):]
   305             else:
   309             else:
   306                 restr = 'X %s Y' % attr
   310                 restr = 'X %s Y' % attr