[Modeling-cvs] ProjectModeling/Modeling PyModel.py,1.1.2.1,1.1.2.2
Status: Abandoned
Brought to you by:
sbigaret
From: <sbi...@us...> - 2003-05-18 15:23:28
|
Update of /cvsroot/modeling/ProjectModeling/Modeling In directory sc8-pr-cvs1:/tmp/cvs-serv1779 Modified Files: Tag: brch-0_9pre7-1-PyModel PyModel.py Log Message: Full implementation for Association (version 1) Index: PyModel.py =================================================================== RCS file: /cvsroot/modeling/ProjectModeling/Modeling/Attic/PyModel.py,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -C2 -d -r1.1.2.1 -r1.1.2.2 *** PyModel.py 15 May 2003 17:44:58 -0000 1.1.2.1 --- PyModel.py 18 May 2003 15:23:25 -0000 1.1.2.2 *************** *** 61,65 **** def debug(msg): ! print msg def error(msg): --- 61,66 ---- def debug(msg): ! #print msg ! pass def error(msg): *************** *** 186,190 **** entities.remove(entity) while entities: ! print [e.name for e in entities], entities_processed es=[e for e in entities if e.parent in entities_processed] for entity in es: --- 187,191 ---- entities.remove(entity) while entities: ! #print [e.name for e in entities], entities_processed es=[e for e in entities if e.parent in entities_processed] for entity in es: *************** *** 317,321 **** if isinstance(prop, APrimaryKey): return prop ! return 0 def propagate_attribute(self, attributeDescObj, model): --- 318,322 ---- if isinstance(prop, APrimaryKey): return prop ! return None def propagate_attribute(self, attributeDescObj, model): *************** *** 586,590 **** class BaseRelation(BaseDescription): ''' Describes a Relation ''' ! defaults={ 'delete': 0, #'key': 0, #'destinationEntity': '', --- 587,591 ---- class BaseRelation(BaseDescription): ''' Describes a Relation ''' ! defaults={ 'delete': 0, # nullify #'key': 0, #'destinationEntity': '', *************** *** 623,629 **** class RToOne(BaseRelation): ! defaults={ 'multiplicity': [0,1], ! 'joinSemantic': 0, ! } propagated_by=None --- 624,631 ---- class RToOne(BaseRelation): ! defaults=BaseRelation.defaults.copy() ! defaults.update({ 'multiplicity': [0,1], ! 'joinSemantic': 0, ! }) propagated_by=None *************** *** 693,699 **** class RToMany(BaseRelation): ! defaults={ 'multiplicity': [0,None], ! 'joinSemantic': 0, ! } propagated_by=None --- 695,702 ---- class RToMany(BaseRelation): ! defaults=BaseRelation.defaults.copy() ! defaults.update({ 'multiplicity': [0,None], ! 'joinSemantic': 0, ! }) propagated_by=None *************** *** 765,793 **** class Association(BaseDescription): ! ''' Describes a Relation between 2 entities ''' ! # TBD a placer dans les prop. de Entity ! # ex. Relation('Employee', 'Address', ([0,None],cascade), ([0,1],deny)) ! # --> soit ca ! # --> soit tout a la main ! # --> soit dans les Entity, RToOne, RToMany: ! # - avec seulement destEntity ! # - avec destEntity et inverse= ! def __init__(self, src, dst, ! multiplicity=[0,1], invMultiplicity=[0,None], ! srcProps={}, dstProps={}): ! if multiplicity[1]>1: ! raise ValueError, 'invalid mult' ! if not (invMultiplicity[1] in (None, '*', -1) or invMultiplicity[0]>1): ! raise ValueError, 'invalid invMult' ! self.src=src ! self.dst=dst ## TBD 1: inverser src/dst si multiplicities sont inversees ## TBD 2: possibilite d'ajout des srcKey/dstKey ! self.multiplicity=multiplicity ! self.invMultiplicity=invMultiplicity ! self.srcProps=srcProps ! self.dstProps=dstProps ! def build(self, model): srcE=model.entityNamed(self.src) --- 768,824 ---- + def relationsForSrcAndDst(src,dst): + return ('to'+dst, 'to'+src+'s') + class Association(BaseDescription): ! ''' ! Describes an Association between 2 entities ! ! An Association binds two entities, 'src' and 'dst' (cf. __init__()), ! with two relationships: ! ! - a toOne relationship src -> dst ! ! - a toMany relationship dst -> src ! ! ''' ! defaults = { 'multiplicity': [ [0,1], [0,None] ], ! 'relations': MP(relationsForSrcAndDst, 'src', 'dst'), ! 'keys': [ None, None ], ! 'delete': [ RToOne.defaults['delete'], ! RToMany.defaults['delete'] ], ! 'isClassProperty': [ RToOne.defaults['isClassProperty'], ! RToMany.defaults['isClassProperty'] ], ! 'joinSemantic': [ RToOne.defaults['joinSemantic'], ! RToMany.defaults['joinSemantic'] ], ! 'displayLabel': [ RToOne.defaults['displayLabel'], ! RToMany.defaults['displayLabel'] ], ! 'doc': [ RToOne.defaults['doc'], ! RToMany.defaults['doc'] ], ! } ! ! def __init__(self, src, dst, **kw): ! self.src=kw['src']=src ! self.dst=kw['dst']=dst ! updateComponent(self,kw,Association.defaults, ! name='Association(%s,%s)'%(src, dst)) ! self.check_multiplicity() ! ! def check_multiplicity(self): ! """ ! Check the self.multiplicity is correct ! ! Returns: (src->dst multiplicity, dst->src multiplicity) ! """ ## TBD 1: inverser src/dst si multiplicities sont inversees ## TBD 2: possibilite d'ajout des srcKey/dstKey ! sd_mult=self.multiplicity[0] ! ds_mult=self.multiplicity[1] ! if sd_mult[1]>1: ! raise ValueError, 'invalid multiplicity src->dst: should be toOne' ! if not (ds_mult[1] in (None, '*', -1) or ds_mult[0]>1): ! raise ValueError, 'invalid multiplicity dst->src: should be toMany' ! return sd_mult, ds_mult ! def build(self, model): srcE=model.entityNamed(self.src) *************** *** 797,816 **** if not dstE: raise ValueError, 'Association: Unable to find destination entity %s'%self.dst - dstAtt=dstE.primaryKey() - if not dstAtt: - dstAtt=APrimaryKey() - dstE.properties.append(srcAtt) - # FK: create it (TBD: unless ajout dstKey cf __init__) - srcAtt=AForeignKey(srcE.attFKName(dstE.name)) - srcE.properties.append(srcAtt) ! # Relationships ! srcRelName='to'+dstE.name # TBD: build it appropriately! ! dstRelName='to'+srcE.name+'s' # TBD: build it appropriately! ! srcRel=RToOne(srcRelName, dstE.name, ## TBD: +properties ! src=srcAtt.name, dst=dstAtt.name) ! dstRel=RToMany(dstRelName, srcE.name, ## TBD: +properties ! src=dstAtt.name, dst=srcAtt.name) srcE.properties.append(srcRel) dstE.properties.append(dstRel) --- 828,875 ---- if not dstE: raise ValueError, 'Association: Unable to find destination entity %s'%self.dst ! ## PK ! dstE_pk=dstE.primaryKey() ! if not self.keys[1]: # unspecified: retrieve it ! if not dstE_pk: ! raise ValueError, '%s: Unable to find a PK in entity %s'%(self.name, self.dst) ! dstAtt=dstE_pk ! self.keys[1]=dstAtt.name ! ! else: # destination PK was specified ! if dstE_pk and dstE_pk.name != self.keys[1]: ! raise ValueError, '%s: specifies a destination attribute %s for entity %s for this entity already has a PK named %s'%(self.name,self.keys[1],self.dst,dstE_pk.name) ! ! dstAtt=dstE.attributeNamed(self.keys[1]) ! if not dstAtt: ! debug('Creating default PK in %s'%self.dst) ! dstAtt=APrimaryKey() ! dstE.properties.append(dstAtt) ! ## FK ! srcAtt=srcE.attributeNamed(self.keys[0]) ! if not srcAtt: ! if not self.keys[0]: ! self.keys[0]=srcE.attFKName(dstE.name) ! debug('%s: Creating FK %s.%s'%(self.name, self.src, self.keys[0])) ! srcAtt=AForeignKey(self.keys[0]) ! srcE.properties.append(srcAtt) ! ! ## Now srcAtt and dstAtt are set ! ! # Relationships ! toOne_kw={} ; toMany_kw={} ! for k in ('delete','isClassProperty','joinSemantic','displayLabel','doc'): ! toOne_kw[k]=getattr(self, k)[0] ! toMany_kw[k]=getattr(self, k)[1] ! toOne_kw['src']=srcAtt.name ; toOne_kw['dst']=dstAtt.name ! toMany_kw['src']=dstAtt.name ; toMany_kw['dst']=srcAtt.name ! ! #srcRel=RToOne(self.relations[0], dstE.name, ## TBD: +properties ! # src=srcAtt.name, dst=dstAtt.name) ! srcRel=apply(RToOne, (self.relations[0], dstE.name), toOne_kw) ! #dstRel=RToMany(self.relations[1], srcE.name, ## TBD: +properties ! # src=dstAtt.name, dst=srcAtt.name) ! dstRel=apply(RToMany, (self.relations[1], srcE.name), toMany_kw) srcE.properties.append(srcRel) dstE.properties.append(dstRel) *************** *** 865,873 **** l=[kw[n] for n in v.param] v=apply(v.method, l) else: v=copy(v) ! #try: print k, ': ', v ! #except: import pdb ; pdb.set_trace() ! object.component.takeStoredValueForKey(v,k) ## --- 924,933 ---- l=[kw[n] for n in v.param] v=apply(v.method, l) + setattr(object, k, v) else: v=copy(v) ! if hasattr(object, 'component'): ! # Associations do not have any 'component' ! object.component.takeStoredValueForKey(v,k) ## |