server/ssplanner.py
changeset 2968 0e3460341023
parent 2921 8e2544e78a5e
child 3437 a30b5b5138a4
equal deleted inserted replaced
2902:dd9f2dd02f85 2968:0e3460341023
   375 class RelationsStep(Step):
   375 class RelationsStep(Step):
   376     """step consisting in adding attributes/relations to entity defs from a
   376     """step consisting in adding attributes/relations to entity defs from a
   377     previous FetchStep
   377     previous FetchStep
   378 
   378 
   379     relations values comes from the latest result, with one columns for
   379     relations values comes from the latest result, with one columns for
   380     each relation defined in self.r_defs
   380     each relation defined in self.rdefs
   381 
   381 
   382     for one entity definition, we'll construct N entity, where N is the
   382     for one entity definition, we'll construct N entity, where N is the
   383     number of the latest result
   383     number of the latest result
   384     """
   384     """
   385 
   385 
   386     FINAL = 0
   386     FINAL = 0
   387     RELATION = 1
   387     RELATION = 1
   388     REVERSE_RELATION = 2
   388     REVERSE_RELATION = 2
   389 
   389 
   390     def __init__(self, plan, e_def, r_defs):
   390     def __init__(self, plan, edef, rdefs):
   391         Step.__init__(self, plan)
   391         Step.__init__(self, plan)
   392         # partial entity definition to expand
   392         # partial entity definition to expand
   393         self.e_def = e_def
   393         self.edef = edef
   394         # definition of relations to complete
   394         # definition of relations to complete
   395         self.r_defs = r_defs
   395         self.rdefs = rdefs
   396 
   396 
   397     def execute(self):
   397     def execute(self):
   398         """execute this step"""
   398         """execute this step"""
   399         base_e_def = self.e_def
   399         base_edef = self.edef
   400         result = []
   400         edefs = []
   401         for row in self.execute_child():
   401         result = self.execute_child()
       
   402         for row in result:
   402             # get a new entity definition for this row
   403             # get a new entity definition for this row
   403             e_def = copy(base_e_def)
   404             edef = copy(base_edef)
   404             # complete this entity def using row values
   405             # complete this entity def using row values
   405             for i in range(len(self.r_defs)):
   406             for i in range(len(self.rdefs)):
   406                 rtype, rorder = self.r_defs[i]
   407                 rtype, rorder = self.rdefs[i]
   407                 if rorder == RelationsStep.FINAL:
   408                 if rorder == RelationsStep.FINAL:
   408                     e_def[rtype] = row[i]
   409                     edef[rtype] = row[i]
   409                 elif rorder == RelationsStep.RELATION:
   410                 elif rorder == RelationsStep.RELATION:
   410                     self.plan.add_relation_def( (e_def, rtype, row[i]) )
   411                     self.plan.add_relation_def( (edef, rtype, row[i]) )
   411                     e_def.querier_pending_relations[(rtype, 'subject')] = row[i]
   412                     edef.querier_pending_relations[(rtype, 'subject')] = row[i]
   412                 else:
   413                 else:
   413                     self.plan.add_relation_def( (row[i], rtype, e_def) )
   414                     self.plan.add_relation_def( (row[i], rtype, edef) )
   414                     e_def.querier_pending_relations[(rtype, 'object')] = row[i]
   415                     edef.querier_pending_relations[(rtype, 'object')] = row[i]
   415             result.append(e_def)
   416             edefs.append(edef)
   416         self.plan.substitute_entity_def(base_e_def, result)
   417         self.plan.substitute_entity_def(base_edef, edefs)
       
   418         return result
   417 
   419 
   418 
   420 
   419 class InsertStep(Step):
   421 class InsertStep(Step):
   420     """step consisting in inserting new entities / relations"""
   422     """step consisting in inserting new entities / relations"""
   421 
   423 
   481         session = self.plan.session
   483         session = self.plan.session
   482         repo = session.repo
   484         repo = session.repo
   483         edefs = {}
   485         edefs = {}
   484         # insert relations
   486         # insert relations
   485         attributes = set([relation.r_type for relation in self.attribute_relations])
   487         attributes = set([relation.r_type for relation in self.attribute_relations])
   486         for row in self.execute_child():
   488         result = self.execute_child()
       
   489         for row in result:
   487             for relation in self.attribute_relations:
   490             for relation in self.attribute_relations:
   488                 lhs, rhs = relation.get_variable_parts()
   491                 lhs, rhs = relation.get_variable_parts()
   489                 eid = typed_eid(row[self.selected_index[str(lhs)]])
   492                 eid = typed_eid(row[self.selected_index[str(lhs)]])
   490                 try:
   493                 try:
   491                     edef = edefs[eid]
   494                     edef = edefs[eid]
   500             for relation in self.relations:
   503             for relation in self.relations:
   501                 subj = row[self.selected_index[str(relation.children[0])]]
   504                 subj = row[self.selected_index[str(relation.children[0])]]
   502                 obj = row[self.selected_index[str(relation.children[1])]]
   505                 obj = row[self.selected_index[str(relation.children[1])]]
   503                 repo.glob_add_relation(session, subj, relation.r_type, obj)
   506                 repo.glob_add_relation(session, subj, relation.r_type, obj)
   504         # update entities
   507         # update entities
   505         result = []
       
   506         for eid, edef in edefs.iteritems():
   508         for eid, edef in edefs.iteritems():
   507             repo.glob_update_entity(session, edef, attributes)
   509             repo.glob_update_entity(session, edef, attributes)
   508             result.append( (eid,) )
       
   509         return result
   510         return result