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