equal
deleted
inserted
replaced
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 |