Skip to content

Commit

Permalink
WIP Step 3
Browse files Browse the repository at this point in the history
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
  • Loading branch information
marcboulle committed Jul 19, 2024
1 parent 7a2ed34 commit aab9f37
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 75 deletions.
47 changes: 1 addition & 46 deletions src/Learning/KWData/KWClass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
11 changes: 4 additions & 7 deletions src/Learning/KWData/KWClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
51 changes: 30 additions & 21 deletions src/Learning/KWData/KWDatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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());
Expand All @@ -2109,6 +2107,7 @@ void KWDatabase::ComputeUnusedNativeAttributesToKeep(const NumericKeyDictionary*
KWAttribute* attribute;
int nAttribute;
ObjectArray oaAttributesToKeep;
ObjectArray oaNeededClasses;
NumericKeyDictionary nkdAnalysedRules;

require(kwcClass != NULL);
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Learning/MODL/MODL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit aab9f37

Please sign in to comment.