From aab9f37f97688c8af69d0f54f1506945de07f58c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Fri, 19 Jul 2024 14:14:38 +0200 Subject: [PATCH] WIP Step 3 KWClass::BuildUsedClassesViaUsedAttributes: supression KWDatabase - BuildPhysicalClass! calcul correct des classes logique necessaires dans nkdNeededLogicalClasses - ComputeUnusedNativeAttributesToKeep: amelioration de la trace - ComputeUnusedNativeAttributesToKeepForRule: prise en compte effective du parametre nkdNeededClasses Tests complet sur \z_TableCreationRules en debug --- src/Learning/KWData/KWClass.cpp | 47 +-------------------------- src/Learning/KWData/KWClass.h | 11 +++---- src/Learning/KWData/KWDatabase.cpp | 51 ++++++++++++++++++------------ src/Learning/MODL/MODL.cpp | 2 +- 4 files changed, 36 insertions(+), 75 deletions(-) diff --git a/src/Learning/KWData/KWClass.cpp b/src/Learning/KWData/KWClass.cpp index 2f5fc264d..a4fc6a60a 100644 --- a/src/Learning/KWData/KWClass.cpp +++ b/src/Learning/KWData/KWClass.cpp @@ -671,7 +671,7 @@ int KWClass::ComputeOverallNativeRelationAttributeNumber(boolean bIncludingRefer odAnalysedCreatedClasses.SetAt(kwcTargetClass->GetName(), kwcTargetClass); - // Recherche de toutes les classe utilisee recursivement + // Recherche de toutes les classe utilisees recursivement kwcTargetClass->BuildAllUsedClasses(&oaUsedClass); // Recherches des classes externes @@ -1424,51 +1424,6 @@ void KWClass::BuildAllUsedClasses(ObjectArray* oaUsedClasses) const } } -void KWClass::BuildUsedClassesViaUsedAttributes(ObjectArray* oaUsedClasses) const -{ - NumericKeyDictionary nkdUsedClasses; - int nClass; - KWClass* kwcUsedClass; - KWAttribute* attribute; - - require(oaUsedClasses != NULL); - require(IsCompiled()); - - // Initialisation avec la classe courante - oaUsedClasses->RemoveAll(); - oaUsedClasses->Add((Object*)this); - nkdUsedClasses.SetAt(this, (Object*)this); - - // Parcours des classes utilises, en completant le tableau au fur et a mesure - // pour lesquelles il faut propager la duplication - for (nClass = 0; nClass < oaUsedClasses->GetSize(); nClass++) - { - kwcUsedClass = cast(KWClass*, oaUsedClasses->GetAt(nClass)); - - // Attributs de type Object ou ObjectArray - attribute = kwcUsedClass->GetHeadAttribute(); - while (attribute != NULL) - { - // Si sttribut avec classe referencee - if (attribute->GetUsed() and KWType::IsRelation(attribute->GetType())) - { - if (attribute->GetClass() != NULL) - { - // Memorisation si necessaire - if (nkdUsedClasses.Lookup(attribute->GetClass()) == NULL) - { - nkdUsedClasses.SetAt(attribute->GetClass(), attribute->GetClass()); - oaUsedClasses->Add(attribute->GetClass()); - } - } - } - - // Attribut suivant - kwcUsedClass->GetNextAttribute(attribute); - } - } -} - void KWClass::ExportNativeFieldNames(StringVector* svNativeFieldNames) const { KWAttribute* attribute; diff --git a/src/Learning/KWData/KWClass.h b/src/Learning/KWData/KWClass.h index e10b3e3b9..2777f742d 100644 --- a/src/Learning/KWData/KWClass.h +++ b/src/Learning/KWData/KWClass.h @@ -324,16 +324,13 @@ class KWClass : public Object // Calcul de l'ensemble des classes utilisees recursivement par les attributs de la classe courante // (y compris la classe courante) - // Prerequis: la classe doit etre compilee Memoire - // Le tableau du code retour appartient a l'appelant, et contient des references aux classes utilisees + // Prerequis: la classe doit etre compilee + // Memoire: le tableau du code retour appartient a l'appelant, et contient des references aux classes utilisees void BuildAllUsedClasses(ObjectArray* oaUsedClasses) const; - // Calcul de l'ensemble des classes utilisees recursivement par les attributs en used de la classe courante - void BuildUsedClassesViaUsedAttributes(ObjectArray* oaUsedClasses) const; - // Export des noms des champs natifs (stockes et non calcules, utilises ou non), dans l'ordre du dictionnaire - // (utile pour constituer une ligne de header) Il peut s'agir d'attributs denses natifs ou de blocs d'attributs - // non calcules + // (utile pour constituer une ligne de header) + // Il peut s'agir d'attributs denses natifs ou de blocs d'attributs non calcules void ExportNativeFieldNames(StringVector* svNativeFieldNames) const; // Export des noms des champs stockes (et loades), dans l'ordre du dictionnaire (utile pour constituer une ligne diff --git a/src/Learning/KWData/KWDatabase.cpp b/src/Learning/KWData/KWDatabase.cpp index 0a31f2240..9579e82b8 100644 --- a/src/Learning/KWData/KWDatabase.cpp +++ b/src/Learning/KWData/KWDatabase.cpp @@ -1411,8 +1411,7 @@ void KWDatabase::BuildPhysicalClass() NumericKeyDictionary nkdLoadedAttributeBlocks; NumericKeyDictionary nkdAllNeededClasses; NumericKeyDictionary nkdNeededUsedClasses; - NumericKeyDictionary nkdNeededClassesViaUsedAttributes; - ObjectArray oaNeededClassesViaUsedAttributes; + NumericKeyDictionary nkdNeededLogicalClasses; ObjectArray oaAllNeededClasses; ObjectArray oaAttributesToDelete; ObjectArray oaNeededAttributes; @@ -1596,6 +1595,14 @@ void KWDatabase::BuildPhysicalClass() oaClassNeededAttributes.RemoveAll(); } + // Collecte de toutes les logiques necessaires + for (nClass = 0; nClass < oaAllNeededClasses.GetSize(); nClass++) + { + kwcCurrentPhysicalClass = cast(KWClass*, oaAllNeededClasses.GetAt(nClass)); + kwcInitialClass = kwcClass->GetDomain()->LookupClass(kwcCurrentPhysicalClass->GetName()); + nkdNeededLogicalClasses.SetAt(kwcInitialClass, kwcInitialClass); + } + // Affichage des classes et attributs necessaires if (bTrace) { @@ -2080,17 +2087,8 @@ void KWDatabase::BuildPhysicalClass() } } - // Export des classe physique necessaire utilisee vers les classe logique correspondantes - kwcClass->BuildUsedClassesViaUsedAttributes(&oaNeededClassesViaUsedAttributes); - for (nClass = 0; nClass < oaNeededClassesViaUsedAttributes.GetSize(); nClass++) - { - kwcCurrentPhysicalClass = cast(KWClass*, oaNeededClassesViaUsedAttributes.GetAt(nClass)); - kwcInitialClass = kwcClass->GetDomain()->LookupClass(kwcCurrentPhysicalClass->GetName()); - nkdNeededClassesViaUsedAttributes.SetAt(kwcInitialClass, kwcInitialClass); - } - // Calcul des attributs natifs non utilises a garder pour gerer correctement la mutation des objets - ComputeUnusedNativeAttributesToKeep(&nkdNeededClassesViaUsedAttributes, &nkdUnusedNativeAttributesToKeep); + ComputeUnusedNativeAttributesToKeep(&nkdNeededLogicalClasses, &nkdUnusedNativeAttributesToKeep); ensure(kwcPhysicalClass != NULL); ensure(kwcPhysicalClass->GetName() == GetClassName()); @@ -2109,6 +2107,7 @@ void KWDatabase::ComputeUnusedNativeAttributesToKeep(const NumericKeyDictionary* KWAttribute* attribute; int nAttribute; ObjectArray oaAttributesToKeep; + ObjectArray oaNeededClasses; NumericKeyDictionary nkdAnalysedRules; require(kwcClass != NULL); @@ -2157,13 +2156,28 @@ void KWDatabase::ComputeUnusedNativeAttributesToKeep(const NumericKeyDictionary* // Affichage des attributs a garder if (bTrace) { + // Export des classes necessaires + nkdNeededClasses->ExportObjectArray(&oaNeededClasses); + oaNeededClasses.SetCompareFunction(KWClassCompareName); + oaNeededClasses.Sort(); + + // Affichagges des classe necessaires + cout << "ComputeUnusedNativeAttributesToKeep\n"; + cout << " Necessary classes\t" << nkdNeededClasses->GetCount() << "\n"; + for (nClass = 0; nClass < oaNeededClasses.GetSize(); nClass++) + { + kwcCurrentClass = cast(KWClass*, oaNeededClasses.GetAt(nClass)); + cout << "\t" << kwcCurrentClass->GetDomain()->GetName() << "\t" << kwcCurrentClass->GetName() + << "\n"; + } + // Export des attributs a garder nkdAttributes->ExportObjectArray(&oaAttributesToKeep); oaAttributesToKeep.SetCompareFunction(KWAttributeCompareClassAndAttributeName); oaAttributesToKeep.Sort(); - // Affichage - cout << "Unused native attributes to keep\t" << nkdAttributes->GetCount() << "\n"; + // Affichage des attributs + cout << " Unused native attributes to keep\t" << nkdAttributes->GetCount() << "\n"; for (nAttribute = 0; nAttribute < oaAttributesToKeep.GetSize(); nAttribute++) { attribute = cast(KWAttribute*, oaAttributesToKeep.GetAt(nAttribute)); @@ -2232,17 +2246,12 @@ void KWDatabase::ComputeUnusedNativeAttributesToKeepForRule(const NumericKeyDict attribute->GetAnyDerivationRule()); // Memorisation de l'attribut natif ou cree sinon, s'il n'est pas utilise - //DDD On prend en compte toutes les classes, sinon cela fait planter z_TableCreationRules\BugDeleteSubTableOfView - //DDD le parametre nkdNeededClasses est donc ignoer et inutile!!! - /*DDD + //DDD On prend en fait en compte toutes les classes, sinon cela fait planter z_TableCreationRules\BugDeleteSubTableOfView + //DDD le parametre nkdNeededClasses est donc a ignorer et inutile!!! if (not attribute->IsInBlock() and not attribute->GetReference() and not attribute->GetUsed() and nkdNeededClasses->Lookup(attribute->GetClass()) != NULL) nkdAttributes->SetAt(attribute, attribute); - */ - if (not attribute->IsInBlock() and not attribute->GetReference() and - not attribute->GetUsed()) - nkdAttributes->SetAt(attribute, attribute); } } } diff --git a/src/Learning/MODL/MODL.cpp b/src/Learning/MODL/MODL.cpp index 4cc8d0baa..7ff7308c9 100644 --- a/src/Learning/MODL/MODL.cpp +++ b/src/Learning/MODL/MODL.cpp @@ -38,7 +38,7 @@ int main(int argc, char** argv) // Choix du repertoire de lancement pour le debugage sous Windows (a commenter apres fin du debug) // SetWindowsDebugDir("Standard", "IrisLight"); // SetWindowsDebugDir("Standard", "IrisU2D"); - SetWindowsDebugDir("z_TableCreationRules", "BUG"); + SetWindowsDebugDir("z_TableCreationRules", "TableViewBasic"); // Parametrage des logs memoires depuis les variables d'environnement, pris en compte dans KWLearningProject // KhiopsMemStatsLogFileName, KhiopsMemStatsLogFrequency, KhiopsMemStatsLogToCollect