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 |
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 |