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 "MappingDatabase.h"
3 #include "IDatabaseSchema.h"
4 #include "MappingTree.h"
5 #include "MappingRules.h"
6 //
7 #include <sstream>
8 // externals
9 #include "Reflex/Type.h"
10 
11 std::string
13  std::string className = dictionary.Name(Reflex::SCOPED);
14  Reflex::PropertyList classProps = dictionary.Properties();
15  std::string classVersion = MappingRules::defaultClassVersion(className);
16  if(classProps.HasProperty(MappingRules::classVersionPropertyNameInDictionary())){
17  classVersion = classProps.PropertyAsString(MappingRules::classVersionPropertyNameInDictionary());
18  }
19  return classVersion;
20 }
21 
23  const std::string& scopeName,
24  std::map<std::string, std::vector<MappingRawElement> >& innerElements ){
25  std::map<std::string,std::vector<MappingRawElement> >::iterator iScope = innerElements.find(scopeName);
26  if(iScope != innerElements.end()){
27  for( std::vector<MappingRawElement>::const_iterator iM = iScope->second.begin();
28  iM != iScope->second.end(); ++iM ){
29  MappingElement& element = parentElement.appendSubElement( iM->elementType,
30  iM->variableName,
31  iM->variableType,
32  iM->tableName );
33  element.setColumnNames(iM->columns);
34  std::string nextScope(scopeName);
35  nextScope.append("::").append(iM->variableName);
36  buildElement( element, nextScope, innerElements );
37  }
38  }
39  innerElements.erase(scopeName);
40 }
41 
43  int newElemId = m_mappingSequence.getNextId();
44  MappingRawElement& elem = destination.addElement( newElemId );
46  elem.scopeName = element.scopeName();
47  if(elem.scopeName.empty()) elem.scopeName = MappingRawElement::emptyScope();
48  elem.variableName = element.variableName();
49  elem.variableType = element.variableType();
50  elem.tableName = element.tableName();
51  elem.columns = element.columnNames();
52  for ( MappingElement::const_iterator iSubEl = element.begin();
53  iSubEl != element.end(); ++iSubEl) {
54  unfoldElement( iSubEl->second, destination );
55  }
56 }
57 
59  m_schema( schema ),
60  m_mappingSequence( MappingRules::sequenceNameForMapping(), schema ),
61  m_versions(),
62  m_isLoaded( false ){
63 }
64 
65 
67 }
68 
70  m_mappingSequence.create();
71 }
72 
73 std::string
74 ora::MappingDatabase::newMappingVersionForContainer( const std::string& containerName ){
75  if(!m_isLoaded){
76  m_schema.mappingSchema().getVersionList( m_versions );
77  m_isLoaded = true;
78  }
79 
80  std::string newMappingVersion = "";
81  for ( int iteration = 0;; ++iteration ) {
82  newMappingVersion = MappingRules::newMappingVersionForContainer( containerName, iteration );
83  bool found = false;
84  for ( std::set<std::string>::reverse_iterator iVersion = m_versions.rbegin();
85  iVersion != m_versions.rend(); ++iVersion ) {
86  if ( *iVersion == newMappingVersion ) {
87  found = true;
88  break;
89  }
90  }
91  if ( ! found ){
92  m_versions.insert( newMappingVersion );
93  break;
94  }
95 
96  }
97  return newMappingVersion;
98 }
99 
100 std::string
101 ora::MappingDatabase::newMappingVersionForDependentClass( const std::string& containerName, const std::string& className ){
102  if(!m_isLoaded){
103  m_schema.mappingSchema().getVersionList( m_versions );
104  m_isLoaded = true;
105  }
106 
107  std::string newMappingVersion = "";
108  for ( int iteration = 0;; ++iteration ) {
109  newMappingVersion = MappingRules::newMappingVersionForDependentClass( containerName, className, iteration );
110  bool found = false;
111  for ( std::set<std::string>::reverse_iterator iVersion = m_versions.rbegin();
112  iVersion != m_versions.rend(); ++iVersion ) {
113  if ( *iVersion == newMappingVersion ) {
114  found = true;
115  break;
116  }
117  }
118  if ( ! found ){
119  m_versions.insert( newMappingVersion );
120  break;
121  }
122 
123  }
124  return newMappingVersion;
125 }
126 
127 bool ora::MappingDatabase::getMappingByVersion( const std::string& version, MappingTree& destination ){
128  bool ret = false;
129  MappingRawData mapData;
130  if(m_schema.mappingSchema().getMapping( version, mapData )){
131  ret = true;
132  MappingRawElement topLevelElement;
133  bool topLevelFound = false;
134  bool dependency = false;
135  std::map<std::string, std::vector<MappingRawElement> > innerElements;
136  for( std::map< int, MappingRawElement>::iterator iElem = mapData.elements.begin();
137  iElem != mapData.elements.end(); iElem++ ){
138  // first loading the top level elements
139  if( iElem->second.scopeName == MappingRawElement::emptyScope() ){
140  if( iElem->second.elementType == MappingElement::classMappingElementType() ||
141  iElem->second.elementType == MappingElement::dependencyMappingElementType() ){
142  if( topLevelFound ){
143  throwException("Mapping inconsistent.More then one top level element found.",
144  "MappingDatabase::getMappingByVersion");
145  }
146  topLevelElement = iElem->second;
147  if( topLevelElement.elementType == MappingElement::dependencyMappingElementType() ) dependency = true;
148  topLevelFound = true;
149  }
150  } else {
151  std::map<std::string, std::vector<MappingRawElement> >::iterator iN = innerElements.find( iElem->second.scopeName );
152  if(iN==innerElements.end()){
153  innerElements.insert( std::make_pair( iElem->second.scopeName, std::vector<MappingRawElement>(1,iElem->second) ) );
154  } else {
155  iN->second.push_back( iElem->second );
156  }
157  }
158  }
159  if( !topLevelFound ){
160  throwException( "Could not find top element for mapping version \""+version+"\".",
161  "MappingDatabase::getMappingByVersion" );
162  }
163  MappingElement& topElement = destination.setTopElement( topLevelElement.variableName,
164  topLevelElement.tableName,
165  dependency );
166  topElement.setColumnNames( topLevelElement.columns);
167  buildElement( topElement, topLevelElement.variableName, innerElements );
168  destination.setVersion( version );
169  }
170  return ret;
171 }
172 
173 void ora::MappingDatabase::removeMapping( const std::string& version ){
174  m_schema.mappingSchema().removeMapping( version );
175 }
176 
177 bool
179  const std::string& classVersion,
180  int containerId,
181  MappingTree& destination ){
182  bool ret = false;
183  // The classId parameter
184  std::string classId = MappingRules::classId( className, classVersion );
185 
186  std::string version("");
187  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, version );
188 
189  if( found ){
190  ret = getMappingByVersion( version, destination );
191  if( !ret ){
192  throwException("Mapping version \""+version+"\" not found.",
193  "MappingDatabase::getMappingForContainer");
194  }
195  if( destination.className() != className ){
196  throwException("Mapping inconsistency detected for version=\""+version+"\"",
197  "MappingDatabase::getMappingForContainer");
198  }
199  }
200  return ret;
201 }
202 
204  int containerId,
205  MappingTree& destination ){
206  bool ret = false;
207  std::string classId = MappingRules::baseIdForClass( className );
208  std::string mappingVersion("");
209  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, mappingVersion );
210 
211  if( found ){
212  ret = getMappingByVersion( mappingVersion, destination );
213  if( !ret ){
214  throwException("Mapping version \""+mappingVersion+"\" not found.",
215  "MappingDatabase::getBaseMappingForContainer");
216  }
217  if( destination.className() != className ){
218  throwException("Mapping inconsistency detected for version=\""+mappingVersion+"\"",
219  "MappingDatabase::getBaseMappingForContainer");
220  }
221  }
222  return ret;
223 }
224 
226  std::vector<MappingElement>& destination ){
227  bool ret = false;
228  std::set<std::string> versions;
229  if( m_schema.mappingSchema().getMappingVersionListForContainer( containerId, versions, true ) ){
230  ret = true;
231  for( std::set<std::string>::iterator iM = versions.begin();
232  iM != versions.end(); ++iM ){
233  MappingTree mapping;
234  if( ! getMappingByVersion( *iM, mapping )){
235  throwException("Mapping version \""+*iM+"\" not found.",
236  "MappingDatabase::getDependentMappingsForContainer");
237 
238  }
239  destination.push_back( mapping.topElement() );
240  }
241  }
242  return ret;
243 }
244 
245 bool ora::MappingDatabase::getClassVersionListForMappingVersion( const std::string& mappingVersion,
246  std::set<std::string>& destination ){
247  return m_schema.mappingSchema().getClassVersionListForMappingVersion( mappingVersion, destination );
248 }
249 
251  const std::string& classVersion,
252  int dependencyIndex,
253  int containerId,
254  const std::string& mappingVersion,
255  bool asBase ){
256  std::string classId = MappingRules::classId( className, classVersion );
257  m_schema.mappingSchema().insertClassVersion( className, classVersion, classId, dependencyIndex, containerId, mappingVersion );
258  if( asBase ){
259  m_schema.mappingSchema().insertClassVersion( className, MappingRules::baseClassVersion(), MappingRules::baseIdForClass( className ), dependencyIndex, containerId, mappingVersion );
260  }
261 }
262 
264  std::map<std::string,std::string>& versionMap ){
265 
266  return m_schema.mappingSchema().getClassVersionListForContainer( containerId, versionMap );
267 }
268 
270  int depIndex,
271  int containerId,
272  const std::string& mappingVersion,
273  bool asBase ){
274  std::string className = dictionaryEntry.Name( Reflex::SCOPED );
275  std::string classVersion = versionOfClass( dictionaryEntry );
276  insertClassVersion( className, classVersion, depIndex, containerId, mappingVersion, asBase );
277 }
278 
280  int containerId,
281  const std::string& mappingVersion,
282  bool dependency ){
283  std::string className = dictionaryEntry.Name( Reflex::SCOPED );
284  std::string classVersion = versionOfClass( dictionaryEntry );
285  std::string classId = MappingRules::classId( className, classVersion );
286  std::string mv("");
287  bool found = m_schema.mappingSchema().selectMappingVersion( classId, containerId, mv );
288  if( !found ){
289  int depIndex = 0;
290  if( dependency ) depIndex = 1;
291  m_schema.mappingSchema().insertClassVersion( className, classVersion, classId, depIndex, containerId, mappingVersion );
292  } else {
293  m_schema.mappingSchema().setMappingVersion( classId, containerId, mappingVersion );
294  }
295 }
296 
298  MappingRawData rowMapping( mapping.version() );
299  unfoldElement( mapping.topElement(), rowMapping );
300  m_mappingSequence.sinchronize();
301  m_schema.mappingSchema().storeMapping( rowMapping );
302 }
303 
304 bool ora::MappingDatabase::getMappingVersionsForContainer( int containerId, std::set<std::string>& versionList ){
305  return m_schema.mappingSchema().getMappingVersionListForContainer( containerId, versionList );
306 }
307 
308 const std::set<std::string>& ora::MappingDatabase::versions(){
309  if(!m_isLoaded){
310  m_schema.mappingSchema().getVersionList( m_versions );
311  m_isLoaded = true;
312  }
313  return m_versions;
314 }
315 
317  std::set<std::string>& list ){
318  return m_schema.mappingSchema().getDependentClassesInContainerMapping( containerId, list );
319 }
320 
322  m_versions.clear();
323  m_isLoaded = false;
324 }
325 
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)
void setMappingVersionForClass(const Reflex::Type &dictionaryEntry, int containerId, const std::string &mappingVersion, bool dependency=false)
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:78
std::map< int, MappingRawElement > elements
void insertClassVersion(const Reflex::Type &dictionaryEntry, int dependencyIndex, int containerId, const std::string &mappingVersion, bool asBase=false)
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
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)
static std::string versionOfClass(const Reflex::Type &dictionary)
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()
const std::string & variableType() const
std::map< std::string, MappingElement >::const_iterator const_iterator
iterator end()
Returns an iterator in the end of the sequence.
static std::string baseClassVersion()
Definition: MappingRules.cc:83
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:63
const std::string & tableName() const
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:10
static std::string newMappingVersionForDependentClass(const std::string &containerName, const std::string &className, int iteration)
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