Skip to content

Commit

Permalink
Fix bug in automatic memory management for table creation rules
Browse files Browse the repository at this point in the history
Problemes apparaissant avec des schema en flocon est des vues
- detecte dans z_TableCreationRules\NoKeyInCreatedSnowflake
  - variantes selon CheckDatabase, Compute, avec plus ou moins de constructed features
- exemple, flocon: Customer-Service-Usage
- Vue ServiceView sur Service, avec recuperation des usages
- Services en Unused:
  - destruction des Usages depuis Services, ce qui les rend inutilisables depuis les ServiceView

Autre probleme: jeu de test TestKhiops\z_TableCreationRules\BugDeleteSubTableOfView
- apprentissage avec creation de variables

Bilan
- les corrections ci-dessous permettent de resoudre tous les problemes connus
- la trace est maintenant suffisante pour identifier les problemes de gestion memoire
- il va falloir par contre optimiser la gestion des classe phtsique dans KWDatabase pour oiptiiser les calculs dans le cas de vues
  - gestion non optimale des attributs utilises pour le calcul de la classe logique par KWDatabase
  - cf. KWDRRelationCreationRule::BuildAllUsedAttributes

Tentative abandonnee de gestion automatique de la memoire par comptage de reference
- KWObject: mise en place de la gestion des references
  - longint lRefCount
  - SafeReferenceObject, SaveDeleteObject
  - idem pour tableau d'objets et bloc sparse de tableaux d'objets
- utilisation dans KWObject des methodes SafeReference* et SafeDelete*
  - ComputeAllValues
  - DeleteAttributes
  - CleanTemporayDataItemsToComputeAndClean
  - CleanAllNonNativeAttributes
  - CleanNativeRelationAttributes
  - Mutate
- KWClass: nettoyage de la gestion des UnloadedOwnedRelationAttribute
  - GetUnloadedOwnedRelationAttributeNumber: supprime
  - GetUnloadedOwnedRelationAttributeAt: supprime
  - GetTotalInternallyLoadedDataItemNumber: a supprimer
  - impacts sur KWObject: DeleteAttributes, Mutate, GetUsedMemory
- KWDatabase: nettoyage du calcul des attributs a garder
  - BuildPhysicalClass: calcul des attributs a garder commente
    - supression de ce parametre a propager
  - ComputeUnusedNativeAttributesToKeep: a suprimer
  - ComputeUnusedNativeAttributesToKeepForRule: a supprimer
- abandon car cela ne marche pas a cause des cycle de references potentiels
  - cf. graphe de donnees, base de molecules

KWDatabase::BuildPhysicalClass
- quand on reordonne les attribut physique surnumeraire en fin de classe, on ne deplace ceux
  qui etaient utilises dfans la classe logique
- par exemple: besoin d'un attribut natif used d'un classe en unused, mais en source d'une vue

KWDatabase::ComputeUnusedNativeAttributesToKeepForRule
- on prend on compte toutes les variables de type relation, quelle que soit leur nature
  - avant, on se limitait aux operandes relations de même type que celui du code retour de la regle
  - cela ne suffit pas pour les regles de creation d'instances
- on prend maintenant en operande l'ensemble des classes necessaires recursivement dans le flocon
  - on garde ainsi tous les attributs crees associes a un dictionnaire necessaire
  - resout le cas d'un dictionnaire utilise pour calculer une vue, mais jamais directement utilise sinon

Correction mineure additionnelle
- Bug dans les mappings multi-table avec des variables de type relation dont le nom est de longueur 1
- Bug d'assertion dans le mapping multi-table pour un nom de variable de un seul caractere en fin de data path
- Bug d'effet de bord
- Correction dans KWMTDatabaseMapping::CheckDataPath

Amelioration de la trace pour aider au diagnistique des probleme de gestion memoire des KWObject
- KWMTDatabase::UpdateMultiTableMappings: ajout de trace
- KWDatabase::BuildPhysicalClass: stabilisation de la trace
  - tri des classe
  - tri des attributs par classe, puis par nom
  - impact avec KWAttributeCompareClassAndAttributeName
    - variante de KWAttributeCompareName avec comparaison prealable du nom de la classe
- KWDatabase::MutatePhysicalObject: ajout de trace avant et apres mutation
- KWObject::PrettyWrite: version de Write avec indentations
- KWObject: ajout de trace pour la mise au point fine des mutations d'objets
  - ComputeAllValues
  - DeleteAttributes
  - Mutate

Tests complets sur \z_TableCreationRules en debug
  • Loading branch information
marcboulle committed Jul 19, 2024
1 parent 27b5b16 commit 1d23f2b
Show file tree
Hide file tree
Showing 13 changed files with 342 additions and 82 deletions.
29 changes: 29 additions & 0 deletions src/Learning/KWData/KWAttribute.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -696,6 +696,35 @@ int KWAttributeCompareBlockName(const void* elem1, const void* elem2)
return nDiff;
}

int KWAttributeCompareClassAndAttributeName(const void* elem1, const void* elem2)
{
KWAttribute* attribute1;
KWAttribute* attribute2;
int nDiff;

require(elem1 != NULL);
require(elem2 != NULL);

// Acces aux attributs
attribute1 = cast(KWAttribute*, *(Object**)elem1);
attribute2 = cast(KWAttribute*, *(Object**)elem2);

// Comparaison d'abord sur la classe
if (attribute1->GetParentClass() == attribute2->GetParentClass())
nDiff = 0;
else if (attribute1->GetParentClass() == NULL)
nDiff = -1;
else if (attribute2->GetParentClass() == NULL)
nDiff = 1;
else
nDiff = attribute1->GetParentClass()->GetName().Compare(attribute2->GetParentClass()->GetName());

// Difference
if (nDiff == 0)
nDiff = attribute1->GetName().Compare(attribute2->GetName());
return nDiff;
}

int KWAttributeCompareVarKey(const void* elem1, const void* elem2)
{
KWAttribute* attribute1;
Expand Down
3 changes: 3 additions & 0 deletions src/Learning/KWData/KWAttribute.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,9 @@ int KWAttributeCompareName(const void* elem1, const void* elem2);
// Methode de comparaison base sur le nom du bloc de l'attribut, puis de son nom
int KWAttributeCompareBlockName(const void* elem1, const void* elem2);

// Methode de comparaison base sur le nom de la classe contenant l'attribut puis celui de l'attribut
int KWAttributeCompareClassAndAttributeName(const void* elem1, const void* elem2);

// Methode de comparaison base sur la VarKey d'un attribut pour deux attribut d'un meme bloc
int KWAttributeCompareVarKey(const void* elem1, const void* elem2);

Expand Down
2 changes: 1 addition & 1 deletion 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
11 changes: 6 additions & 5 deletions src/Learning/KWData/KWClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,14 +322,15 @@ class KWClass : public Object
// Completion eventuelle des attributs avec les informations de type de leur regle de derivation
void CompleteTypeInfo();

// 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
// 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
void BuildAllUsedClasses(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
Loading

0 comments on commit 1d23f2b

Please sign in to comment.