server/querier.py
changeset 6142 8bc6eac1fac1
parent 6129 fea746b60093
child 6180 9d7acf23369d
equal deleted inserted replaced
6141:b8287e54b528 6142:8bc6eac1fac1
   448     def __init__(self, querier, rqlst, args, session):
   448     def __init__(self, querier, rqlst, args, session):
   449         ExecutionPlan.__init__(self, querier, rqlst, args, session)
   449         ExecutionPlan.__init__(self, querier, rqlst, args, session)
   450         # save originaly selected variable, we may modify this
   450         # save originaly selected variable, we may modify this
   451         # dictionary for substitution (query parameters)
   451         # dictionary for substitution (query parameters)
   452         self.selected = rqlst.selection
   452         self.selected = rqlst.selection
   453         # list of new or updated entities definition (utils.Entity)
   453         # list of rows of entities definition (ssplanner.EditedEntity)
   454         self.e_defs = [[]]
   454         self.e_defs = [[]]
   455         # list of new relation definition (3-uple (from_eid, r_type, to_eid)
   455         # list of new relation definition (3-uple (from_eid, r_type, to_eid)
   456         self.r_defs = set()
   456         self.r_defs = set()
   457         # indexes to track entity definitions bound to relation definitions
   457         # indexes to track entity definitions bound to relation definitions
   458         self._r_subj_index = {}
   458         self._r_subj_index = {}
   459         self._r_obj_index = {}
   459         self._r_obj_index = {}
   460         self._expanded_r_defs = {}
   460         self._expanded_r_defs = {}
   461 
   461 
   462     def add_entity_def(self, edef):
   462     def add_entity_def(self, edef):
   463         """add an entity definition to build"""
   463         """add an entity definition to build"""
   464         edef.querier_pending_relations = {}
       
   465         self.e_defs[-1].append(edef)
   464         self.e_defs[-1].append(edef)
   466 
   465 
   467     def add_relation_def(self, rdef):
   466     def add_relation_def(self, rdef):
   468         """add an relation definition to build"""
   467         """add an relation definition to build"""
   469         self.r_defs.add(rdef)
   468         self.r_defs.add(rdef)
   491         colidx = self.e_defs[0].index(edef)
   490         colidx = self.e_defs[0].index(edef)
   492         for i, row in enumerate(self.e_defs[:]):
   491         for i, row in enumerate(self.e_defs[:]):
   493             self.e_defs[i][colidx] = edefs[0]
   492             self.e_defs[i][colidx] = edefs[0]
   494             samplerow = self.e_defs[i]
   493             samplerow = self.e_defs[i]
   495             for edef_ in edefs[1:]:
   494             for edef_ in edefs[1:]:
   496                 row = samplerow[:]
   495                 row = [ed.clone() for i, ed in enumerate(samplerow)
   497                 row[colidx] = edef_
   496                        if i != colidx]
       
   497                 row.insert(colidx, edef_)
   498                 self.e_defs.append(row)
   498                 self.e_defs.append(row)
   499         # now, see if this entity def is referenced as subject in some relation
   499         # now, see if this entity def is referenced as subject in some relation
   500         # definition
   500         # definition
   501         if self._r_subj_index.has_key(edef):
   501         if self._r_subj_index.has_key(edef):
   502             for rdef in self._r_subj_index[edef]:
   502             for rdef in self._r_subj_index[edef]:
   558         for subj, rtype, obj in self.relation_defs():
   558         for subj, rtype, obj in self.relation_defs():
   559             # if a string is given into args instead of an int, we get it here
   559             # if a string is given into args instead of an int, we get it here
   560             if isinstance(subj, basestring):
   560             if isinstance(subj, basestring):
   561                 subj = typed_eid(subj)
   561                 subj = typed_eid(subj)
   562             elif not isinstance(subj, (int, long)):
   562             elif not isinstance(subj, (int, long)):
   563                 subj = subj.eid
   563                 subj = subj.entity.eid
   564             if isinstance(obj, basestring):
   564             if isinstance(obj, basestring):
   565                 obj = typed_eid(obj)
   565                 obj = typed_eid(obj)
   566             elif not isinstance(obj, (int, long)):
   566             elif not isinstance(obj, (int, long)):
   567                 obj = obj.eid
   567                 obj = obj.entity.eid
   568             if repo.schema.rschema(rtype).inlined:
   568             if repo.schema.rschema(rtype).inlined:
   569                 entity = session.entity_from_eid(subj)
   569                 entity = session.entity_from_eid(subj)
   570                 entity[rtype] = obj
   570                 edited = EditedEntity(entity)
   571                 repo.glob_update_entity(session, entity, set((rtype,)))
   571                 edited.edited_attribute(rtype, obj)
       
   572                 repo.glob_update_entity(session, edited)
   572             else:
   573             else:
   573                 repo.glob_add_relation(session, subj, rtype, obj)
   574                 repo.glob_add_relation(session, subj, rtype, obj)
   574 
   575 
   575 
   576 
   576 class QuerierHelper(object):
   577 class QuerierHelper(object):