CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
revisionDML.py
Go to the documentation of this file.
1 #
2 # Revision DML API
3 #
4 
5 import coral
6 from RecoLuminosity.LumiDB import nameDealer,idDealer,dbUtil
7 #==============================
8 # SELECT
9 #==============================
10 def revisionsInTag(schema,tagrevisionid,branchid):
11  '''
12  returns all revisions before tag in selected branch
13  select revision_id from revisions where revision_id!=0 and revision_id<tagrevisionid and branch_id=:branchid
14  result=[revision_id]
15  '''
16  result=[]
17  qHandle=schema.newQuery()
18  try:
19  nextbranches=[]
20  qHandle.addToTableList( nameDealer.revisionTableName() )
21  qHandle.addToOutputList('distinct BRANCH_ID','branch_id')
22  qCondition=coral.AttributeList()
23  qCondition.extend('branchid','unsigned long long')
24  qCondition['branchid'].setData(branchid)
25  qResult=coral.AttributeList()
26  qResult.extend('branch_id','unsigned long long')
27  qHandle.defineOutput(qResult)
28  qHandle.setCondition('BRANCH_ID>:branchid',qCondition)
29  cursor=qHandle.execute()
30  while cursor.next():
31  nextbranches.append(cursor.currentRow()['branch_id'].data())
32  del qHandle
33  candidates=[]
34  conditionStr='REVISION_ID!=0 and BRANCH_ID=:branchid and REVISION_ID<:tagrevisionid'
35  qHandle=schema.newQuery()
36  qHandle.addToTableList( nameDealer.revisionTableName() )
37  qHandle.addToOutputList('REVISION_ID','revision_id')
38  qCondition=coral.AttributeList()
39  qCondition.extend('branchid','unsigned long long')
40  qCondition.extend('tagrevisionid','unsigned long long')
41  qCondition['branchid'].setData(branchid)
42  qCondition['tagrevisionid'].setData(tagrevisionid)
43  qResult=coral.AttributeList()
44  qResult.extend('revision_id','unsigned long long')
45  qHandle.defineOutput(qResult)
46  qHandle.setCondition(conditionStr,qCondition)
47  cursor=qHandle.execute()
48  while cursor.next():
49  candidates.append(cursor.currentRow()['revision_id'].data())
50  del qHandle
51  for c in candidates:
52  if c in nextbranches:
53  continue
54  result.append(c)
55  return result
56  except:
57  if qHandle:del qHandle
58  raise
59 def revisionsInBranch(schema,branchid):
60  '''
61  returns all revision values in a branch
62  result=[revision_id]
63  select distinct branch_id from revisions where branch_id>:branchid;
64  select revision_id from revisions where branch_id=:branchid ;
65  if the branchid matches and the revisionid is not in the branchid collection,not 0, then this revision is in the branch
66  require also revisionid>branchid
67  '''
68  result=[]
69  qHandle=schema.newQuery()
70  try:
71  nextbranches=[]
72  qHandle.addToTableList( nameDealer.revisionTableName() )
73  qHandle.addToOutputList('distinct BRANCH_ID','branch_id')
74  qCondition=coral.AttributeList()
75  qCondition.extend('branchid','unsigned long long')
76  qCondition['branchid'].setData(branchid)
77  qResult=coral.AttributeList()
78  qResult.extend('branch_id','unsigned long long')
79  qHandle.defineOutput(qResult)
80  qHandle.setCondition('BRANCH_ID>:branchid',qCondition)
81  cursor=qHandle.execute()
82  while cursor.next():
83  nextbranches.append(cursor.currentRow()['branch_id'].data())
84  del qHandle
85  candidates=[]
86  conditionStr='BRANCH_ID=:branchid and REVISION_ID!=0'
87  qHandle=schema.newQuery()
88  qHandle.addToTableList( nameDealer.revisionTableName() )
89  qHandle.addToOutputList('REVISION_ID','revision_id')
90  qCondition=coral.AttributeList()
91  qCondition.extend('branchid','unsigned long long')
92  qCondition['branchid'].setData(branchid)
93  qResult=coral.AttributeList()
94  qResult.extend('revision_id','unsigned long long')
95  qHandle.defineOutput(qResult)
96  qHandle.setCondition(conditionStr,qCondition)
97  cursor=qHandle.execute()
98  while cursor.next():
99  candidates.append(cursor.currentRow()['revision_id'].data())
100  del qHandle
101  for c in candidates:
102  if c in nextbranches:
103  continue
104  result.append(c)
105  return result
106  except:
107  if qHandle: del qHandle
108  raise
109 
110 def branchType(schema,name):
111  '''
112  output: tag,branch
113  the difference between tag and branch: tag is an empty branch
114  select count(revision_id) from revisions where branch_name=:name
115  if >0: is real branch
116  else: is tag
117  '''
118  result='tag'
119  try:
120  qHandle=schema.newQuery()
121  qHandle.addToTableList( nameDealer.revisionTableName() )
122  qHandle.addToOutputList('count(REVISION_ID)','nchildren')
123  qCondition=coral.AttributeList()
124  qCondition.extend('branch_name','string')
125  qCondition['branch_name'].setData(name)
126  qResult=coral.AttributeList()
127  qResult.extend('nchildren','unsigned int')
128  qHandle.defineOutput(qResult)
129  conditionStr='BRANCH_NAME=:branch_name'
130  qHandle.setCondition(conditionStr,qCondition)
131  cursor=qHandle.execute()
132  while cursor.next():
133  if cursor.currentRow()['nchildren'].data()>0:
134  result='branch'
135  del qHandle
136  return result
137  except :
138  raise
139 #def revisionsInBranch(schema,branchid):
140 # '''
141 # returns all revision values in a branch/tag
142 # result=[revision_id]
143 # select r.revision_id from revisions r where r.branch_id=:branchid and r.revision_id not in (select distinct a.branch_id from revisions a where a.branch_id>:branchid)
144 # '''
145 # result=[]
146 # try:
147 # qHandle=schema.newQuery()
148 # subquery=qHandle.defineSubQuery('B')
149 # subquery.addToTableList( nameDealer.revisionTableName(),'a' )
150 # subquery.addToOutputList('distinct a.BRANCH_ID')
151 # subqueryCondition=coral.AttributeList()
152 # subqueryCondition.extend('branchid','unsigned long long')
153 # subqueryCondition['branchid'].setData(branchid)
154 # subquery.setCondition('a.BRANCH_ID>:branchid',subqueryCondition)
155 #
156 # qHandle.addToTableList( nameDealer.revisionTableName(),'r' )
157 # qHandle.addToTableList( 'B')
158 # qHandle.addToOutputList('r.REVISION_ID','revision_id')
159 # qCondition=coral.AttributeList()
160 # qCondition.extend('branchid','unsigned long long')
161 # qCondition['branchid'].setData(branchid)
162 # qResult=coral.AttributeList()
163 # qResult.extend('revision_id','unsigned long long')
164 # qHandle.defineOutput(qResult)
165 # conditionStr='r.BRANCH_ID=:branchid AND r.REVISION_ID NOT IN B'
166 # qHandle.setCondition(conditionStr,qCondition)
167 # cursor=qHandle.execute()
168 # while cursor.next():
169 # result.append(cursor.currentRow()['revision_id'].data())
170 # del qHandle
171 # return result
172 # except :
173 # raise
174 
175 def revisionsInBranchName(schema,branchname):
176  '''
177  returns all revisions in a branch/tag by name
178  '''
179  result=[]
180  try:
181  (revision_id,branch_id)=branchInfoByName(schema,branchname)
182  result=revisionsInBranch(schema,revision_id)
183  return result
184  except :
185  raise
186 def entryInBranch(schema,datatableName,entryname,branch):
187  '''
188  whether an entry(by name) already exists in the given branch
189  select e.entry_id from entrytable e,revisiontable r where r.revision_id=e.revision_id and e.name=:entryname and r.branch_name=branchname/branch_id
190  input:
191  if isinstance(branch,str):byname
192  else: byid
193  output:entry_id/None
194  '''
195  try:
196  result=None
197  byname=False
198  if isinstance(branch,str):
199  byname=True
200  qHandle=schema.newQuery()
201  qHandle.addToTableList( nameDealer.entryTableName(datatableName),'e' )
202  qHandle.addToTableList( nameDealer.revisionTableName(),'r' )
203  qHandle.addToOutputList('e.ENTRY_ID','entry_id')
204  qCondition=coral.AttributeList()
205  qCondition.extend('entryname','string')
206  qCondition['entryname'].setData(entryname)
207  qConditionStr='r.REVISION_ID=e.REVISION_ID and e.NAME=:entryname and '
208  if byname:
209  qCondition.extend('branch_name','string')
210  qCondition['branch_name'].setData(branch)
211  qConditionStr+='r.BRANCH_NAME=:branch_name'
212  else:
213  qCondition.extend('branch_id','unsigned long long')
214  qCondition['branch_id'].setData(branch)
215  qConditionStr+='r.BRANCH_ID=:branch_id'
216  qResult=coral.AttributeList()
217  qResult.extend('entry_id','unsigned long long')
218  qHandle.defineOutput(qResult)
219  qHandle.setCondition(qConditionStr,qCondition)
220  cursor=qHandle.execute()
221  while cursor.next():
222  entry_id=cursor.currentRow()['entry_id'].data()
223  result=entry_id
224  del qHandle
225  return result
226  except :
227  raise
228 
229 def dataRevisionsOfEntry(schema,datatableName,entry,revrange):
230  '''
231  all data version of the given entry whose revision falls in branch revision range
232  select d.data_id,r.revision_id from datatable d, datarevmaptable r where d.entry_id(or name )=:entry and d.data_id=r.data_id
233  input: if isinstance(entry,str): d.entry_name=:entry ; else d.entry_id=:entry
234  output: [data_id]
235  '''
236  qHandle=schema.newQuery()
237  try:
238  result=[]
239  byname=False
240  if isinstance(entry,str):
241  byname=True
242  qHandle.addToTableList( datatableName,'d' )
243  qHandle.addToTableList( nameDealer.revmapTableName(datatableName), 'r')
244  qHandle.addToOutputList('d.DATA_ID','data_id')
245  qHandle.addToOutputList('r.REVISION_ID','revision_id')
246  qCondition=coral.AttributeList()
247  qConditionStr='d.DATA_ID=r.DATA_ID and '
248  if byname:
249  qCondition.extend('entry_name','string')
250  qCondition['entry_name'].setData(entry)
251  qConditionStr+='d.ENTRY_NAME=:entry_name'
252  else:
253  qCondition.extend('entry_id','unsigned long long')
254  qCondition['entry_id'].setData(entry)
255  qConditionStr+='d.ENTRY_ID=:entry_id'
256  qResult=coral.AttributeList()
257  qResult.extend('data_id','unsigned long long')
258  qResult.extend('revision_id','unsigned long long')
259  qHandle.defineOutput(qResult)
260  qHandle.setCondition(qConditionStr,qCondition)
261  cursor=qHandle.execute()
262  while cursor.next():
263  data_id=cursor.currentRow()['data_id'].data()
264  revision_id=cursor.currentRow()['revision_id'].data()
265  if revision_id in revrange:
266  result.append(data_id)
267  return result
268  except :
269  del qHandle
270  raise
271 
272 def latestDataRevisionOfEntry(schema,datatableName,entry,revrange):
273  '''
274  return max(data_id) of all datarevisionofEntry
275  '''
276  result=dataRevisionsOfEntry(schema,datatableName,entry,revrange)
277  if result and len(result)!=0: return max(result)
278  return None
279 
280 def branchInfoByName(schema,branchName):
281  '''
282  select (revision_id,branch_id) from revisions where name=:branchName
283  '''
284  try:
285  qHandle=schema.newQuery()
286  qHandle.addToTableList( nameDealer.revisionTableName() )
287  qHandle.addToOutputList('REVISION_ID','revision_id')
288  qHandle.addToOutputList('BRANCH_ID','branch_id')
289  qCondition=coral.AttributeList()
290  qCondition.extend('name','string')
291  qCondition['name'].setData(branchName)
292  qResult=coral.AttributeList()
293  qResult.extend('revision_id','unsigned long long')
294  qResult.extend('branch_id','unsigned long long')
295  qHandle.defineOutput(qResult)
296  qHandle.setCondition('NAME=:name',qCondition)
297  cursor=qHandle.execute()
298  revision_id=None
299  branch_id=None
300  while cursor.next():
301  revision_id=cursor.currentRow()['revision_id'].data()
302  branch_id=cursor.currentRow()['branch_id'].data()
303  del qHandle
304  return (revision_id,branch_id)
305  except Exception,e :
306  raise RuntimeError(' revisionDML.branchInfoByName: '+str(e))
307 
308 
309 #=======================================================
310 #
311 # INSERT requires in update transaction
312 #
313 #=======================================================
314 def bookNewEntry(schema,datatableName):
315  '''
316  allocate new revision_id,entry_id,data_id
317  '''
318  try:
319  entrytableName=nameDealer.entryTableName(datatableName)
320  iddealer=idDealer.idDealer(schema)
321  revision_id=iddealer.generateNextIDForTable( nameDealer.revisionTableName() )
322  data_id=iddealer.generateNextIDForTable( datatableName)
323  entry_id=iddealer.generateNextIDForTable( nameDealer.entryTableName(datatableName) )
324  return (revision_id,entry_id,data_id)
325  except:
326  raise
327 
328 def bookNewRevision(schema,datatableName):
329  '''
330  allocate new revision_id,data_id
331  '''
332  try:
333  iddealer=idDealer.idDealer(schema)
334  revision_id=iddealer.generateNextIDForTable( nameDealer.revisionTableName() )
335  data_id=iddealer.generateNextIDForTable(datatableName)
336  return (revision_id,data_id)
337  except:
338  raise
339 
340 def addEntry(schema,datatableName,entryinfo,branchinfo):
341  '''
342  input:
343  entryinfo (revision_id(0),entry_id(1),entry_name(2),data_id(3))
344  branchinfo (branch_id,branch_name)
345  1.allocate and insert a new revision into the revisions table
346  2.allocate and insert a new entry into the entry table with the new revision
347  3.inset into data_rev table with new data_id ,revision)id mapping
348 
349  insert into revisions(revision_id,branch_id,branch_name,comment,ctime) values()
350  insert into datatablename_entries (entry_id,revision_id) values()
351  insert into datatablename_rev(data_id,revision_id) values()
352  '''
353  try:
354  revisiontableName=nameDealer.revisionTableName()
355  entrytableName=nameDealer.entryTableName(datatableName)
356  revtableName=nameDealer.revmapTableName(datatableName)
357 
358  db=dbUtil.dbUtil(schema)
359  tabrowDefDict={}
360  tabrowDefDict['REVISION_ID']='unsigned long long'
361  tabrowDefDict['BRANCH_ID']='unsigned long long'
362  tabrowDefDict['BRANCH_NAME']='string'
363  tabrowDefDict['CTIME']='time stamp'
364  tabrowValueDict={}
365  tabrowValueDict['REVISION_ID']=entryinfo[0]
366  tabrowValueDict['BRANCH_ID']=branchinfo[0]
367  tabrowValueDict['BRANCH_NAME']=branchinfo[1]
368  tabrowValueDict['CTIME']=coral.TimeStamp()
369  db.insertOneRow(revisiontableName,tabrowDefDict,tabrowValueDict)
370 
371  tabrowDefDict={}
372  tabrowDefDict['REVISION_ID']='unsigned long long'
373  tabrowDefDict['ENTRY_ID']='unsigned long long'
374  tabrowDefDict['NAME']='string'
375 
376  tabrowValueDict={}
377  tabrowValueDict['REVISION_ID']=entryinfo[0]
378  tabrowValueDict['ENTRY_ID']=entryinfo[1]
379  tabrowValueDict['NAME']=entryinfo[2]
380  db.insertOneRow(entrytableName,tabrowDefDict,tabrowValueDict)
381 
382  tabrowDefDict={}
383  tabrowDefDict['REVISION_ID']='unsigned long long'
384  tabrowDefDict['DATA_ID']='unsigned long long'
385  tabrowValueDict={}
386  tabrowValueDict['REVISION_ID']=entryinfo[0]
387  tabrowValueDict['DATA_ID']=entryinfo[3]
388  db.insertOneRow(revtableName,tabrowDefDict,tabrowValueDict)
389  except:
390  raise
391 
392 def addRevision(schema,datatableName,revisioninfo,branchinfo):
393  '''
394  1.insert a new revision into the revisions table
395  2.insert into data_id, revision_id pair to datatable_revmap
396  insert into revisions(revision_id,branch_id,branch_name,ctime) values()
397  insert into datatable_rev(data_id,revision_id) values())
398  input:
399  revisioninfo (revision_id(0),data_id(1))
400  branchinfo (branch_id(0),branch_name(1))
401  '''
402  try:
403  revisiontableName=nameDealer.revisionTableName()
404  revtableName=nameDealer.revmapTableName(datatableName)
405 
406  db=dbUtil.dbUtil(schema)
407  tabrowDefDict={}
408  tabrowDefDict['REVISION_ID']='unsigned long long'
409  tabrowDefDict['BRANCH_ID']='unsigned long long'
410  tabrowDefDict['BRANCH_NAME']='string'
411  tabrowDefDict['CTIME']='time stamp'
412 
413  tabrowValueDict={}
414  tabrowValueDict['REVISION_ID']=revisioninfo[0]
415  tabrowValueDict['BRANCH_ID']=branchinfo[0]
416  tabrowValueDict['BRANCH_NAME']=branchinfo[1]
417  tabrowValueDict['CTIME']=coral.TimeStamp()
418 
419  db.insertOneRow(revisiontableName,tabrowDefDict,tabrowValueDict)
420 
421  tabrowDefDict={}
422  tabrowDefDict['REVISION_ID']='unsigned long long'
423  tabrowDefDict['DATA_ID']='unsigned long long'
424  tabrowValueDict={}
425  tabrowValueDict['REVISION_ID']=revisioninfo[0]
426  tabrowValueDict['DATA_ID']=revisioninfo[1]
427  db.insertOneRow(revtableName,tabrowDefDict,tabrowValueDict)
428  except:
429  raise
430 def createBranch(schema,name,parentname,comment=''):
431  '''
432  create a new branch/tag under given parentnode
433  insert into revisions(revision_id,branch_id,branch_name,name,comment,ctime) values()
434  return (revisionid,parentid,parentname)
435  '''
436  try:
437  parentid=None
438  revisionid=0
439  if not parentname is None:
440  qHandle=schema.newQuery()
441  qHandle.addToTableList( nameDealer.revisionTableName() )
442  qHandle.addToOutputList( 'REVISION_ID','revision_id' )
443  qCondition=coral.AttributeList()
444  qCondition.extend('parentname','string')
445  qCondition['parentname'].setData(parentname)
446  qResult=coral.AttributeList()
447  qResult.extend('revision_id','unsigned long long')
448  qHandle.defineOutput(qResult)
449  qHandle.setCondition('NAME=:parentname',qCondition)
450  cursor=qHandle.execute()
451  while cursor.next():
452  parentid=cursor.currentRow()['revision_id'].data()
453  del qHandle
454  else:
455  parentname='ROOT'
456  iddealer=idDealer.idDealer(schema)
457  revisionid=iddealer.generateNextIDForTable( nameDealer.revisionTableName() )
458  db=dbUtil.dbUtil(schema)
459  tabrowDefDict={}
460  tabrowDefDict['REVISION_ID']='unsigned long long'
461  tabrowDefDict['BRANCH_ID']='unsigned long long'
462  tabrowDefDict['BRANCH_NAME']='string'
463  tabrowDefDict['NAME']='string'
464  tabrowDefDict['COMMENT']='string'
465  tabrowDefDict['CTIME']='time stamp'
466  tabrowValueDict={}
467  tabrowValueDict['REVISION_ID']=revisionid
468  tabrowValueDict['BRANCH_ID']=parentid
469  tabrowValueDict['BRANCH_NAME']=parentname
470  tabrowValueDict['NAME']=name
471  tabrowValueDict['COMMENT']=comment
472  tabrowValueDict['CTIME']=coral.TimeStamp()
473  db.insertOneRow(nameDealer.revisionTableName(),tabrowDefDict, tabrowValueDict )
474  return (revisionid,parentid,parentname)
475  except:
476  raise
477 
478 if __name__ == "__main__":
479  import sessionManager
480  import lumidbDDL
481  #myconstr='oracle://cms_orcoff_prep/cms_lumi_dev_offline'
482  #authpath='/afs/cern.ch/user/x/xiezhen'
483  myconstr='sqlite_file:test.db'
484  svc=sessionManager.sessionManager(myconstr,debugON=False)
485  session=svc.openSession(isReadOnly=False,cpp2sqltype=[('unsigned int','NUMBER(10)'),('unsigned long long','NUMBER(20)')])
486  schema=session.nominalSchema()
487  session.transaction().start(False)
488  tables=lumidbDDL.createTables(schema)
489  trunkinfo=createBranch(schema,'TRUNK',None,comment='main')
490  #print trunkinfo
491  datainfo=createBranch(schema,'DATA','TRUNK',comment='hold data')
492  #print datainfo
493  norminfo=createBranch(schema,'NORM','TRUNK',comment='hold normalization factor')
494  #print norminfo
495  (branchid,branchparent)=branchInfoByName(schema,'DATA')
496  databranchinfo=(branchid,'DATA')
497  print databranchinfo
498  for runnum in [1200,1211,1222,1233,1345,1222,1200]:
499  lumientryid=entryInBranch(schema,nameDealer.lumidataTableName(),str(runnum),'DATA')
500  trgentryid=entryInBranch(schema,nameDealer.trgdataTableName(),str(runnum),'DATA')
501  hltentryid=entryInBranch(schema,nameDealer.hltdataTableName(),str(runnum),'DATA')
502  if lumientryid is None:
503  (revision_id,entry_id,data_id)=bookNewEntry( schema,nameDealer.lumidataTableName() )
504  entryinfo=(revision_id,entry_id,str(runnum),data_id)
505  addEntry(schema,nameDealer.lumidataTableName(),entryinfo,databranchinfo)
506  #add data here
507  else:
509  addRevision(schema,nameDealer.lumidataTableName(),revisioninfo,databranchinfo)
510  #add data here
511  if trgentryid is None:
512  (revision_id,entry_id,data_id)=bookNewEntry( schema,nameDealer.trgdataTableName() )
513  entryinfo=(revision_id,entry_id,str(runnum),data_id)
514  addEntry(schema,nameDealer.trgdataTableName(),entryinfo,databranchinfo)
515  #add data here
516  else:
517  revisioninfo=bookNewRevision( schema,nameDealer.trgdataTableName() )
518  addRevision(schema,nameDealer.trgdataTableName(),revisioninfo,databranchinfo)
519  #add data here
520  if hltentryid is None:
521  (revision_id,entry_id,data_id)=bookNewEntry( schema,nameDealer.hltdataTableName() )
522  entryinfo=(revision_id,entry_id,str(runnum),data_id)
523  addEntry(schema,nameDealer.hltdataTableName(),entryinfo,databranchinfo)
524  #add data here
525  else:
526  revisioninfo=bookNewRevision( schema,nameDealer.hltdataTableName() )
527  addRevision(schema,nameDealer.hltdataTableName(),revisioninfo,databranchinfo)
528  #add data here
529 
530  session.transaction().commit()
531  print 'test reading'
532  session.transaction().start(True)
533  print branchType(schema,'DATA')
534  revlist=revisionsInBranchName(schema,'DATA')
535  print 'DATA revlist ',revlist
536  lumientry_id=entryInBranch(schema,nameDealer.lumidataTableName(),'1211','DATA')
537  print lumientry_id
538  latestrevision=latestDataRevisionOfEntry(schema,nameDealer.lumidataTableName(),lumientry_id,revlist)
539  print 'latest data_id for run 1211 ',latestrevision
540  session.transaction().commit()
541  del session
Definition: start.py:1
def branchInfoByName
Definition: revisionDML.py:280
def revmapTableName
Definition: nameDealer.py:65
def revisionsInBranchName
Definition: revisionDML.py:175
def revisionTableName
Definition: nameDealer.py:11
def createBranch
Definition: revisionDML.py:430
def trgdataTableName
Definition: nameDealer.py:29
const T & max(const T &a, const T &b)
def hltdataTableName
Definition: nameDealer.py:41
def createTables
Definition: lumidbDDL.py:8
def entryTableName
Definition: nameDealer.py:68
def lumidataTableName
Definition: nameDealer.py:17
def revisionsInBranch
Definition: revisionDML.py:59
def dataRevisionsOfEntry
Definition: revisionDML.py:229
def bookNewRevision
Definition: revisionDML.py:328
def revisionsInTag
Definition: revisionDML.py:10
def bookNewEntry
Definition: revisionDML.py:314
def entryInBranch
Definition: revisionDML.py:186
def latestDataRevisionOfEntry
Definition: revisionDML.py:272