CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MappingDatabase.cc
Go to the documentation of this file.
2 #include "ClassUtils.h"
3 #include "MappingDatabase.h"
4 #include "IDatabaseSchema.h"
5 #include "MappingTree.h"
6 #include "MappingRules.h"
7 //
8 #include <sstream>
9 // externals
11 
14  std::string className = dictionary.cppName();
16  if( classVersion.empty() ) classVersion = MappingRules::defaultClassVersion(className);
17  return classVersion;
18 }
19 
21  const std::string& scopeName,
22  std::map<std::string, std::vector<MappingRawElement> >& innerElements ){
23  std::map<std::string,std::vector<MappingRawElement> >::iterator iScope = innerElements.find(scopeName);
24  if(iScope != innerElements.end()){
25  for( std::vector<MappingRawElement>::const_iterator iM = iScope->second.begin();
26  iM != iScope->second.end(); ++iM ){
27  MappingElement& element = parentElement.appendSubElement( iM->elementType,
28  iM->variableName,
29  iM->variableType,
30  iM->tableName );
31  element.setColumnNames(iM->columns);
32  std::string nextScope(scopeName);
33  nextScope.append("::").append(iM->variableName);
34  buildElement( element, nextScope, innerElements );
35  }
36  }
37  innerElements.erase(scopeName);
38 }
39 
41  int newElemId = m_mappingSequence.getNextId();
42  MappingRawElement& elem = destination.addElement( newElemId );
44  elem.scopeName = element.scopeName();
45  if(elem.scopeName.empty()) elem.scopeName = MappingRawElement::emptyScope();
46  elem.variableName = element.variableName();
47  elem.variableType = element.variableType();
48  elem.tableName = element.tableName();
49  elem.columns = element.columnNames();
50  for ( MappingElement::const_iterator iSubEl = element.begin();
51  iSubEl != element.end(); ++iSubEl) {
52  unfoldElement( iSubEl->second, destination );
53  }
54 }
55 
57  m_schema( schema ),
58  m_mappingSequence( MappingRules::sequenceNameForMapping(), schema ),
59  m_versions(),
60  m_isLoaded( false ){
61 }
62 
63 
65 }
66 
68  m_mappingSequence.create();
69 }
70 
73  if(!m_isLoaded){
74  m_schema.mappingSchema().getVersionList( m_versions );
75  m_isLoaded = true;
76  }
77 
78  std::string newMappingVersion = "";
79  for ( int iteration = 0;; ++iteration ) {
80  newMappingVersion = MappingRules::newMappingVersionForContainer( containerName, iteration );
81  bool found = false;
82  for ( std::set<std::string>::reverse_iterator iVersion = m_versions.rbegin();
83  iVersion != m_versions.rend(); ++iVersion ) {
84  if ( *iVersion == newMappingVersion ) {
85  found = true;
86  break;
87  }
88  }
89  if ( ! found ){
90  m_versions.insert( newMappingVersion );
91  break;
92  }
93 
94  }
95  return newMappingVersion;
96 }
97 
100  if(!m_isLoaded){
101  m_schema.mappingSchema().getVersionList( m_versions );
102  m_isLoaded = true;
103  }
104 
105  std::string newMappingVersion = "";
106  for ( int iteration = 0;; ++iteration ) {
107  newMappingVersion = MappingRules::newMappingVersionForDependentClass( containerName, className, iteration );
108  bool found = false;
109  for ( std::set<std::string>::reverse_iterator iVersion = m_versions.rbegin();
110  iVersion != m_versions.rend(); ++iVersion ) {
111  if ( *iVersion == newMappingVersion ) {
112  found = true;
113  break;
114  }
115  }
116  if ( ! found ){
117  m_versions.insert( newMappingVersion );
118  break;
119  }
120 
121  }
122  return newMappingVersion;
123 }
124 
126  bool ret = false;
127  MappingRawData mapData;
128  if(m_schema.mappingSchema().getMapping( version, mapData )){
129  ret = true;
130  MappingRawElement topLevelElement;
131  bool topLevelFound = false;
132  bool dependency = false;
133  std::map<std::string, std::vector<MappingRawElement> > innerElements;
134  for( std::map< int, MappingRawElement>::iterator iElem = mapData.elements.begin();
135  iElem != mapData.elements.end(); iElem++ ){
136  // first loading the top level elements
137  if( iElem->second.scopeName == MappingRawElement::emptyScope() ){
138  if( iElem->second.elementType == MappingElement::classMappingElementType() ||
139  iElem->second.elementType == MappingElement::dependencyMappingElementType() ){
140  if( topLevelFound ){
141  throwException("Mapping inconsistent.More then one top level element found.",
142  "MappingDatabase::getMappingByVersion");
143  }
144  topLevelElement = iElem->second;
145  if( topLevelElement.elementType == MappingElement::dependencyMappingElementType() ) dependency = true;
146  topLevelFound = true;
147  }
148  } else {
149  std::map<std::string, std::vector<MappingRawElement> >::iterator iN = innerElements.find( iElem->second.scopeName );
150  if(iN==innerElements.end()){
151  innerElements.insert( std::make_pair( iElem->second.scopeName, std::vector<MappingRawElement>(1,iElem->second) ) );
152  } else {
153  iN->second.push_back( iElem->second );
154  }
155  }
156  }
157  if( !topLevelFound ){
158  throwException( "Could not find top element for mapping version \""+version+"\".",
159  "MappingDatabase::getMappingByVersion" );
160  }
161  MappingElement& topElement = destination.setTopElement( topLevelElement.variableName,
162  topLevelElement.tableName,
163  dependency );
164  topElement.setColumnNames( topLevelElement.columns);
165  buildElement( topElement, topLevelElement.variableName, innerElements );
166  destination.setVersion( version );
167  }
168  return ret;
169 }
170 
172  m_schema.mappingSchema().removeMapping( version );
173 }
174 
175 bool
177  const std::string& classVersion,
178  int containerId,
179  MappingTree& destination ){
180  bool ret = false;
181  // The classId parameter
182  std::string classId = MappingRules::classId( className, classVersion );
183 
184  std::string version("");
185  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, version );
186 
187  if( found ){
188  ret = getMappingByVersion( version, destination );
189  if( !ret ){
190  throwException("Mapping version \""+version+"\" not found.",
191  "MappingDatabase::getMappingForContainer");
192  }
193  if( destination.className() != className ){
194  throwException("Mapping inconsistency detected for version=\""+version+"\"",
195  "MappingDatabase::getMappingForContainer");
196  }
197  }
198  return ret;
199 }
200 
202  int containerId,
203  MappingTree& destination ){
204  bool ret = false;
205  std::string classId = MappingRules::baseIdForClass( className );
206  std::string mappingVersion("");
207  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, mappingVersion );
208 
209  if( found ){
210  ret = getMappingByVersion( mappingVersion, destination );
211  if( !ret ){
212  throwException("Mapping version \""+mappingVersion+"\" not found.",
213  "MappingDatabase::getBaseMappingForContainer");
214  }
215  if( destination.className() != className ){
216  throwException("Mapping inconsistency detected for version=\""+mappingVersion+"\"",
217  "MappingDatabase::getBaseMappingForContainer");
218  }
219  }
220  return ret;
221 }
222 
224  std::vector<MappingElement>& destination ){
225  bool ret = false;
226  std::set<std::string> versions;
227  if( m_schema.mappingSchema().getMappingVersionListForContainer( containerId, versions, true ) ){
228  ret = true;
229  for( std::set<std::string>::iterator iM = versions.begin();
230  iM != versions.end(); ++iM ){
231  MappingTree mapping;
232  if( ! getMappingByVersion( *iM, mapping )){
233  throwException("Mapping version \""+*iM+"\" not found.",
234  "MappingDatabase::getDependentMappingsForContainer");
235 
236  }
237  destination.push_back( mapping.topElement() );
238  }
239  }
240  return ret;
241 }
242 
244  std::set<std::string>& destination ){
245  return m_schema.mappingSchema().getClassVersionListForMappingVersion( mappingVersion, destination );
246 }
247 
249  const std::string& classVersion,
250  int dependencyIndex,
251  int containerId,
252  const std::string& mappingVersion,
253  bool asBase ){
254  std::string classId = MappingRules::classId( className, classVersion );
255  m_schema.mappingSchema().insertClassVersion( className, classVersion, classId, dependencyIndex, containerId, mappingVersion );
256  if( asBase ){
257  m_schema.mappingSchema().insertClassVersion( className, MappingRules::baseClassVersion(), MappingRules::baseIdForClass( className ), dependencyIndex, containerId, mappingVersion );
258  }
259 }
260 
262  std::map<std::string,std::string>& versionMap ){
263 
264  return m_schema.mappingSchema().getClassVersionListForContainer( containerId, versionMap );
265 }
266 
268  int depIndex,
269  int containerId,
270  const std::string& mappingVersion,
271  bool asBase ){
272  std::string className = dictionaryEntry.cppName();
273  std::string classVersion = versionOfClass( dictionaryEntry );
274  insertClassVersion( className, classVersion, depIndex, containerId, mappingVersion, asBase );
275 }
276 
278  int containerId,
279  const std::string& mappingVersion,
280  bool dependency ){
281  std::string className = dictionaryEntry.cppName();
282  std::string classVersion = versionOfClass( dictionaryEntry );
283  std::string classId = MappingRules::classId( className, classVersion );
284  std::string mv("");
285  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, mv );
286  if( !found ){
287  int depIndex = 0;
288  if( dependency ) depIndex = 1;
289  m_schema.mappingSchema().insertClassVersion( className, classVersion, classId, depIndex, containerId, mappingVersion );
290  } else {
291  m_schema.mappingSchema().setMappingVersion( classId, containerId, mappingVersion );
292  }
293 }
294 
296  MappingRawData rowMapping( mapping.version() );
297  unfoldElement( mapping.topElement(), rowMapping );
298  m_mappingSequence.sinchronize();
299  m_schema.mappingSchema().storeMapping( rowMapping );
300 }
301 
302 bool ora::MappingDatabase::getMappingVersionsForContainer( int containerId, std::set<std::string>& versionList ){
303  return m_schema.mappingSchema().getMappingVersionListForContainer( containerId, versionList );
304 }
305 
306 const std::set<std::string>& ora::MappingDatabase::versions(){
307  if(!m_isLoaded){
308  m_schema.mappingSchema().getVersionList( m_versions );
309  m_isLoaded = true;
310  }
311  return m_versions;
312 }
313 
315  std::set<std::string>& list ){
316  return m_schema.mappingSchema().getDependentClassesInContainerMapping( containerId, list );
317 }
318 
320  m_versions.clear();
321  m_isLoaded = false;
322 }
323 
bool getMappingForContainer(const std::string &className, const std::string &classVersion, int containerId, MappingTree &destination)
MappingDatabase(IDatabaseSchema &schema)
Constructor.
MappingRawElement & addElement(int elementId)
bool getDependentMappingsForContainer(int containerId, std::vector< MappingElement > &destination)
bool getBaseMappingForContainer(const std::string &className, int containerId, MappingTree &destination)
const std::string & className() const
Definition: MappingTree.h:138
std::vector< std::string > columns
static std::string newMappingVersionForContainer(const std::string &containerName, int iteration)
mapping versions
const std::string & variableName() const
static std::string dependencyMappingElementType()
Returns the name of the dependent class mapping element type.
bool getClassVersionListForMappingVersion(const std::string &mappingVersion, std::set< std::string > &destination)
const std::string & version() const
Definition: MappingTree.h:128
void buildElement(MappingElement &parentElement, const std::string &scopeName, std::map< std::string, std::vector< MappingRawElement > > &innerElements)
static std::string baseIdForClass(const std::string &className)
Definition: MappingRules.cc:79
std::map< int, MappingRawElement > elements
ElementType elementType() const
void unfoldElement(const MappingElement &element, MappingRawData &destination)
MappingElement & setTopElement(const std::string &className, const std::string &tableName, bool isDependent=false)
Definition: MappingTree.cc:40
std::string newMappingVersionForDependentClass(const std::string &containerName, const std::string &className)
MappingElement & appendSubElement(const std::string &elementType, const std::string &variableName, const std::string &variableType, const std::string &tableName)
bool getMappingVersionsForContainer(int containerId, std::set< std::string > &versionList)
void storeMapping(const MappingTree &mappingStructure)
iterator begin()
Returns an iterator in the beginning of the sequence.
tuple iteration
Definition: align_cfg.py:5
std::string cppName() const
static std::string elementTypeAsString(ElementType elementType)
Converts the enumeration type to a string.
static std::string defaultClassVersion(const std::string &className)
static std::string emptyScope()
const MappingElement & topElement() const
Definition: MappingTree.h:143
~MappingDatabase()
Destructor.
const std::vector< std::string > & columnNames() const
bool getClassVersionListForContainer(int containerId, std::map< std::string, std::string > &versionMap)
std::string newMappingVersionForContainer(const std::string &className)
bool getDependentClassesForContainer(int containerId, std::set< std::string > &list)
bool getMappingByVersion(const std::string &version, MappingTree &destination)
const std::set< std::string > & versions()
void insertClassVersion(const edm::TypeWithDict &dictionaryEntry, int dependencyIndex, int containerId, const std::string &mappingVersion, bool asBase=false)
const std::string & variableType() const
std::map< std::string, MappingElement >::const_iterator const_iterator
void throwException(const std::string &message, const std::string &methodName) __attribute__((noreturn))
Definition: Exception.cc:10
iterator end()
Returns an iterator in the end of the sequence.
static std::string baseClassVersion()
Definition: MappingRules.cc:84
void setVersion(const std::string &version)
Definition: MappingTree.h:133
static std::string classId(const std::string &className, const std::string &classVersion)
Definition: MappingRules.cc:64
std::string getClassProperty(const std::string &propertyName, const edm::TypeWithDict &type)
Definition: ClassUtils.cc:497
static std::string versionOfClass(const edm::TypeWithDict &dictionary)
const std::string & tableName() const
static std::string newMappingVersionForDependentClass(const std::string &containerName, const std::string &className, int iteration)
volatile std::atomic< bool > shutdown_flag false
static std::string classVersionPropertyNameInDictionary()
static std::string classMappingElementType()
Returns the name of the class mapping element type.
void removeMapping(const std::string &version)
const std::string & scopeName() const
std::string className(const T &t)
Definition: ClassName.h:30
void setColumnNames(const std::vector< std::string > &columns)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
void setMappingVersionForClass(const edm::TypeWithDict &dictionaryEntry, int containerId, const std::string &mappingVersion, bool dependency=false)