]> SALOME platform Git repositories - modules/kernel.git/commitdiff
Salome HOME
#19765 EDF 21730 - long time to load med file file with huge amount of groups
authoreap <eap@opencascade.com>
Mon, 20 Jul 2020 07:17:12 +0000 (10:17 +0300)
committereap <eap@opencascade.com>
Mon, 20 Jul 2020 07:17:12 +0000 (10:17 +0300)
12 files changed:
idl/SALOMEDS.idl
src/SALOMEDS/SALOMEDS_UseCaseBuilder.cxx
src/SALOMEDS/SALOMEDS_UseCaseBuilder.hxx
src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.cxx
src/SALOMEDS/SALOMEDS_UseCaseBuilder_i.hxx
src/SALOMEDSClient/SALOMEDSClient_UseCaseBuilder.hxx
src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.cxx
src/SALOMEDSImpl/SALOMEDSImpl_AttributeTreeNode.hxx
src/SALOMEDSImpl/SALOMEDSImpl_ChildNodeIterator.cxx
src/SALOMEDSImpl/SALOMEDSImpl_Study.cxx
src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.cxx
src/SALOMEDSImpl/SALOMEDSImpl_UseCaseBuilder.hxx

index db5cc8cd67c7e10dd8412bc7a1e5a20a30d0424e..b6c4dcf2b47936ba97f254cac3ee8c60bc38fa4c 100644 (file)
@@ -1166,6 +1166,10 @@ Activates the %UseCaseIterator.
    Adds a child object <VAR>theObject</VAR> to the given father <VAR>theFather</VAR> object in the use case.
 */
     boolean AppendTo(in SObject theFather, in SObject theObject);
+/*!
+    Return index of a child among father children
+*/
+    long GetIndexInFather(in SObject theFather, in SObject theObject);
 /*!
     Inserts in the use case the object <VAR>theFirst</VAR> before the object <VAR>theNext</VAR>.
 */
index 31e7f3c1f9d0b7ef118d71280a4ec82564adf0d7..12863e92a5b59dd70fb7fa45c459aa997722fd5f 100644 (file)
@@ -104,6 +104,19 @@ bool SALOMEDS_UseCaseBuilder::InsertBefore(const _PTR(SObject)& theFirst, _PTR(S
   return ret;
 }
 
+int SALOMEDS_UseCaseBuilder::GetIndexInFather(const _PTR(SObject)& theFather, const _PTR(SObject)& theChild)
+{
+  int ret;
+  SALOMEDS_SObject* father = dynamic_cast<SALOMEDS_SObject*>(theFather.get());
+  SALOMEDS_SObject* child = dynamic_cast<SALOMEDS_SObject*>(theChild.get());
+  if (_isLocal) {
+    SALOMEDS::Locker lock;
+    ret = _local_impl->GetIndexInFather(*(father->GetLocalImpl()), *(child->GetLocalImpl()));
+  }
+  else ret = _corba_impl->GetIndexInFather(father->GetCORBAImpl(), child->GetCORBAImpl());
+  return ret;
+}
+
 bool SALOMEDS_UseCaseBuilder::SetCurrentObject(const _PTR(SObject)& theObject)
 {
   bool ret;
index ebc49dd664de1f801e6ecebb6bbbab756cd46766..b75aca17e42bf688c5c8a53cf1e166c47749f15d 100644 (file)
@@ -52,6 +52,7 @@ public:
   virtual bool Remove(const _PTR(SObject)& theObject);
   virtual bool AppendTo(const _PTR(SObject)& theFather, _PTR(SObject) theObject);
   virtual bool InsertBefore(const _PTR(SObject)& theFirst, _PTR(SObject) theNext);
+  virtual int GetIndexInFather(const _PTR(SObject)& theFather, const _PTR(SObject)& theObject);
   virtual bool  SetCurrentObject(const _PTR(SObject)& theObject);
   virtual bool SetRootCurrent();
   virtual bool  HasChildren(const _PTR(SObject)& theObject);
index 81b15f494cbf07b6e0c8a8b1bb705a4d2a29561a..f353fe9dd6d5710f636328b9abdbffb7294e5b44 100644 (file)
@@ -114,6 +114,21 @@ CORBA::Boolean SALOMEDS_UseCaseBuilder_i::AppendTo(SALOMEDS::SObject_ptr theFath
   return _impl->AppendTo(_impl->GetSObject(idF.in()), _impl->GetSObject( idO.in()));
 }
 
+//============================================================================
+/*! Function : GetIndexInFather
+ *  Purpose  :
+ */
+//============================================================================
+CORBA::Long SALOMEDS_UseCaseBuilder_i::GetIndexInFather(SALOMEDS::SObject_ptr theFather,
+                                                        SALOMEDS::SObject_ptr theObject)
+{
+  SALOMEDS::Locker lock;
+  if(!_impl || theFather->_is_nil() || theObject->_is_nil()) return -1;
+  CORBA::String_var idF = theFather->GetID();
+  CORBA::String_var idO = theObject->GetID();
+  return _impl->GetIndexInFather(_impl->GetSObject(idF.in()), _impl->GetSObject( idO.in()));
+}
+
 //============================================================================
 /*! Function : InsertBefore
  *  Purpose  :
index 6412db059edcb86df152d35a40b5f88f8b446272..901b7e2be34117388e0cf255dede3df1ee6f8d71 100644 (file)
@@ -67,6 +67,8 @@ public:
 
   virtual CORBA::Boolean AppendTo(SALOMEDS::SObject_ptr theFather, SALOMEDS::SObject_ptr theObject);
 
+  virtual CORBA::Long GetIndexInFather(SALOMEDS::SObject_ptr theFather, SALOMEDS::SObject_ptr theObject);
+
   virtual CORBA::Boolean InsertBefore(SALOMEDS::SObject_ptr theFirst, SALOMEDS::SObject_ptr theNext);
 
   virtual CORBA::Boolean  SetCurrentObject(SALOMEDS::SObject_ptr theObject);
index ac6b1f6df90b5aa2eb5ebe483d0b676e0eda7ce2..dce9c7de36bf163c3f8fe11af4e3b37ac60cdbb9 100644 (file)
@@ -41,6 +41,7 @@ public:
   virtual bool Remove(const _PTR(SObject)& theObject) = 0;
   virtual bool AppendTo(const _PTR(SObject)& theFather, _PTR(SObject) theObject) = 0;
   virtual bool InsertBefore(const _PTR(SObject)& theFirst, _PTR(SObject) theNext) = 0;
+  virtual int GetIndexInFather(const _PTR(SObject)& theFather, const _PTR(SObject)& theObject) = 0;
   virtual bool SetCurrentObject(const _PTR(SObject)& theObject) = 0;
   virtual bool SetRootCurrent() = 0;
   virtual bool HasChildren(const _PTR(SObject)& theObject) = 0;
index 79f00488ce987572d6859ff1e09f76c9c0217711..1c11208128cf8bd4643bb12532fa07b2de37ca47 100644 (file)
@@ -64,8 +64,9 @@ const std::string& SALOMEDSImpl_AttributeTreeNode::ID() const
 //=======================================================================
 //function : Append
 //purpose  : Add <TN> as last child of me
+//return   : index of TN under this, in C mode
 //=======================================================================
-bool SALOMEDSImpl_AttributeTreeNode::Append (SALOMEDSImpl_AttributeTreeNode* TN)
+bool SALOMEDSImpl_AttributeTreeNode::Append (SALOMEDSImpl_AttributeTreeNode* TN, int* childIndex)
 {
   CheckLocked();
 
@@ -76,6 +77,7 @@ bool SALOMEDSImpl_AttributeTreeNode::Append (SALOMEDSImpl_AttributeTreeNode* TN)
   TN->SetNext(NULL); // Deconnects from next.
 
   // Find the last
+  int index = 0;
   if (!HasFirst()) {
     SetFirst(TN);
     TN->SetPrevious(NULL); // Deconnects from previous.
@@ -84,15 +86,20 @@ bool SALOMEDSImpl_AttributeTreeNode::Append (SALOMEDSImpl_AttributeTreeNode* TN)
     SALOMEDSImpl_AttributeTreeNode* Last = GetFirst();
     while (Last && Last->HasNext()) {
       Last = Last->GetNext();
+      ++index;
     }
     Last->SetNext(TN);
     TN->SetPrevious(Last);
+    ++index;
   }
   // Set Father
   TN->SetFather(this);
   
   SetModifyFlag(); //SRN: Mark the study as being modified, so it could be saved 
-  
+
+  if ( childIndex )
+    *childIndex = index;
+
   return (TN);
 }
 
index 8d0bba2e06765b9c2321a456eea2eabf288eeb72..1344f3ea4bf0bdba2d5b34e192812f6564875f3d 100644 (file)
@@ -48,7 +48,7 @@ public:
   void SetFirst(const SALOMEDSImpl_AttributeTreeNode* value);
   void SetTreeID(const std::string& value);
 
-  bool Append(SALOMEDSImpl_AttributeTreeNode* value);  
+  bool Append(SALOMEDSImpl_AttributeTreeNode* value, int* childIndex = 0 );
   bool Prepend(SALOMEDSImpl_AttributeTreeNode* value);
   bool Remove();
   bool InsertBefore(SALOMEDSImpl_AttributeTreeNode* value);
index a6bf4dc7a7c40866d02e789eb5819797ef273d0d..5f11d442f21dd6685dfc473d9b6ff0299f3e1a1e 100644 (file)
 { \
     while (myNode && (myNode->Depth() > myFirstLevel) && myNode->myNext == NULL) \
       myNode = myNode->myFather; \
-        if (myNode && (myNode->Depth() > myFirstLevel) && myNode->myFather != NULL) \
-          myNode = myNode->myNext; \
-        else \
-          myNode = NULL; \
+    if (myNode && (myNode->Depth() > myFirstLevel) && myNode->myFather != NULL) \
+      myNode = myNode->myNext;                                          \
+    else                                                                \
+      myNode = NULL;                                                    \
 }
 
 //=======================================================================
index 9b0f1390d5af0da1a1835fb9cb43f800618466d7..7e2283971d792ad95a9062dc7bc61a34652ad77f 100644 (file)
@@ -803,7 +803,7 @@ bool SALOMEDSImpl_Study::Impl_SaveAs(const std::string& aStudyUrl,
     if (buffer[aLen-1] == '\n') buffer[aLen-1] = char(0);
 
 #ifdef WIN32    
-       // Force removing readonly attribute from a file under Windows, because of a but in the HDF
+    // Force removing readonly attribute from a file under Windows, because of a but in the HDF
     std::string aReadOlnyRmCmd = "attrib -r \"" + aStudyTmpDir + std::string(buffer)+ "\" > nul 2>&1";
 #ifdef UNICODE
     std::wstring awReadOlnyRmCmd = Kernel_Utils::utf8_decode_s(aReadOlnyRmCmd);
index 69aefb501a7c2c95c210d21506fdb434baddbcec..2ae8c8c0920ebdd15402462d7cf34d33100f294d 100644 (file)
@@ -43,12 +43,12 @@ namespace {
     bool operator()( SALOMEDSImpl_SObject firstSO, SALOMEDSImpl_SObject secondSO ) const {
       std::string firstName, secondName;
       SALOMEDSImpl_SObject refSO;
-      firstSO.ReferencedObject(refSO) ? 
-       firstName = refSO.GetName() : 
-       firstName = firstSO.GetName();
-      secondSO.ReferencedObject(refSO) ? 
-       secondName = refSO.GetName() : 
-       secondName = secondSO.GetName();
+      firstSO.ReferencedObject(refSO) ?
+        firstName = refSO.GetName() :
+        firstName = firstSO.GetName();
+      secondSO.ReferencedObject(refSO) ?
+        secondName = refSO.GetName() :
+        secondName = secondSO.GetName();
       return firstName < secondName;
     }
   };
@@ -58,12 +58,12 @@ namespace {
     bool operator()( SALOMEDSImpl_SObject firstSO, SALOMEDSImpl_SObject secondSO ) const {
       std::string firstName, secondName;
       SALOMEDSImpl_SObject refSO;
-      firstSO.ReferencedObject(refSO) ? 
-       firstName = refSO.GetName() : 
-       firstName = firstSO.GetName();
-      secondSO.ReferencedObject(refSO) ? 
-       secondName = refSO.GetName() : 
-       secondName = secondSO.GetName();
+      firstSO.ReferencedObject(refSO) ?
+        firstName = refSO.GetName() :
+        firstName = firstSO.GetName();
+      secondSO.ReferencedObject(refSO) ?
+        secondName = refSO.GetName() :
+        secondName = secondSO.GetName();
       return firstName > secondName;
     }
   };
@@ -75,7 +75,7 @@ namespace {
  */
 //============================================================================
 SALOMEDSImpl_UseCaseBuilder::SALOMEDSImpl_UseCaseBuilder(DF_Document* theDocument)
-:_doc(theDocument)
+  :_doc(theDocument), _lastChild(0), _childIndex(-1)
 {
   if(!_doc) return;
   
@@ -127,10 +127,11 @@ bool SALOMEDSImpl_UseCaseBuilder::Append(const SALOMEDSImpl_SObject& theObject)
   }  
 
   DF_Label aCurrent = aRef->Get();
-  if(aCurrent.IsNull() || !(aCurrentNode=(SALOMEDSImpl_AttributeTreeNode*)aCurrent.FindAttribute(_root->ID()))) 
+  if(aCurrent.IsNull() || !(aCurrentNode=(SALOMEDSImpl_AttributeTreeNode*)aCurrent.FindAttribute(_root->ID())))
     aCurrentNode = _root;
 
-  aCurrentNode->Append(aNode);
+  aCurrentNode->Append(aNode, &_childIndex);
+  _lastChild = aNode;
 
   // Mantis issue 0020136: Drag&Drop in OB
   SALOMEDSImpl_Study::GetStudyImpl(theObject.GetLabel())->addSO_Notification(theObject);
@@ -138,7 +139,7 @@ bool SALOMEDSImpl_UseCaseBuilder::Append(const SALOMEDSImpl_SObject& theObject)
   return true;
 }
 
- //============================================================================
+//============================================================================
 /*! Function : Remove
  *  Purpose  :
  */
@@ -147,12 +148,15 @@ bool SALOMEDSImpl_UseCaseBuilder::Remove(const SALOMEDSImpl_SObject& theObject)
 {
   if(!_root || !theObject) return false;
 
-  DF_Label aLabel = theObject.GetLabel();   
+  DF_Label aLabel = theObject.GetLabel();
   if(aLabel.IsNull()) return false;
 
   SALOMEDSImpl_AttributeTreeNode* aNode = NULL;
   if(!(aNode=(SALOMEDSImpl_AttributeTreeNode*)aLabel.FindAttribute(_root->ID()))) return false;
 
+  if ( _lastChild && aNode->GetFather() == _lastChild->GetFather() )
+    _lastChild = 0;
+
   aNode->Remove();
 
   std::vector<DF_Attribute*> aList;
@@ -160,13 +164,13 @@ bool SALOMEDSImpl_UseCaseBuilder::Remove(const SALOMEDSImpl_SObject& theObject)
 
   SALOMEDSImpl_AttributeReference* aRef = NULL;
   if(!(aRef=(SALOMEDSImpl_AttributeReference*)_root->FindAttribute(SALOMEDSImpl_AttributeReference::GetID()))) {
-    aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label());  
-  }  
+    aRef = SALOMEDSImpl_AttributeReference::Set(_root->Label(), _root->Label());
+  }
 
   DF_Label aCurrent = aRef->Get();
 
   SALOMEDSImpl_ChildNodeIterator aChildItr(aNode, true);
-  for(; aChildItr.More(); aChildItr.Next()) 
+  for(; aChildItr.More(); aChildItr.Next())
     aList.push_back(aChildItr.Value());
 
   for(int i = 0, len = aList.size(); i<len; i++) {
@@ -203,9 +207,24 @@ bool SALOMEDSImpl_UseCaseBuilder::AppendTo(const SALOMEDSImpl_SObject& theFather
     aNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, _root->ID());
   }
 
+  if ( aNode == _lastChild && !_lastChild->HasNext() && _lastChild->GetFather() == aFather )
+    return true; // aNode is already the last child
+
   aNode->Remove();
 
-  bool ret = aFather->Append(aNode);
+  bool ret = true;
+  if ( _lastChild && _lastChild->GetFather() == aFather &&
+       !_lastChild->HasNext() ) // _lastChild is the last under aFather
+  {
+    _lastChild->InsertAfter( aNode );
+    _lastChild = aNode;
+    ++_childIndex;
+  }
+  else
+  {
+    ret = aFather->Append(aNode, &_childIndex);
+    _lastChild  = aNode;
+  }
 
   // Mantis issue 0020136: Drag&Drop in OB
   SALOMEDSImpl_Study::GetStudyImpl(theObject.GetLabel())->addSO_Notification(theObject);
@@ -213,12 +232,70 @@ bool SALOMEDSImpl_UseCaseBuilder::AppendTo(const SALOMEDSImpl_SObject& theFather
   return ret;
 }
 
+//============================================================================
+/*! Function : GetIndexInFather
+ *  Purpose  :
+ */
+//============================================================================
+int SALOMEDSImpl_UseCaseBuilder::GetIndexInFather(const SALOMEDSImpl_SObject& theFather, 
+                                                  const SALOMEDSImpl_SObject& theObject)
+{
+  int index = -1;
+  if(!_root || !theFather || !theObject) return index;
+
+  DF_Label aFatherLabel = theFather.GetLabel(), aLabel = theObject.GetLabel();
+  if(aFatherLabel == aLabel) return index;
+
+  SALOMEDSImpl_AttributeTreeNode *aFather = NULL, *aNode = NULL;
+  
+  if(aFatherLabel.IsNull()) return index;
+  if(!(aFather=(SALOMEDSImpl_AttributeTreeNode*)aFatherLabel.FindAttribute(_root->ID()))) return index;
+
+  if(aLabel.IsNull()) return index;
+  if(!(aNode=(SALOMEDSImpl_AttributeTreeNode*)aLabel.FindAttribute(_root->ID()))) {
+    aNode = SALOMEDSImpl_AttributeTreeNode::Set(aLabel, _root->ID());
+  }
+
+  if ( _lastChild && _lastChild->GetFather() == aFather )
+  {
+    if ( aNode == _lastChild )
+      index = _childIndex;
+    else if ( aNode == _lastChild->GetPrevious())
+      index = _childIndex - 1;
+    else if ( aNode == _lastChild->GetNext())
+    {
+      index = ++_childIndex;
+      _lastChild = aNode;
+    }
+  }
+
+  if ( index < 0 )
+  {
+    SALOMEDSImpl_AttributeTreeNode* Last = aFather->GetFirst();
+    for ( index = 0; Last && Last->HasNext(); ++index )
+    {
+      Last = Last->GetNext();
+      if ( aNode == Last )
+        break;
+    }
+    if ( Last != aNode )
+      index = -1;
+    else if ( !Last->HasNext() )
+    {
+      _lastChild = Last;
+      _childIndex = index;
+    }
+  }
+
+  return index;
+}
+
 //============================================================================
 /*! Function : InsertBefore
  *  Purpose  :
  */
 //============================================================================
-bool SALOMEDSImpl_UseCaseBuilder::InsertBefore(const SALOMEDSImpl_SObject& theFirst, 
+bool SALOMEDSImpl_UseCaseBuilder::InsertBefore(const SALOMEDSImpl_SObject& theFirst,
                                                const SALOMEDSImpl_SObject& theNext)
 {
   if(!_root || !theFirst || !theNext) return false;
@@ -227,7 +304,7 @@ bool SALOMEDSImpl_UseCaseBuilder::InsertBefore(const SALOMEDSImpl_SObject& theFi
   if(aFirstLabel == aLabel) return false;
 
   SALOMEDSImpl_AttributeTreeNode *aFirstNode = NULL, *aNode = NULL;
-  
+
   if(aFirstLabel.IsNull()) return false;
   if((aFirstNode=(SALOMEDSImpl_AttributeTreeNode*)aFirstLabel.FindAttribute(_root->ID()))) {
     aFirstNode->Remove();
@@ -235,14 +312,22 @@ bool SALOMEDSImpl_UseCaseBuilder::InsertBefore(const SALOMEDSImpl_SObject& theFi
   }
 
   aFirstNode = SALOMEDSImpl_AttributeTreeNode::Set(aFirstLabel, _root->ID());
-  
+
   if(aLabel.IsNull()) return false;
-  if(!(aNode=(SALOMEDSImpl_AttributeTreeNode*)aLabel.FindAttribute(_root->ID()))) return false;    
+  if(!(aNode=(SALOMEDSImpl_AttributeTreeNode*)aLabel.FindAttribute(_root->ID()))) return false;
 
   aFirstNode->Remove();
 
   bool ret = aNode->InsertBefore(aFirstNode);
 
+  if ( _lastChild && _lastChild->GetFather() == aNode->GetFather() )
+  {
+    if ( aNode == _lastChild )
+      ++_childIndex;
+    else
+      _lastChild = 0;
+  }
+
   // Mantis issue 0020136: Drag&Drop in OB
   SALOMEDSImpl_Study::GetStudyImpl(theFirst.GetLabel())->addSO_Notification(theFirst);
 
@@ -335,14 +420,15 @@ bool SALOMEDSImpl_UseCaseBuilder::SortChildren(const SALOMEDSImpl_SObject& theOb
   for ( SALOMEDSImpl_AttributeTreeNode* aChildNode=aNode->GetFirst(); aChildNode; aChildNode=aChildNode->GetNext() ) {
     if ( SALOMEDSImpl_SObject aSO = SALOMEDSImpl_Study::SObject( aChildNode->Label() ) ) {
       if ( aChildNode->FindAttribute( SALOMEDSImpl_AttributeReference::GetID() ) )
-       aRefSOs.push_back( aSO );      
+        aRefSOs.push_back( aSO );      
       else
-       aNodeSOs.push_back( aSO );
+        aNodeSOs.push_back( aSO );
     }
   }
   if ( aRefSOs.empty() && aNodeSOs.empty() ) return false;
 
- //sort items by names in ascending/descending order
+  //sort items by names in ascending/descending order
+  _lastChild = 0;
   std::list<SALOMEDSImpl_SObject>::iterator it;  
   if ( !aRefSOs.empty() ) {
     theAscendingOrder ? aRefSOs.sort( AscSortSOs() ) : aRefSOs.sort( DescSortSOs() );
index ffc201ee0e9a2abdf725ae711e78373383fd7fb7..22b9b372a84e0891e8890a84f162d372b2f26554 100644 (file)
@@ -43,6 +43,10 @@ private:
   SALOMEDSImpl_AttributeTreeNode*     _root;
   DF_Document*                        _doc;
 
+  //[bos #19765] optimize inserting huge nb objects in the study
+  SALOMEDSImpl_AttributeTreeNode*     _lastChild;
+  int                                 _childIndex; // in C mode
+
 public:
 
   //! standard constructor  
@@ -59,6 +63,8 @@ public:
 
   virtual bool InsertBefore(const SALOMEDSImpl_SObject& theFirst, const SALOMEDSImpl_SObject& theNext);
 
+  int GetIndexInFather(const SALOMEDSImpl_SObject& theFather, const SALOMEDSImpl_SObject& theObject);
+
   virtual bool  SetCurrentObject(const SALOMEDSImpl_SObject& theObject);
 
   virtual bool SetRootCurrent();