server/sources/pyrorql.py
branchstable
changeset 7697 ef50074a0314
parent 7650 278fe9c1f3ad
child 7815 2a164a9cf81c
equal deleted inserted replaced
7695:2f6e37661cf6 7697:ef50074a0314
   279                     self.exception('while updating %s with external id %s of source %s',
   279                     self.exception('while updating %s with external id %s of source %s',
   280                                    etype, extid, self.uri)
   280                                    etype, extid, self.uri)
   281                     continue
   281                     continue
   282             for etype, extid in deleted:
   282             for etype, extid in deleted:
   283                 try:
   283                 try:
   284                     eid = self.extid2eid(str(extid), etype, session,
   284                     eid = self.repo.extid2eid(self, str(extid), etype, session,
   285                                          insert=False)
   285                                               insert=False)
   286                     # entity has been deleted from external repository but is not known here
   286                     # entity has been deleted from external repository but is not known here
   287                     if eid is not None:
   287                     if eid is not None:
   288                         entity = session.entity_from_eid(eid, etype)
   288                         entity = session.entity_from_eid(eid, etype)
   289                         repo.delete_info(session, entity, self.uri, extid,
   289                         repo.delete_info(session, entity, self.uri, extid,
   290                                          scleanup=self.eid)
   290                                          scleanup=self.eid)
   421             results = []
   421             results = []
   422         return results
   422         return results
   423 
   423 
   424     def _entity_relations_and_kwargs(self, session, entity):
   424     def _entity_relations_and_kwargs(self, session, entity):
   425         relations = []
   425         relations = []
   426         kwargs = {'x': self.eid2extid(entity.eid, session)}
   426         kwargs = {'x': self.repo.eid2extid(self, entity.eid, session)}
   427         for key, val in entity.cw_attr_cache.iteritems():
   427         for key, val in entity.cw_attr_cache.iteritems():
   428             relations.append('X %s %%(%s)s' % (key, key))
   428             relations.append('X %s %%(%s)s' % (key, key))
   429             kwargs[key] = val
   429             kwargs[key] = val
   430         return relations, kwargs
   430         return relations, kwargs
   431 
   431 
   447             # source is being deleted, don't propagate
   447             # source is being deleted, don't propagate
   448             self._query_cache.clear()
   448             self._query_cache.clear()
   449             return
   449             return
   450         cu = session.cnxset[self.uri]
   450         cu = session.cnxset[self.uri]
   451         cu.execute('DELETE %s X WHERE X eid %%(x)s' % entity.__regid__,
   451         cu.execute('DELETE %s X WHERE X eid %%(x)s' % entity.__regid__,
   452                    {'x': self.eid2extid(entity.eid, session)})
   452                    {'x': self.repo.eid2extid(self, entity.eid, session)})
   453         self._query_cache.clear()
   453         self._query_cache.clear()
   454 
   454 
   455     def add_relation(self, session, subject, rtype, object):
   455     def add_relation(self, session, subject, rtype, object):
   456         """add a relation to the source"""
   456         """add a relation to the source"""
   457         cu = session.cnxset[self.uri]
   457         cu = session.cnxset[self.uri]
   458         cu.execute('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype,
   458         cu.execute('SET X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype,
   459                    {'x': self.eid2extid(subject, session),
   459                    {'x': self.repo.eid2extid(self, subject, session),
   460                     'y': self.eid2extid(object, session)})
   460                     'y': self.repo.eid2extid(self, object, session)})
   461         self._query_cache.clear()
   461         self._query_cache.clear()
   462         session.entity_from_eid(subject).cw_clear_all_caches()
   462         session.entity_from_eid(subject).cw_clear_all_caches()
   463         session.entity_from_eid(object).cw_clear_all_caches()
   463         session.entity_from_eid(object).cw_clear_all_caches()
   464 
   464 
   465     def delete_relation(self, session, subject, rtype, object):
   465     def delete_relation(self, session, subject, rtype, object):
   468             # source is being deleted, don't propagate
   468             # source is being deleted, don't propagate
   469             self._query_cache.clear()
   469             self._query_cache.clear()
   470             return
   470             return
   471         cu = session.cnxset[self.uri]
   471         cu = session.cnxset[self.uri]
   472         cu.execute('DELETE X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype,
   472         cu.execute('DELETE X %s Y WHERE X eid %%(x)s, Y eid %%(y)s' % rtype,
   473                    {'x': self.eid2extid(subject, session),
   473                    {'x': self.repo.eid2extid(self, subject, session),
   474                     'y': self.eid2extid(object, session)})
   474                     'y': self.repo.eid2extid(self, object, session)})
   475         self._query_cache.clear()
   475         self._query_cache.clear()
   476         session.entity_from_eid(subject).cw_clear_all_caches()
   476         session.entity_from_eid(subject).cw_clear_all_caches()
   477         session.entity_from_eid(object).cw_clear_all_caches()
   477         session.entity_from_eid(object).cw_clear_all_caches()
   478 
   478 
   479 
   479 
   480 class RQL2RQL(object):
   480 class RQL2RQL(object):
   481     """translate a local rql query to be executed on a distant repository"""
   481     """translate a local rql query to be executed on a distant repository"""
   482     def __init__(self, source):
   482     def __init__(self, source):
   483         self.source = source
   483         self.source = source
       
   484         self.repo = source.repo
   484         self.current_operator = None
   485         self.current_operator = None
   485 
   486 
   486     def _accept_children(self, node):
   487     def _accept_children(self, node):
   487         res = []
   488         res = []
   488         for child in node.children:
   489         for child in node.children:
   674             self._const_var[value] = var
   675             self._const_var[value] = var
   675             return restr, var
   676             return restr, var
   676 
   677 
   677     def eid2extid(self, eid):
   678     def eid2extid(self, eid):
   678         try:
   679         try:
   679             return self.source.eid2extid(eid, self._session)
   680             return self.repo.eid2extid(self.source, eid, self._session)
   680         except UnknownEid:
   681         except UnknownEid:
   681             operator = self.current_operator
   682             operator = self.current_operator
   682             if operator is not None and operator != '=':
   683             if operator is not None and operator != '=':
   683                 # deal with query like "X eid > 12"
   684                 # deal with query like "X eid > 12"
   684                 #
   685                 #