req.py
changeset 5174 78438ad513ca
parent 4933 433174d9394f
child 5201 2b4267157f85
equal deleted inserted replaced
5173:73760bbb66bd 5174:78438ad513ca
   135         _check_cw_unsafe(kwargs)
   135         _check_cw_unsafe(kwargs)
   136         execute = self.execute
   136         execute = self.execute
   137         rql = 'INSERT %s X' % etype
   137         rql = 'INSERT %s X' % etype
   138         relations = []
   138         relations = []
   139         restrictions = set()
   139         restrictions = set()
   140         cachekey = []
       
   141         pending_relations = []
   140         pending_relations = []
   142         for attr, value in kwargs.items():
   141         for attr, value in kwargs.items():
   143             if isinstance(value, (tuple, list, set, frozenset)):
   142             if isinstance(value, (tuple, list, set, frozenset)):
   144                 if len(value) == 1:
   143                 if len(value) == 1:
   145                     value = iter(value).next()
   144                     value = iter(value).next()
   155                 else:
   154                 else:
   156                     relations.append('X %s %s' % (attr, rvar))
   155                     relations.append('X %s %s' % (attr, rvar))
   157                 restriction = '%s eid %%(%s)s' % (rvar, attr)
   156                 restriction = '%s eid %%(%s)s' % (rvar, attr)
   158                 if not restriction in restrictions:
   157                 if not restriction in restrictions:
   159                     restrictions.add(restriction)
   158                     restrictions.add(restriction)
   160                 cachekey.append(attr)
       
   161                 kwargs[attr] = value.eid
   159                 kwargs[attr] = value.eid
   162             else: # attribute
   160             else: # attribute
   163                 relations.append('X %s %%(%s)s' % (attr, attr))
   161                 relations.append('X %s %%(%s)s' % (attr, attr))
   164         if relations:
   162         if relations:
   165             rql = '%s: %s' % (rql, ', '.join(relations))
   163             rql = '%s: %s' % (rql, ', '.join(relations))
   166         if restrictions:
   164         if restrictions:
   167             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   165             rql = '%s WHERE %s' % (rql, ', '.join(restrictions))
   168         created = execute(rql, kwargs, cachekey).get_entity(0, 0)
   166         created = execute(rql, kwargs).get_entity(0, 0)
   169         for attr, values in pending_relations:
   167         for attr, values in pending_relations:
   170             if attr.startswith('reverse_'):
   168             if attr.startswith('reverse_'):
   171                 restr = 'Y %s X' % attr[len('reverse_'):]
   169                 restr = 'Y %s X' % attr[len('reverse_'):]
   172             else:
   170             else:
   173                 restr = 'X %s Y' % attr
   171                 restr = 'X %s Y' % attr
   174             execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
   172             execute('SET %s WHERE X eid %%(x)s, Y eid IN (%s)' % (
   175                 restr, ','.join(str(r.eid) for r in values)),
   173                 restr, ','.join(str(r.eid) for r in values)),
   176                     {'x': created.eid}, 'x', build_descr=False)
   174                     {'x': created.eid}, build_descr=False)
   177         return created
   175         return created
   178 
   176 
   179     def ensure_ro_rql(self, rql):
   177     def ensure_ro_rql(self, rql):
   180         """raise an exception if the given rql is not a select query"""
   178         """raise an exception if the given rql is not a select query"""
   181         first = rql.split(' ', 1)[0].lower()
   179         first = rql.split(' ', 1)[0].lower()