From 0921f5a8b4b58b0a354f4404f3af32b6c4eb4cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Mon, 25 Nov 2024 09:33:57 +0100 Subject: [PATCH 01/14] Initialize management of uniqueness in multi-table schema // Unicite des instances de la classe // - soit la classe est racine // - soit elle contient des attributs de type relation non calcules, ce qui implique une unicite // de ses instances pour que chaque enregistrement de sous-table soit rattache de facon // unique a son enregistrement parent dans le schema multi-table hierachique // L'unicite est controlee uniquement au moment de la lecture des donnes a partir d'une base // pour des dictionnaire ayant des cles. Cela ne concerne pas les dictionnaires avec ou sans cle // utilise pour la construction de table en memoire // Cette caracteristique est calculee au moment de l'indexation de la classe KWClass::IsUnique Impacts principaux de la gestion de l'unicite - KWClass - Set|GetForceUnique: methode protected avancee pour forcer l'unicite, meme pour une classe sans sous-tables - KWDatabase - BuildPhysicalClass: memorisation par SetForceUnique de l'unicite de la classe physique, meme si ses attributs relation non calcules sont supprimes, car non utilises - KWMTDatabase - DMTMPhysicalRead: gestion de l'unicite lors de la lecture selon le caractere IsUnique (et non GetRoot) de la classe Quelques typos ou details corriges par ailleur - KWDataPreparationTask::ComputeNecessaryClassAttributeMemory - KWMTDatabase.h - Standard.cpp - Ermgt.cpp WIP --- src/Learning/KWData/KWClass.cpp | 14 +++++++ src/Learning/KWData/KWClass.h | 41 +++++++++++++++++++ src/Learning/KWData/KWDatabase.cpp | 5 +++ src/Learning/KWData/KWMTDatabase.cpp | 12 +++--- src/Learning/KWData/KWMTDatabase.h | 2 +- .../KWDataPreparationTask.cpp | 1 + src/Norm/base/Ermgt.cpp | 4 +- src/Norm/base/Standard.cpp | 2 +- 8 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/Learning/KWData/KWClass.cpp b/src/Learning/KWData/KWClass.cpp index b9f32e7e7..aade890d8 100644 --- a/src/Learning/KWData/KWClass.cpp +++ b/src/Learning/KWData/KWClass.cpp @@ -14,6 +14,8 @@ KWClass::KWClass() { bRoot = false; + bForceUnique = false; + bIsUnique = false; lClassHashValue = 0; nHashFreshness = 0; nFreshness = 0; @@ -369,6 +371,9 @@ void KWClass::IndexClass() ivUsedDenseAttributeNumbers.Initialize(); ivUsedSparseAttributeNumbers.Initialize(); + // Il y a unicite dans le cas d'une classe racine, ou si l'unicite est forcee + bIsUnique = bRoot or bForceUnique; + // Indexage des tableaux d'attributs par parcours de la liste sAttributeKeyMetaDataKey = KWAttributeBlock::GetAttributeKeyMetaDataKey(); nNativeAttributeBlockNumber = 0; @@ -378,6 +383,10 @@ void KWClass::IndexClass() { assert(attribute->GetType() != KWType::Unknown); + // Il y a unicite dans le cas d'utilisation d'attribut relation non calcule + if (KWType::IsRelation(attribute->GetType()) and attribute->GetAnyDerivationRule() == NULL) + bIsUnique = true; + // Calcul du nombre d'attributs natifs if (attribute->IsInBlock()) { @@ -595,6 +604,9 @@ void KWClass::IndexClass() cout << "Index dictionary\t" << GetName() << "\n"; if (GetDomain() != NULL) cout << " Domain\t" << GetDomain()->GetName() << "\n"; + cout << " Root\t" << BooleanToString(GetRoot()) << "\n"; + cout << " ForceUnique\t" << BooleanToString(GetForceUnique()) << "\n"; + cout << " IsUnique\t" << BooleanToString(IsUnique()) << "\n"; WriteAttributes(" Used attributes", &oaUsedAttributes, cout); WriteAttributes(" Loaded attributes", &oaLoadedAttributes, cout); WriteAttributes(" Loaded dense attributes", &oaLoadedDenseAttributes, cout); @@ -1518,6 +1530,8 @@ void KWClass::CopyFrom(const KWClass* aSource) usName = aSource->usName; usLabel = aSource->usLabel; bRoot = aSource->bRoot; + bForceUnique = aSource->bForceUnique; + bIsUnique = aSource->bIsUnique; // Duplication des meta-donnees metaData.CopyFrom(&aSource->metaData); diff --git a/src/Learning/KWData/KWClass.h b/src/Learning/KWData/KWClass.h index 5dd8094a6..5ba020999 100644 --- a/src/Learning/KWData/KWClass.h +++ b/src/Learning/KWData/KWClass.h @@ -81,6 +81,17 @@ class KWClass : public Object boolean GetRoot() const; void SetRoot(boolean bValue); + // Unicite des instances de la classe + // - soit la classe est racine + // - soit elle contient des attributs de type relation non calcules, ce qui implique une unicite + // de ses instances pour que chaque enregistrement de sous-table soit rattache de facon + // unique a son enregistrement parent dans le schema multi-table hierachique + // L'unicite est controlee uniquement au moment de la lecture des donnes a partir d'une base + // pour des dictionnaire ayant des cles. Cela ne concerne pas les dictionnaires avec ou sans cle + // utilise pour la construction de table en memoire + // Cette caracteristique est calculee au moment de l'indexation de la classe + boolean IsUnique() const; + ///////////////////////////////////////////////////////////// // Specification des attributs de la cle de la classe // Facultatif: utile dans pour les chainage entre classes dans le cas @@ -478,6 +489,13 @@ class KWClass : public Object // Seule la classe KWDatabase a l'usage des deux listes ci-dessous friend class KWDatabase; + // Parametrage force du caractere unique d'une classe + // Parametrage avance, utilise par exemple pour une classe unique en raison de + // ses sous-tables non calculees, mais pour la quelle ces sous tables ont ete + // supprimees pour optimiser les lectures de donnees + boolean GetForceUnique() const; + void SetForceUnique(boolean bValue); + // Liste des elements de donnees devant etre calcules ObjectArray* GetDatabaseDataItemsToCompute(); const ObjectArray* GetConstDatabaseDataItemsToCompute() const; @@ -571,6 +589,12 @@ class KWClass : public Object // Statut racine ou composant boolean bRoot; + // Statut unique force + boolean bForceUnique; + + // Statut unique: racine, ou ayant des attribut relation natifs, imposant l'unicite + boolean bIsUnique; + // Nom des attributs cles (potentiellement specifies avant la specification des attributs de la classe) StringVector svKeyAttributeNames; @@ -684,6 +708,12 @@ inline void KWClass::SetRoot(boolean bValue) UpdateFreshness(); } +inline boolean KWClass::IsUnique() const +{ + require(IsIndexed()); + return bIsUnique; +} + inline int KWClass::GetKeyAttributeNumber() const { return svKeyAttributeNames.GetSize(); @@ -885,6 +915,17 @@ inline KWDataItem* KWClass::GetDataItemAtLoadIndex(KWLoadIndex liIndex) const return cast(KWDataItem*, oaLoadedDataItems.GetAt(liIndex.GetDenseIndex())); } +inline boolean KWClass::GetForceUnique() const +{ + return bForceUnique; +} + +inline void KWClass::SetForceUnique(boolean bValue) +{ + bForceUnique = bValue; + UpdateFreshness(); +} + inline ObjectArray* KWClass::GetDatabaseDataItemsToCompute() { return &oaDatabaseDataItemsToCompute; diff --git a/src/Learning/KWData/KWDatabase.cpp b/src/Learning/KWData/KWDatabase.cpp index f0bb3d3e4..4bc5903af 100644 --- a/src/Learning/KWData/KWDatabase.cpp +++ b/src/Learning/KWData/KWDatabase.cpp @@ -1696,6 +1696,11 @@ void KWDatabase::BuildPhysicalClass() nkdLoadedAttributeBlocks.SetAt(attributeBlock, attributeBlock); } + // On force l'unicite de la clase physique si necessaire + // En effet, apres nettoyage, celle-ci ne sera potentiellement plus en mesure de deduire + // son unicite de sa composition en attributs relation non calcules, si ceux-ci ont ete detruits + kwcCurrentPhysicalClass->SetForceUnique(kwcInitialClass->IsUnique()); + // Si la classe n'est pas necessaire au niveau logique, // ses attributs de base ne sont pas a charger if (nkdNeededUsedClasses.Lookup(kwcCurrentPhysicalClass) == NULL) diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index cf5c4edfe..ee97a5a2a 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -2290,7 +2290,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) // Gestion de la coherence pour toute classe principale ayant une cle // Le cas des classes composant est traite plus loin - if (mapping == rootMultiTableMapping or kwoObject->GetClass()->GetRoot()) + if (mapping == rootMultiTableMapping or kwoObject->GetClass()->IsUnique()) { // Test a partir du deuxieme enregistrement effectivement lu, pour lequel le LastReadKey est // initialise) @@ -2300,7 +2300,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) // Warning si la cle egale dans le cas d'une classe racine, et supression de // l'enregistrement - if (kwoObject->GetClass()->GetRoot() and + if (kwoObject->GetClass()->IsUnique() and objectKey.StrictCompare(mapping->GetLastReadKey()) == 0) { // Warning de lecture @@ -2336,9 +2336,11 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) if (kwoObject == NULL) return NULL; - // Incrementation du compteur d'objet utilise au niveau physique - mapping->GetDataTableDriver()->SetUsedRecordNumber( - mapping->GetDataTableDriver()->GetUsedRecordNumber() + 1); + // Incrementation du compteur d'objet utilise au niveau physique pour la classe principale + // L'incrementation pour les mapping de la composiitonn est effectuee par la suite + if (mapping == mainMultiTableMapping) + mapping->GetDataTableDriver()->SetUsedRecordNumber( + mapping->GetDataTableDriver()->GetUsedRecordNumber() + 1); } // Parcours des mappings de la composition pour completer la lecture de l'objet diff --git a/src/Learning/KWData/KWMTDatabase.h b/src/Learning/KWData/KWMTDatabase.h index 6fdc41e21..eedf5cad3 100644 --- a/src/Learning/KWData/KWMTDatabase.h +++ b/src/Learning/KWData/KWMTDatabase.h @@ -218,7 +218,7 @@ class KWMTDatabase : public KWDatabase // Mapping racine pour la table principale // Ce mapping doit toujours etre present et contient le parametrage (nom de base, nom de classe) principal - // L'utilisation d'un mapping pour la racine permet d'unifier les traitement entre tables principales + // L'utilisation d'un mapping pour la racine permet d'unifier les traitements entre tables principales // et tables secondaires mutable KWMTDatabaseMapping* rootMultiTableMapping; diff --git a/src/Learning/KWDataPreparation/KWDataPreparationTask.cpp b/src/Learning/KWDataPreparation/KWDataPreparationTask.cpp index 2efa4ba40..608047e46 100644 --- a/src/Learning/KWDataPreparation/KWDataPreparationTask.cpp +++ b/src/Learning/KWDataPreparation/KWDataPreparationTask.cpp @@ -658,6 +658,7 @@ longint KWDataPreparationTask::ComputeNecessaryClassAttributeMemory() const dummyAttribute = new KWAttribute; dummyAttribute->SetType(KWType::Symbol); dummyAttribute->SetName("Dummy"); + dummyClass.SetName("Dummy"); dummyClass.InsertAttribute(dummyAttribute); // On rajoute une meta-data comme si l'attribut etait dans un bloc diff --git a/src/Norm/base/Ermgt.cpp b/src/Norm/base/Ermgt.cpp index 97e27c35e..db515e137 100644 --- a/src/Norm/base/Ermgt.cpp +++ b/src/Norm/base/Ermgt.cpp @@ -78,8 +78,8 @@ void Global::SignalHandler(int nSigNum) else cout << "Interrupt signal " << nSigNum << " : Unknown error" << endl; - // Sortie du programe (on n'utilise pas les signaux comme valeurs de retour car on renvoie 1 en cas d'erreur - // fatale et 2 en cas d'erreurs) + // Sortie du programe + // (on n'utilise pas les signaux comme valeurs de retour car on renvoie 1 en cas d'erreur fatale) exit(EXIT_FAILURE); } diff --git a/src/Norm/base/Standard.cpp b/src/Norm/base/Standard.cpp index 023353538..2b8ea9fd6 100644 --- a/src/Norm/base/Standard.cpp +++ b/src/Norm/base/Standard.cpp @@ -681,7 +681,7 @@ void GlobalExit() fflush(NULL); #endif - // Sortie fatale (seul exit de toutes) + // Sortie fatale (seul exit de tout le code) // les librairies NORM) exit(nExitCode); } From 22cdcc5316e1f6ca7d5d015f0fa17661511e23c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Wed, 4 Dec 2024 16:36:08 +0100 Subject: [PATCH 02/14] Save ForceUnique in KWClass using private meta-data Gestion du ForceUnique de la classe pour la lecture/ecriture de dictionnaire dans les fichiers Permet de transferer cette information "privee", par exemple pour une tache parallele On en profite pour normaliser la terminologie des methodes de gestion de ces meta-donnees prives. Impacts: - KWClass - WritePrivateMetaData, ReadPrivateMetaData: - KWAttribute - WritePrivateMetaData, ReadPrivateMetaData: KWCLex: supression de caracteres accentues d'un commentaire --- src/Learning/KWData/KWAttribute.cpp | 12 +- src/Learning/KWData/KWAttribute.h | 10 +- src/Learning/KWData/KWCLex.inc | 2 +- src/Learning/KWData/KWCLex.lex | 2 +- src/Learning/KWData/KWCYac.cpp | 484 ++++++++++++++-------------- src/Learning/KWData/KWCYac.hpp | 4 +- src/Learning/KWData/KWCYac.yac | 4 +- src/Learning/KWData/KWClass.cpp | 51 ++- src/Learning/KWData/KWClass.h | 14 +- 9 files changed, 307 insertions(+), 276 deletions(-) diff --git a/src/Learning/KWData/KWAttribute.cpp b/src/Learning/KWData/KWAttribute.cpp index 13b934b29..b146b6c7a 100644 --- a/src/Learning/KWData/KWAttribute.cpp +++ b/src/Learning/KWData/KWAttribute.cpp @@ -551,7 +551,7 @@ void KWAttribute::Write(ostream& ost) const ost << ";"; // Meta-donnees - WriteNotLoadedMetaData(ost); + WritePrivateMetaData(ost); if (metaData.GetKeyNumber() > 0) { ost << ' '; @@ -611,21 +611,21 @@ void KWAttribute::WriteJSONFields(JSONFile* fJSON) metaData.WriteJSONKeyReport(fJSON, "metaData"); } -void KWAttribute::WriteNotLoadedMetaData(ostream& ost) const +void KWAttribute::WritePrivateMetaData(ostream& ost) const { - KWMetaData usedNotLoadedMetaData; + KWMetaData privateMetaData; // Memorisation dans une meta-data temporaire de l'information d'utilisation d'un attribut non charge en memoire // Permet de transferer cette information "privee", par exemple pour une tache parallele if (GetUsed() and not GetLoaded()) { - usedNotLoadedMetaData.SetNoValueAt("_NotLoaded"); + privateMetaData.SetNoValueAt("_NotLoaded"); ost << ' '; - usedNotLoadedMetaData.Write(ost); + privateMetaData.Write(ost); } } -void KWAttribute::ReadNotLoadedMetaData() +void KWAttribute::ReadPrivateMetaData() { if (GetMetaData()->GetKeyNumber() > 0 and GetMetaData()->IsMissingTypeAt("_NotLoaded")) { diff --git a/src/Learning/KWData/KWAttribute.h b/src/Learning/KWData/KWAttribute.h index a7c9d5549..059bf6858 100644 --- a/src/Learning/KWData/KWAttribute.h +++ b/src/Learning/KWData/KWAttribute.h @@ -208,14 +208,14 @@ class KWAttribute : public KWDataItem void BuildAdvancedTypeSpecification(); ////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Gestion des attribut Used mais pas Loaded, pour la lecture/ecriture de dictionnaire dans les fichiers + // Gestion des attributs Used mais pas Loaded, pour la lecture/ecriture de dictionnaire dans les fichiers // Permet de transferer cette information "privee", par exemple pour une tache parallele - // Ecriture si necessaire de l'information NotLoaded dans les meta-data - void WriteNotLoadedMetaData(ostream& ost) const; + // Ecriture si necessaire des informations prives dans les meta-data (_NotLoaded) + void WritePrivateMetaData(ostream& ost) const; - // Lecture et prise en compte de l'information NotLoaded depuis les meta-data et nettoyage de ceux-ci - void ReadNotLoadedMetaData(); + // Lecture et prise en compte des l'informations privees depuis les meta-data et nettoyage de ceux-ci + void ReadPrivateMetaData(); // Bloc d'attribut eventuel auquel l'attribut appartient KWAttributeBlock* attributeBlock; diff --git a/src/Learning/KWData/KWCLex.inc b/src/Learning/KWData/KWCLex.inc index 710350608..8b844a99f 100644 --- a/src/Learning/KWData/KWCLex.inc +++ b/src/Learning/KWData/KWCLex.inc @@ -560,7 +560,7 @@ char *yytext; // Desactivation de warnings pour le Visual C++ #ifdef __MSC__ -#pragma warning(disable : 4505) // C4505: la fonction locale non référencée a été supprimée +#pragma warning(disable : 4505) // C4505: la fonction locale non referencee a ete supprimee #pragma warning(disable : 4996) // C4996: warning for deprecated POSIX names isatty and fileno #endif // __MSC__ diff --git a/src/Learning/KWData/KWCLex.lex b/src/Learning/KWData/KWCLex.lex index f5b6bb87d..4e2fd230a 100644 --- a/src/Learning/KWData/KWCLex.lex +++ b/src/Learning/KWData/KWCLex.lex @@ -3,7 +3,7 @@ // Desactivation de warnings pour le Visual C++ #ifdef __MSC__ -#pragma warning(disable : 4505) // C4505: la fonction locale non référencée a été supprimée +#pragma warning(disable : 4505) // C4505: la fonction locale non referencee a ete supprimee #pragma warning(disable : 4996) // C4996: warning for deprecated POSIX names isatty and fileno #endif // __MSC__ diff --git a/src/Learning/KWData/KWCYac.cpp b/src/Learning/KWData/KWCYac.cpp index db78d6739..d934afb28 100644 --- a/src/Learning/KWData/KWCYac.cpp +++ b/src/Learning/KWData/KWCYac.cpp @@ -127,7 +127,7 @@ static int nFileParsingErrorNumber = 0; extern char *yyptok(int i); */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" #ifndef YY_CAST #ifdef __cplusplus @@ -566,11 +566,11 @@ static const yytype_int8 yytranslate[] = { /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { 0, 143, 143, 147, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 198, 202, - 206, 210, 216, 229, 230, 233, 236, 246, 254, 295, 374, 393, 404, 447, 494, 586, 593, - 601, 607, 617, 630, 650, 672, 691, 708, 716, 851, 863, 870, 882, 889, 894, 901, 906, - 913, 917, 921, 925, 929, 933, 937, 941, 945, 949, 953, 961, 966, 972, 976, 980, 985, - 994, 999, 1005, 1025, 1041, 1149, 1153, 1199, 1206, 1217, 1230, 1243, 1254, 1268, 1277, 1286, 1296, - 1306, 1317, 1326, 1333, 1334, 1338, 1343, 1349, 1350, 1354, 1359, 1371, 1373}; + 206, 210, 216, 229, 230, 233, 236, 246, 254, 296, 376, 395, 406, 450, 498, 591, 598, + 606, 612, 622, 635, 655, 677, 696, 713, 721, 856, 868, 875, 887, 894, 899, 906, 911, + 918, 922, 926, 930, 934, 938, 942, 946, 950, 954, 958, 966, 971, 977, 981, 985, 990, + 999, 1004, 1010, 1030, 1046, 1154, 1158, 1204, 1211, 1222, 1235, 1248, 1259, 1273, 1282, 1291, 1301, + 1311, 1322, 1331, 1338, 1339, 1343, 1348, 1354, 1355, 1359, 1364, 1376, 1378}; #endif /** Accessing symbol of state STATE. */ @@ -923,253 +923,253 @@ static void yydestruct(const char* yymsg, yysymbol_kind_t yykind, YYSTYPE* yyval switch (yykind) { case YYSYMBOL_BASICIDENTIFIER: /* BASICIDENTIFIER */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1046 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1046 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_EXTENDEDIDENTIFIER: /* EXTENDEDIDENTIFIER */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1052 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1052 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_STRINGLITTERAL: /* STRINGLITTERAL */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1058 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1058 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_LABEL: /* LABEL */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1064 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1064 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_APPLICATIONID: /* APPLICATIONID */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1070 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1070 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_IDENTIFIER: /* IDENTIFIER */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1076 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1076 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_SIMPLEIDENTIFIER: /* SIMPLEIDENTIFIER */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1082 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1082 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_oaAttributeArrayDeclaration: /* oaAttributeArrayDeclaration */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).oaAttributes) != NULL) delete ((*yyvaluep).oaAttributes); ((*yyvaluep).oaAttributes) = NULL; } -#line 1088 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1088 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_keyFields: /* keyFields */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).svValue) != NULL) delete ((*yyvaluep).svValue); ((*yyvaluep).svValue) = NULL; } -#line 1094 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1094 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_fieldList: /* fieldList */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).svValue) != NULL) delete ((*yyvaluep).svValue); ((*yyvaluep).svValue) = NULL; } -#line 1100 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1100 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_metaData: /* metaData */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwmdMetaData) != NULL) delete ((*yyvaluep).kwmdMetaData); ((*yyvaluep).kwmdMetaData) = NULL; } -#line 1106 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1106 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_kwattributeDeclaration: /* kwattributeDeclaration */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwaValue) != NULL) delete ((*yyvaluep).kwaValue); ((*yyvaluep).kwaValue) = NULL; } -#line 1112 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1112 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_applicationids: /* applicationids */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1118 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1118 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_comments: /* comments */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1124 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1124 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_refIdentifier: /* refIdentifier */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1130 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1130 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_usedDerivationRule: /* usedDerivationRule */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1136 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1136 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_referenceRule: /* referenceRule */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1142 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1142 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_referenceRuleBody: /* referenceRuleBody */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1148 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1148 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_derivationRule: /* derivationRule */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1154 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1154 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_derivationRuleBody: /* derivationRuleBody */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1160 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1160 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_operandList: /* operandList */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).oaOperands) != NULL) delete ((*yyvaluep).oaOperands); ((*yyvaluep).oaOperands) = NULL; } -#line 1166 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1166 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_derivationRuleHeader: /* derivationRuleHeader */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1172 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1172 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_derivationRuleBegin: /* derivationRuleBegin */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdrValue) != NULL) delete ((*yyvaluep).kwdrValue); ((*yyvaluep).kwdrValue) = NULL; } -#line 1178 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1178 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_derivationRuleOperand: /* derivationRuleOperand */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).kwdroValue) != NULL) delete ((*yyvaluep).kwdroValue); ((*yyvaluep).kwdroValue) = NULL; } -#line 1184 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1184 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case YYSYMBOL_bigstring: /* bigstring */ -#line 134 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 134 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { if (((*yyvaluep).sValue) != NULL) delete ((*yyvaluep).sValue); ((*yyvaluep).sValue) = NULL; } -#line 1190 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1190 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; default: @@ -1419,143 +1419,143 @@ int yyparse(void) switch (yyn) { case 2: /* IDENTIFIER: SIMPLEIDENTIFIER */ -#line 144 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 144 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = (yyvsp[0].sValue); } -#line 1462 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1462 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 3: /* IDENTIFIER: EXTENDEDIDENTIFIER */ -#line 148 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 148 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = (yyvsp[0].sValue); } -#line 1470 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1470 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 4: /* SIMPLEIDENTIFIER: BASICIDENTIFIER */ -#line 155 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 155 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = (yyvsp[0].sValue); } -#line 1478 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1478 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 5: /* SIMPLEIDENTIFIER: CLASS */ -#line 159 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 159 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Dictionary"); } -#line 1486 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1486 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 6: /* SIMPLEIDENTIFIER: CONTINUOUSTYPE */ -#line 163 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 163 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Numerical"); } -#line 1494 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1494 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 7: /* SIMPLEIDENTIFIER: SYMBOLTYPE */ -#line 167 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 167 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Categorical"); } -#line 1502 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1502 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 8: /* SIMPLEIDENTIFIER: OBJECTTYPE */ -#line 171 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 171 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Entity"); } -#line 1510 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1510 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 9: /* SIMPLEIDENTIFIER: OBJECTARRAYTYPE */ -#line 175 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 175 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Table"); } -#line 1518 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1518 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 10: /* SIMPLEIDENTIFIER: ROOT */ -#line 179 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 179 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Root"); } -#line 1526 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1526 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 11: /* SIMPLEIDENTIFIER: UNUSED */ -#line 183 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 183 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Unused"); } -#line 1534 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1534 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 12: /* SIMPLEIDENTIFIER: DATETYPE */ -#line 187 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 187 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Date"); } -#line 1542 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1542 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 13: /* SIMPLEIDENTIFIER: TIMETYPE */ -#line 191 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 191 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Time"); } -#line 1550 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1550 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 14: /* SIMPLEIDENTIFIER: TIMESTAMPTYPE */ -#line 195 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 195 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Timestamp"); } -#line 1558 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1558 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 15: /* SIMPLEIDENTIFIER: TIMESTAMPTZTYPE */ -#line 199 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 199 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("TimestampTZ"); } -#line 1566 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1566 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 16: /* SIMPLEIDENTIFIER: TEXTTYPE */ -#line 203 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 203 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Text"); } -#line 1574 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1574 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 17: /* SIMPLEIDENTIFIER: TEXTLISTTYPE */ -#line 207 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 207 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("TextList"); } -#line 1582 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1582 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 18: /* SIMPLEIDENTIFIER: STRUCTURETYPE */ -#line 211 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 211 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = new ALString("Structure"); } -#line 1590 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1590 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 19: /* kwclassFile: applicationids kwclasses comments */ -#line 217 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 217 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ignore l'identification d'application */ if ((yyvsp[-2].sValue) != NULL) @@ -1565,20 +1565,20 @@ int yyparse(void) if ((yyvsp[0].sValue) != NULL) delete (yyvsp[0].sValue); } -#line 1604 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1604 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 21: /* kwclasses: kwclasses error */ -#line 231 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 231 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("Error outside the definition of a dictionary"); YYABORT; } -#line 1611 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1611 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 23: /* kwclass: kwclassBegin '}' semicolon */ -#line 237 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 237 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* La completion des informations de type (CompleteTypeInfo) est centralisee */ /* au niveau du domaine en fin de parsing */ @@ -1586,11 +1586,11 @@ int yyparse(void) /* Reinitialisation de la classe courante */ kwcLoadCurrentClass = NULL; } -#line 1623 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1623 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 24: /* kwclassBegin: kwclassHeader comments */ -#line 247 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 247 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ignore les premiers comemntaires */ if ((yyvsp[0].sValue) != NULL) @@ -1598,11 +1598,11 @@ int yyparse(void) assert(kwcLoadCurrentClass == (yyvsp[-1].kwcValue)); (yyval.kwcValue) = (yyvsp[-1].kwcValue); } -#line 1635 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1635 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 25: /* kwclassBegin: kwclassBegin kwattributeDeclaration */ -#line 255 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 255 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWClass* kwcClass = (yyvsp[-1].kwcValue); KWAttribute* attribute = (yyvsp[0].kwaValue); @@ -1646,11 +1646,11 @@ int yyparse(void) (yyval.kwcValue) = kwcClass; } -#line 1680 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1681 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 26: /* kwclassBegin: kwclassBegin '{' comments oaAttributeArrayDeclaration '}' IDENTIFIER usedDerivationRule semicolon metaData comments */ -#line 296 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 297 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWClass* kwcClass = (yyvsp[-9].kwcValue); KWAttributeBlock* attributeBlock; @@ -1734,11 +1734,11 @@ int yyparse(void) (yyval.kwcValue) = kwcClass; } -#line 1763 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1765 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 27: /* kwclassBegin: kwclassBegin '{' comments '}' IDENTIFIER usedDerivationRule semicolon metaData comments */ -#line 375 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 377 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWClass* kwcClass = (yyvsp[-8].kwcValue); @@ -1757,11 +1757,11 @@ int yyparse(void) delete (yyvsp[0].sValue); (yyval.kwcValue) = kwcClass; } -#line 1786 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1788 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 28: /* kwclassBegin: kwclassBegin error */ -#line 394 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 396 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* ERRORMGT */ /* Attention: cette regle qui permet une gestion des erreurs amelioree */ @@ -1769,11 +1769,11 @@ int yyparse(void) kwcLoadCurrentClass = NULL; YYABORT; } -#line 1798 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1800 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 29: /* oaAttributeArrayDeclaration: oaAttributeArrayDeclaration kwattributeDeclaration */ -#line 405 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 407 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { ObjectArray* oaAttributes = (yyvsp[-1].oaAttributes); KWAttribute* attribute = (yyvsp[0].kwaValue); @@ -1819,11 +1819,11 @@ int yyparse(void) (yyval.oaAttributes) = oaAttributes; } -#line 1845 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1848 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 30: /* oaAttributeArrayDeclaration: kwattributeDeclaration */ -#line 448 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 451 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { ObjectArray* oaAttributes; KWAttribute* attribute = (yyvsp[0].kwaValue); @@ -1871,11 +1871,11 @@ int yyparse(void) (yyval.oaAttributes) = oaAttributes; } -#line 1894 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1898 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 31: /* kwclassHeader: comments rootDeclaration CLASS IDENTIFIER keyFields metaData '{' */ -#line 495 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 499 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWClass* kwcClass; KWClass* kwcReferencedClass; @@ -1966,41 +1966,41 @@ int yyparse(void) kwcLoadCurrentClass = kwcClass; (yyval.kwcValue) = kwcClass; } -#line 1987 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 1992 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 32: /* keyFields: '(' fieldList ')' comments */ -#line 587 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 592 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ignore les comemntaires */ if ((yyvsp[0].sValue) != NULL) delete (yyvsp[0].sValue); (yyval.svValue) = (yyvsp[-2].svValue); } -#line 1998 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2003 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 33: /* keyFields: comments */ -#line 594 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 599 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ignore les comemntaires */ if ((yyvsp[0].sValue) != NULL) delete (yyvsp[0].sValue); (yyval.svValue) = NULL; /* pas de champ cle */ } -#line 2009 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2014 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 34: /* keyFields: %empty */ -#line 601 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 606 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.svValue) = NULL; /* pas de champ cle */ } -#line 2017 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2022 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 35: /* fieldList: fieldList ',' IDENTIFIER */ -#line 608 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 613 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { StringVector* svFields; @@ -2010,11 +2010,11 @@ int yyparse(void) delete (yyvsp[0].sValue); (yyval.svValue) = svFields; } -#line 2031 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2036 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 36: /* fieldList: IDENTIFIER */ -#line 618 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 623 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { StringVector* svFields; @@ -2024,11 +2024,11 @@ int yyparse(void) delete (yyvsp[0].sValue); (yyval.svValue) = svFields; } -#line 2045 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2050 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 37: /* metaData: metaData '<' SIMPLEIDENTIFIER '=' STRINGLITTERAL '>' */ -#line 631 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 636 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWMetaData* metaData; @@ -2048,11 +2048,11 @@ int yyparse(void) delete (yyvsp[-1].sValue); (yyval.kwmdMetaData) = metaData; } -#line 2069 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2074 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 38: /* metaData: metaData '<' SIMPLEIDENTIFIER '=' CONTINUOUSLITTERAL '>' */ -#line 651 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 656 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWMetaData* metaData; @@ -2074,11 +2074,11 @@ int yyparse(void) delete (yyvsp[-3].sValue); (yyval.kwmdMetaData) = metaData; } -#line 2095 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2100 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 39: /* metaData: metaData '<' SIMPLEIDENTIFIER '>' */ -#line 673 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 678 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWMetaData* metaData; @@ -2097,11 +2097,11 @@ int yyparse(void) delete (yyvsp[-1].sValue); (yyval.kwmdMetaData) = metaData; } -#line 2118 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2123 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 40: /* metaData: metaData '<' SIMPLEIDENTIFIER '=' IDENTIFIER '>' */ -#line 692 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 697 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWMetaData* metaData; @@ -2118,19 +2118,19 @@ int yyparse(void) delete (yyvsp[-1].sValue); (yyval.kwmdMetaData) = metaData; } -#line 2138 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2143 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 41: /* metaData: %empty */ -#line 708 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 713 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwmdMetaData) = NULL; /* pas de paires cle valeurs */ } -#line 2146 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2151 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 42: /* kwattributeDeclaration: usedDeclaration typeDeclaration refIdentifier IDENTIFIER usedDerivationRule semicolon metaData comments */ -#line 724 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 729 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWAttribute* attribute; KWDerivationRule* rule; @@ -2273,11 +2273,11 @@ int yyparse(void) (yyval.kwaValue) = attribute; } -#line 2273 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2278 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 43: /* applicationids: applicationids APPLICATIONID */ -#line 852 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 857 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ne garde que la premiere ligne de chaque identification d'application */ if ((yyvsp[-1].sValue) == NULL) @@ -2288,19 +2288,19 @@ int yyparse(void) (yyval.sValue) = (yyvsp[-1].sValue); } } -#line 2288 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2293 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 44: /* applicationids: %empty */ -#line 863 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 868 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = NULL; /* pas d'identification d'application */ } -#line 2296 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2301 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 45: /* comments: comments LABEL */ -#line 871 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 876 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* On ne garde que la premiere ligne de chaque commentaire */ if ((yyvsp[-1].sValue) == NULL) @@ -2311,180 +2311,180 @@ int yyparse(void) (yyval.sValue) = (yyvsp[-1].sValue); } } -#line 2311 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2316 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 46: /* comments: %empty */ -#line 882 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 887 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = NULL; /* pas de commentaire */ } -#line 2319 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2324 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 47: /* rootDeclaration: ROOT */ -#line 890 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 895 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.bValue) = true; } -#line 2327 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2332 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 48: /* rootDeclaration: %empty */ -#line 894 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 899 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.bValue) = false; /* valeur par defaut */ } -#line 2335 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2340 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 49: /* usedDeclaration: UNUSED */ -#line 902 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 907 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.bValue) = false; } -#line 2343 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2348 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 50: /* usedDeclaration: %empty */ -#line 906 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 911 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.bValue) = true; /* valeur par defaut */ } -#line 2351 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2356 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 51: /* typeDeclaration: CONTINUOUSTYPE */ -#line 914 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 919 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Continuous; } -#line 2359 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2364 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 52: /* typeDeclaration: SYMBOLTYPE */ -#line 918 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 923 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Symbol; } -#line 2367 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2372 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 53: /* typeDeclaration: DATETYPE */ -#line 922 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 927 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Date; } -#line 2375 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2380 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 54: /* typeDeclaration: TIMETYPE */ -#line 926 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 931 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Time; } -#line 2383 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2388 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 55: /* typeDeclaration: TIMESTAMPTYPE */ -#line 930 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 935 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Timestamp; } -#line 2391 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2396 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 56: /* typeDeclaration: TIMESTAMPTZTYPE */ -#line 934 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 939 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::TimestampTZ; } -#line 2399 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2404 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 57: /* typeDeclaration: TEXTTYPE */ -#line 938 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 943 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Text; } -#line 2407 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2412 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 58: /* typeDeclaration: TEXTLISTTYPE */ -#line 942 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 947 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::TextList; } -#line 2415 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2420 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 59: /* typeDeclaration: OBJECTTYPE */ -#line 946 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 951 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Object; } -#line 2423 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2428 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 60: /* typeDeclaration: OBJECTARRAYTYPE */ -#line 950 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 955 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::ObjectArray; } -#line 2431 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2436 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 61: /* typeDeclaration: STRUCTURETYPE */ -#line 954 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 959 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.nValue) = KWType::Structure; } -#line 2439 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2444 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 62: /* refIdentifier: '(' IDENTIFIER ')' */ -#line 962 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 967 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = (yyvsp[-1].sValue); } -#line 2447 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2452 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 63: /* refIdentifier: %empty */ -#line 966 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 971 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = NULL; } -#line 2455 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2460 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 64: /* usedDerivationRule: '=' derivationRule */ -#line 973 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 978 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = (yyvsp[0].kwdrValue); } -#line 2463 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2468 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 65: /* usedDerivationRule: referenceRule */ -#line 977 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 982 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = (yyvsp[0].kwdrValue); } -#line 2471 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2476 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 66: /* usedDerivationRule: '=' derivationRule ')' */ -#line 981 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 986 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("Too many ')'"); (yyval.kwdrValue) = (yyvsp[-1].kwdrValue); } -#line 2480 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2485 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 67: /* usedDerivationRule: '(' IDENTIFIER ')' */ -#line 986 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 991 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { ALString sTmp; yyerror(sTmp + "Invalid syntax (" + *(yyvsp[-1].sValue) + ")"); @@ -2492,27 +2492,27 @@ int yyparse(void) delete (yyvsp[-1].sValue); (yyval.kwdrValue) = NULL; } -#line 2492 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2497 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 68: /* usedDerivationRule: %empty */ -#line 994 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 999 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = NULL; } -#line 2500 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2505 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 69: /* referenceRule: referenceRuleBody ']' */ -#line 1000 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1005 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = (yyvsp[-1].kwdrValue); } -#line 2508 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2513 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 70: /* referenceRuleBody: '[' derivationRuleOperand */ -#line 1006 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1011 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* rule; KWDerivationRuleOperand* operand; @@ -2532,11 +2532,11 @@ int yyparse(void) /* On retourner la regle */ (yyval.kwdrValue) = rule; } -#line 2532 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2537 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 71: /* referenceRuleBody: referenceRuleBody ',' derivationRuleOperand */ -#line 1026 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1031 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* rule = (yyvsp[-2].kwdrValue); KWDerivationRuleOperand* operand; @@ -2550,11 +2550,11 @@ int yyparse(void) /* On retourner la regle */ (yyval.kwdrValue) = rule; } -#line 2550 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2555 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 72: /* derivationRule: derivationRuleBody closeparenthesis */ -#line 1042 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1047 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { boolean bOk = true; KWDerivationRule* ruleBody = (yyvsp[-1].kwdrValue); @@ -2661,19 +2661,19 @@ int yyparse(void) delete ruleBody; (yyval.kwdrValue) = rule; } -#line 2659 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2664 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 73: /* derivationRuleBody: derivationRuleBegin */ -#line 1150 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1155 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = (yyvsp[0].kwdrValue); } -#line 2667 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2672 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 74: /* derivationRuleBody: derivationRuleBegin ':' operandList */ -#line 1154 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1159 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* ruleBody = (yyvsp[-2].kwdrValue); KWDRRelationCreationRule* ruleRelationCreationBody; @@ -2719,19 +2719,19 @@ int yyparse(void) (yyval.kwdrValue) = ruleRelationCreationBody; } -#line 2717 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2722 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 75: /* derivationRuleBody: derivationRuleHeader */ -#line 1200 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1205 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.kwdrValue) = (yyvsp[0].kwdrValue); } -#line 2725 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2730 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 76: /* operandList: operandList ',' derivationRuleOperand */ -#line 1207 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1212 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { ObjectArray* oaOperandList = (yyvsp[-2].oaOperands); KWDerivationRuleOperand* operand = (yyvsp[0].kwdroValue); @@ -2742,11 +2742,11 @@ int yyparse(void) oaOperandList->Add(operand); (yyval.oaOperands) = oaOperandList; } -#line 2740 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2745 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 77: /* operandList: derivationRuleOperand */ -#line 1218 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1223 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { ObjectArray* oaOperandList; KWDerivationRuleOperand* operand = (yyvsp[0].kwdroValue); @@ -2757,11 +2757,11 @@ int yyparse(void) oaOperandList->Add(operand); (yyval.oaOperands) = oaOperandList; } -#line 2755 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2760 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 78: /* derivationRuleHeader: IDENTIFIER openparenthesis */ -#line 1231 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1236 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* rule; @@ -2771,11 +2771,11 @@ int yyparse(void) delete (yyvsp[-1].sValue); (yyval.kwdrValue) = rule; } -#line 2769 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2774 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 79: /* derivationRuleBegin: derivationRuleHeader derivationRuleOperand */ -#line 1244 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1249 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* rule = (yyvsp[-1].kwdrValue); KWDerivationRuleOperand* operand = (yyvsp[0].kwdroValue); @@ -2786,11 +2786,11 @@ int yyparse(void) rule->AddOperand(operand); (yyval.kwdrValue) = rule; } -#line 2784 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2789 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 80: /* derivationRuleBegin: derivationRuleBegin ',' derivationRuleOperand */ -#line 1255 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1260 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRule* rule = (yyvsp[-2].kwdrValue); KWDerivationRuleOperand* operand = (yyvsp[0].kwdroValue); @@ -2801,11 +2801,11 @@ int yyparse(void) rule->AddOperand(operand); (yyval.kwdrValue) = rule; } -#line 2799 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2804 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 81: /* derivationRuleOperand: IDENTIFIER */ -#line 1269 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1274 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRuleOperand* operand; operand = new KWDerivationRuleOperand; @@ -2814,11 +2814,11 @@ int yyparse(void) delete (yyvsp[0].sValue); (yyval.kwdroValue) = operand; } -#line 2812 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2817 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 82: /* derivationRuleOperand: CONTINUOUSLITTERAL */ -#line 1278 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1283 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRuleOperand* operand; operand = new KWDerivationRuleOperand; @@ -2827,11 +2827,11 @@ int yyparse(void) operand->SetContinuousConstant((yyvsp[0].cValue)); (yyval.kwdroValue) = operand; } -#line 2825 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2830 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 83: /* derivationRuleOperand: bigstring */ -#line 1287 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1292 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRuleOperand* operand; operand = new KWDerivationRuleOperand; @@ -2841,11 +2841,11 @@ int yyparse(void) delete (yyvsp[0].sValue); (yyval.kwdroValue) = operand; } -#line 2839 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2844 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 84: /* derivationRuleOperand: derivationRule */ -#line 1297 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1302 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRuleOperand* operand; operand = new KWDerivationRuleOperand; @@ -2855,22 +2855,22 @@ int yyparse(void) operand->SetType(operand->GetDerivationRule()->GetType()); (yyval.kwdroValue) = operand; } -#line 2853 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2858 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 85: /* derivationRuleOperand: '.' derivationRuleOperand */ -#line 1307 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1312 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { KWDerivationRuleOperand* operand; operand = (yyvsp[0].kwdroValue); operand->SetScopeLevel(operand->GetScopeLevel() + 1); (yyval.kwdroValue) = operand; } -#line 2864 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2869 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 86: /* bigstring: bigstring '+' STRINGLITTERAL */ -#line 1318 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1323 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* Concatenation des deux chaines */ (yyval.sValue) = new ALString(*(yyvsp[-2].sValue) + *(yyvsp[0].sValue)); @@ -2879,59 +2879,59 @@ int yyparse(void) delete (yyvsp[-2].sValue); delete (yyvsp[0].sValue); } -#line 2877 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2882 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 87: /* bigstring: STRINGLITTERAL */ -#line 1327 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1332 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { (yyval.sValue) = (yyvsp[0].sValue); } -#line 2885 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2890 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 89: /* semicolon: ';' ';' */ -#line 1335 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1340 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("There is one superfluous ';'"); } -#line 2893 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2898 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 90: /* semicolon: ';' ';' ';' */ -#line 1339 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1344 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("Too many ';'"); } -#line 2901 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2906 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 91: /* semicolon: %empty */ -#line 1343 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1348 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("Missing ';'"); } -#line 2909 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2914 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 93: /* openparenthesis: '(' '(' */ -#line 1351 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1356 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("There is one superfluous '('"); } -#line 2917 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2922 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 94: /* openparenthesis: '(' '(' '(' */ -#line 1355 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1360 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { yyerror("Too many '('"); } -#line 2925 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2930 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 95: /* openparenthesis: %empty */ -#line 1359 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1364 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* ERRORMGT */ /* Attention: supprimer cette instruction en cas d'evolution du parser */ @@ -2940,11 +2940,11 @@ int yyparse(void) /* sa consoeur 3 shift/reduce conflicts et 12 reduce conflicts */ yyerror("Missing '('"); } -#line 2938 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2943 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; case 97: /* closeparenthesis: %empty */ -#line 1373 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1378 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" { /* ERRORMGT */ /* Attention: supprimer cette instruction en cas d'evolution du parser */ @@ -2953,10 +2953,10 @@ int yyparse(void) /* sa consoeur 3 shift/reduce conflicts et 12 reduce conflicts */ yyerror("Missing ')'"); } -#line 2951 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2956 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" break; -#line 2955 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" +#line 2960 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.cpp" default: break; @@ -3135,7 +3135,7 @@ int yyparse(void) return yyresult; } -#line 1384 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 1389 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" #include "KWCLex.inc" @@ -3450,13 +3450,13 @@ boolean KWClassDomain::ReadFile(const ALString& sFileName) if (nFileParsingErrorNumber == 0) kwcdLoadDomain->CompleteTypeInfo(); - /* Lecture des informations sur les attributs utilises mais non charges en memoire */ + /* Lecture des informations privees depuis les meta donnees */ if (nFileParsingErrorNumber == 0) { for (i = 0; i < kwcdLoadDomain->GetClassNumber(); i++) { kwcClass = kwcdLoadDomain->GetClassAt(i); - kwcClass->ReadNotLoadedMetaData(); + kwcClass->ReadPrivateMetaData(); } } diff --git a/src/Learning/KWData/KWCYac.hpp b/src/Learning/KWData/KWCYac.hpp index 809b84c4f..e526aef46 100644 --- a/src/Learning/KWData/KWCYac.hpp +++ b/src/Learning/KWData/KWCYac.hpp @@ -86,7 +86,7 @@ typedef enum yytokentype yytoken_kind_t; #if !defined YYSTYPE && !defined YYSTYPE_IS_DECLARED union YYSTYPE { -#line 64 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" +#line 64 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.yac" Continuous cValue; ALString* sValue; @@ -101,7 +101,7 @@ union YYSTYPE KWMetaData* kwmdMetaData; int nValue; -#line 101 "D:/Users/miib6422/Documents/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.hpp" +#line 101 "C:/Applications/boullema/DevGit/khiops/src/Learning/KWData/KWCYac.hpp" }; typedef union YYSTYPE YYSTYPE; #define YYSTYPE_IS_TRIVIAL 1 diff --git a/src/Learning/KWData/KWCYac.yac b/src/Learning/KWData/KWCYac.yac index 8c2f72e7b..d8822b8d1 100644 --- a/src/Learning/KWData/KWCYac.yac +++ b/src/Learning/KWData/KWCYac.yac @@ -1705,13 +1705,13 @@ boolean KWClassDomain::ReadFile(const ALString& sFileName) if (nFileParsingErrorNumber == 0) kwcdLoadDomain->CompleteTypeInfo(); - /* Lecture des informations sur les attributs utilises mais non charges en memoire */ + /* Lecture des informations privees depuis les meta donnees */ if (nFileParsingErrorNumber == 0) { for (i = 0; i < kwcdLoadDomain->GetClassNumber(); i++) { kwcClass = kwcdLoadDomain->GetClassAt(i); - kwcClass->ReadNotLoadedMetaData(); + kwcClass->ReadPrivateMetaData(); } } diff --git a/src/Learning/KWData/KWClass.cpp b/src/Learning/KWData/KWClass.cpp index aade890d8..d3667ef2d 100644 --- a/src/Learning/KWData/KWClass.cpp +++ b/src/Learning/KWData/KWClass.cpp @@ -1828,6 +1828,9 @@ void KWClass::Write(ostream& ost) const ost << ")"; } ost << "\n"; + + // Meta-donnees + WritePrivateMetaData(ost); if (metaData.GetKeyNumber() > 0) { metaData.Write(ost); @@ -2781,19 +2784,6 @@ boolean KWClass::CheckTypeAtLoadIndex(KWLoadIndex liIndex, int nType) const return bOk; } -void KWClass::ReadNotLoadedMetaData() -{ - KWAttribute* attribute; - - // Parcours des attributs de la classe - attribute = GetHeadAttribute(); - while (attribute != NULL) - { - attribute->ReadNotLoadedMetaData(); - GetNextAttribute(attribute); - } -} - void KWClass::WriteAttributes(const ALString& sTitle, const ObjectArray* oaAttributes, ostream& ost) const { KWAttribute* attribute; @@ -2808,3 +2798,38 @@ void KWClass::WriteAttributes(const ALString& sTitle, const ObjectArray* oaAttri ost << "\t" << i + 1 << "\t" << attribute->GetName() << "\n"; } } + +void KWClass::WritePrivateMetaData(ostream& ost) const +{ + KWMetaData privateMetaData; + + // Memorisation dans une meta-data temporaire de l'information d'utilisation d'un attribut non charge en memoire + // Permet de transferer cette information "privee", par exemple pour une tache parallele + if (GetForceUnique()) + { + privateMetaData.SetNoValueAt("_ForceUnique"); + ost << ' '; + privateMetaData.Write(ost); + } +} + +void KWClass::ReadPrivateMetaData() +{ + KWAttribute* attribute; + + // Lecture de la meta-donne gerant le ForceUnique + assert(not GetForceUnique()); + if (GetMetaData()->GetKeyNumber() > 0 and GetMetaData()->IsMissingTypeAt("_ForceUnique")) + { + SetForceUnique(true); + GetMetaData()->RemoveKey("_ForceUnique"); + } + + // Parcours des attributs de la classe + attribute = GetHeadAttribute(); + while (attribute != NULL) + { + attribute->ReadPrivateMetaData(); + GetNextAttribute(attribute); + } +} diff --git a/src/Learning/KWData/KWClass.h b/src/Learning/KWData/KWClass.h index 5ba020999..d860a2c8a 100644 --- a/src/Learning/KWData/KWClass.h +++ b/src/Learning/KWData/KWClass.h @@ -570,13 +570,19 @@ class KWClass : public Object int GetUnloadedOwnedRelationAttributeNumber() const; KWAttribute* GetUnloadedOwnedRelationAttributeAt(int nIndex) const; - // Prise en compte des attributs utilises non charges en memoire suite a une lecture de dictionnaire (cf. - // KWAttribute::ReadNotLoadedMetaData) - void ReadNotLoadedMetaData(); - // Affichage d'un tableau d'attributs void WriteAttributes(const ALString& sTitle, const ObjectArray* oaAttributes, ostream& ost) const; + ////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Gestion du ForceUnique de la classe pour la lecture/ecriture de dictionnaire dans les fichiers + // Permet de transferer cette information "privee", par exemple pour une tache parallele + + // Ecriture si necessaire des informations prives dans les meta-data (_ForceUnique, plus celles des attributs) + void WritePrivateMetaData(ostream& ost) const; + + // Lecture et prise en compte des l'informations privees depuis les meta-data et nettoyage de ceux-ci + void ReadPrivateMetaData(); + // Nom de la classe KWCDUniqueString usName; From a3202853169ff0b79d8917bbb43801c8ffe76117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 09:39:43 +0100 Subject: [PATCH 03/14] Rename rootMultiTableMapping into mainMultiTableMapping in KWMTDatabase Ce renommage permet de clarifier la difference entre classe Root, utile pour la gestion des table externes, et classe principale, la classe d'analyse qui n'est pas necessairement Root Cette confusion existait dans le nom de la variable rootMultiTableMapping, avec nombreux impacts dans: - KWMTDatabase - PLMTDatabaseTextFile - KWMTDatabaseStream On fait un commit a part pour ne pas perturber l'analyse des autres commit --- .../KDSelectionOperandDataSampler.cpp | 2 +- src/Learning/KWData/KWMTDatabase.cpp | 148 +++++++++--------- src/Learning/KWData/KWMTDatabase.h | 4 +- .../KWDataUtils/PLMTDatabaseTextFile.cpp | 10 +- .../KWMTDatabaseStream.cpp | 10 +- 5 files changed, 87 insertions(+), 87 deletions(-) diff --git a/src/Learning/KDDomainKnowledge/KDSelectionOperandDataSampler.cpp b/src/Learning/KDDomainKnowledge/KDSelectionOperandDataSampler.cpp index c7fc96680..8db336b76 100644 --- a/src/Learning/KDDomainKnowledge/KDSelectionOperandDataSampler.cpp +++ b/src/Learning/KDDomainKnowledge/KDSelectionOperandDataSampler.cpp @@ -823,7 +823,7 @@ void KDSelectionOperandDataSampler::ExtractAllSelectionReferencedObjects(KWMTDat oaRootObjects.Sort(); // Analyse des objets - // Le tri des classes externes, puis le tri des obejt par classe garantit que l'index attribue a chaque + // Le tri des classes externes, puis le tri des objets par classe garantit que l'index attribue a chaque // objet racine externe est unique et reproductible // Note sur l'optimisation: // . on pourrait eviter le tri des objets en utilisant directement leur CraetionIndex, mais ce serait diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index ee97a5a2a..b9eac960f 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -7,9 +7,9 @@ KWMTDatabase::KWMTDatabase() { nSkippedRecordNumber = 0; - rootMultiTableMapping = new KWMTDatabaseMapping; + mainMultiTableMapping = new KWMTDatabaseMapping; oaMultiTableMappings.SetSize(1); - oaMultiTableMappings.SetAt(0, rootMultiTableMapping); + oaMultiTableMappings.SetAt(0, mainMultiTableMapping); dataTableDriverCreator = new KWDataTableDriver; } @@ -19,8 +19,8 @@ KWMTDatabase::~KWMTDatabase() KWMTDatabaseMapping* referenceMapping; // Nettoyage prealable du mapping physique - assert(rootMultiTableMapping == oaMultiTableMappings.GetAt(0)); - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + assert(mainMultiTableMapping == oaMultiTableMappings.GetAt(0)); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); for (nReference = 0; nReference < oaRootRefTableMappings.GetSize(); nReference++) { referenceMapping = cast(KWMTDatabaseMapping*, oaRootRefTableMappings.GetAt(nReference)); @@ -67,14 +67,14 @@ void KWMTDatabase::CopyFrom(const KWDatabase* kwdSource) } // Memorisation du mapping racine - rootMultiTableMapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(0)); + mainMultiTableMapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(0)); // Memorisation des mapping racines des classes referencees oaRootRefTableMappings.SetSize(0); for (i = 0; i < kwmtdSource->oaRootRefTableMappings.GetSize(); i++) { mapping = cast(KWMTDatabaseMapping*, kwmtdSource->oaRootRefTableMappings.GetAt(i)); - assert(mapping != kwmtdSource->rootMultiTableMapping); + assert(mapping != kwmtdSource->mainMultiTableMapping); assert(mapping->GetDataPathAttributeNames() == ""); // Recherche de la copie du mapping source @@ -144,36 +144,36 @@ int KWMTDatabase::Compare(const KWDatabase* kwdSource) const void KWMTDatabase::SetDatabaseName(const ALString& sValue) { - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); KWDatabase::SetDatabaseName(sValue); - rootMultiTableMapping->SetDataTableName(sValue); + mainMultiTableMapping->SetDataTableName(sValue); } const ALString& KWMTDatabase::GetDatabaseName() const { - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); - return rootMultiTableMapping->GetDataTableName(); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); + return mainMultiTableMapping->GetDataTableName(); } void KWMTDatabase::SetClassName(const ALString& sValue) { - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); KWDatabase::SetClassName(sValue); - rootMultiTableMapping->SetClassName(sValue); - rootMultiTableMapping->SetOriginClassName(sValue); + mainMultiTableMapping->SetClassName(sValue); + mainMultiTableMapping->SetOriginClassName(sValue); ensure(GetClassName() == sValue); } const ALString& KWMTDatabase::GetClassName() const { - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); - return rootMultiTableMapping->GetClassName(); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); + return mainMultiTableMapping->GetClassName(); } ObjectArray* KWMTDatabase::GetMultiTableMappings() { - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); return &oaMultiTableMappings; } @@ -267,12 +267,12 @@ void KWMTDatabase::UpdateMultiTableMappings() int i; int j; - require(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); + require(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); require(not IsOpenedForRead()); require(not IsOpenedForWrite()); // Nettoyage prealable du mapping physique - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); // Recherche du dictionnaire associe a la base mainClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); @@ -295,14 +295,14 @@ void KWMTDatabase::UpdateMultiTableMappings() if (mainClass == NULL) { // Duplication prealable du mapping racine (sans les attributs de gestion) - rootMultiTableMapping = rootMultiTableMapping->Clone(); + mainMultiTableMapping = mainMultiTableMapping->Clone(); // Nettoyage oaMultiTableMappings.DeleteAll(); oaRootRefTableMappings.SetSize(0); // On rajoute le mapping racine - oaMultiTableMappings.Add(rootMultiTableMapping); + oaMultiTableMappings.Add(mainMultiTableMapping); } // Sinon, parcours des champs du dictionnaire pour rechercher les mappings a specifier else @@ -311,13 +311,13 @@ void KWMTDatabase::UpdateMultiTableMappings() oaPreviousMultiTableMappings.CopyFrom(&oaMultiTableMappings); // Dereferencement des mapping en cours - rootMultiTableMapping = NULL; + mainMultiTableMapping = NULL; oaMultiTableMappings.SetSize(0); oaRootRefTableMappings.SetSize(0); // Creation du mapping de la table principale assert(svAttributeName.GetSize() == 0); - rootMultiTableMapping = + mainMultiTableMapping = CreateMapping(&odReferenceClasses, &oaRankedReferenceClasses, &odAnalysedCreatedClasses, mainClass, false, mainClass->GetName(), &svAttributeName, &oaMultiTableMappings); assert(svAttributeName.GetSize() == 0); @@ -424,7 +424,7 @@ void KWMTDatabase::UpdateMultiTableMappings() } ensure(mainClass == NULL or mainClass->ComputeOverallNativeRelationAttributeNumber(true) == oaMultiTableMappings.GetSize() - 1); - ensure(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); + ensure(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); } const KWObjectReferenceResolver* KWMTDatabase::GetObjectReferenceSolver() const @@ -471,8 +471,8 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const { // Verification de structure assert(oaMultiTableMappings.GetSize() >= 1); - assert(oaMultiTableMappings.GetAt(0) == rootMultiTableMapping); - assert(rootMultiTableMapping->GetClassName() == GetClassName()); + assert(oaMultiTableMappings.GetAt(0) == mainMultiTableMapping); + assert(mainMultiTableMapping->GetClassName() == GetClassName()); // Verification de la classe principale rootClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); @@ -764,20 +764,20 @@ longint KWMTDatabase::ComputeOpenNecessaryMemory(boolean bRead, boolean bIncludi lNecessaryMemory = KWDatabase::ComputeOpenNecessaryMemory(bRead, bIncludingClassMemory); // Nettoyage prealable - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); // Initialisation recursive du mapping a partir de la racine pour avoir des driver initialises if (bRead) { // En lecture, on utilise la classe physique check(kwcPhysicalClass); - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcPhysicalClass, true); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcPhysicalClass, true); } else { // En ecriture, on utile la classe logique check(kwcClass); - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcClass, false); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcClass, false); } // On complete par la taille demandee par le driver pour chaque table a ouvrir @@ -792,7 +792,7 @@ longint KWMTDatabase::ComputeOpenNecessaryMemory(boolean bRead, boolean bIncludi } // Nettoyage prealable - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); // En lecture, ajout de la place necessaire pour le chargement des tables externes if (bRead) @@ -974,18 +974,18 @@ boolean KWMTDatabase::PhysicalOpenForRead() require(CheckObjectConsistency()); // Nettoyage prealable - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); nSkippedRecordNumber = 0; // Ouverture si Ok if (bOk) { // Initialisation recursive du mapping a partir de la racine - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcPhysicalClass, true); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcPhysicalClass, true); // Ouverture recursive des tables a partir de la table racine if (bOk) - bOk = DMTMPhysicalOpenForRead(rootMultiTableMapping, kwcClass); + bOk = DMTMPhysicalOpenForRead(mainMultiTableMapping, kwcClass); // Ouverture des tables referencees if (bOk) @@ -1001,21 +1001,21 @@ boolean KWMTDatabase::PhysicalOpenForWrite() require(CheckPartially(true)); // Nettoyage prealable - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); nSkippedRecordNumber = 0; // Initialisation recursive du mapping a partir de la racine - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcClass, false); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcClass, false); // Ouverture recursive des tables a partir de la table racine - bOk = DMTMPhysicalOpenForWrite(rootMultiTableMapping); + bOk = DMTMPhysicalOpenForWrite(mainMultiTableMapping); return bOk; } boolean KWMTDatabase::IsPhysicalEnd() const { // Test de fin de la table principale - return rootMultiTableMapping->GetDataTableDriver()->IsEnd(); + return mainMultiTableMapping->GetDataTableDriver()->IsEnd(); } KWObject* KWMTDatabase::PhysicalRead() @@ -1023,7 +1023,7 @@ KWObject* KWMTDatabase::PhysicalRead() KWObject* kwoObject; // Lecture d'un enregistrement de la table principale - kwoObject = DMTMPhysicalRead(rootMultiTableMapping); + kwoObject = DMTMPhysicalRead(mainMultiTableMapping); // Prise en compte dans le memory guard if (kwoObject != NULL) @@ -1034,7 +1034,7 @@ KWObject* KWMTDatabase::PhysicalRead() } // Lecture apres la fin de la base pour effectuer des controles - if (rootMultiTableMapping->GetDataTableDriver()->IsEnd()) + if (mainMultiTableMapping->GetDataTableDriver()->IsEnd()) PhysicalReadAfterEndOfDatabase(); return kwoObject; } @@ -1054,7 +1054,7 @@ void KWMTDatabase::PhysicalReadAfterEndOfDatabase() require(IsOpenedForRead()); // Positionnement du flag d'erreur - bIsError = bIsError or rootMultiTableMapping->GetDataTableDriver()->IsError(); + bIsError = bIsError or mainMultiTableMapping->GetDataTableDriver()->IsError(); // Lecture de chaque sous-base jusqu'a la fin pour detecter les erreurs for (i = 1; i < oaMultiTableMappings.GetSize(); i++) @@ -1162,20 +1162,20 @@ void KWMTDatabase::PhysicalReadAfterEndOfDatabase() void KWMTDatabase::PhysicalSkip() { // Saut d'un enregistrement sur la table principale - rootMultiTableMapping->GetDataTableDriver()->Skip(); - bIsError = bIsError or rootMultiTableMapping->GetDataTableDriver()->IsError(); + mainMultiTableMapping->GetDataTableDriver()->Skip(); + bIsError = bIsError or mainMultiTableMapping->GetDataTableDriver()->IsError(); // Memorisation inconditionnelle de la cle du dernier enregistremnt lu, dans le cas d'une classe racine, // meme si l'objet n'a pas pu etre lu // Cela permet de gere les lignes dupliquees, que l'objet soit lu ou non (a cause d'une erreur de parsing) - assert(rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetName() == kwcClass->GetName()); - assert(rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetRoot() == kwcClass->GetRoot()); + assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetName() == kwcClass->GetName()); + assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetRoot() == kwcClass->GetRoot()); if (kwcClass->GetRoot()) { - assert(rootMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()->GetSize() == - rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); - rootMultiTableMapping->SetLastReadKey( - rootMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()); + assert(mainMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()->GetSize() == + mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); + mainMultiTableMapping->SetLastReadKey( + mainMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()); } // Attention, il n'est pas possible de propager les skip sur les sous-tables @@ -1185,14 +1185,14 @@ void KWMTDatabase::PhysicalSkip() nSkippedRecordNumber++; // Lecture apres la fin de la base pour effectuer des controles - if (not bIsError and rootMultiTableMapping->GetDataTableDriver()->IsEnd()) + if (not bIsError and mainMultiTableMapping->GetDataTableDriver()->IsEnd()) PhysicalReadAfterEndOfDatabase(); } void KWMTDatabase::PhysicalWrite(const KWObject* kwoObject) { // Ecriture d'un enregistrement de la table principale - DMTMPhysicalWrite(rootMultiTableMapping, kwoObject); + DMTMPhysicalWrite(mainMultiTableMapping, kwoObject); } boolean KWMTDatabase::PhysicalClose() @@ -1200,7 +1200,7 @@ boolean KWMTDatabase::PhysicalClose() boolean bOk; // Fermeture de la base et de toutes ses sous-bases - bOk = DMTMPhysicalClose(rootMultiTableMapping); + bOk = DMTMPhysicalClose(mainMultiTableMapping); nSkippedRecordNumber = 0; // Destruction des objets references @@ -1211,42 +1211,42 @@ boolean KWMTDatabase::PhysicalClose() void KWMTDatabase::PhysicalDeleteDatabase() { // Destruction des tables de la hierarchie principale, hors classe referencees - DMTMPhysicalDeleteDatabase(rootMultiTableMapping); + DMTMPhysicalDeleteDatabase(mainMultiTableMapping); } longint KWMTDatabase::GetPhysicalEstimatedObjectNumber() { longint lPhysicalEstimatedObjectNumber; - require(rootMultiTableMapping->GetDataTableDriver() == NULL); + require(mainMultiTableMapping->GetDataTableDriver() == NULL); // Parametrage du mapping racine - rootMultiTableMapping->SetDataTableDriver(CreateDataTableDriver(rootMultiTableMapping)); - rootMultiTableMapping->GetDataTableDriver()->SetDataTableName(rootMultiTableMapping->GetDataTableName()); - rootMultiTableMapping->GetDataTableDriver()->SetClass( + mainMultiTableMapping->SetDataTableDriver(CreateDataTableDriver(mainMultiTableMapping)); + mainMultiTableMapping->GetDataTableDriver()->SetDataTableName(mainMultiTableMapping->GetDataTableName()); + mainMultiTableMapping->GetDataTableDriver()->SetClass( KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName())); // Appel de la methode du driver - lPhysicalEstimatedObjectNumber = rootMultiTableMapping->GetDataTableDriver()->GetEstimatedObjectNumber(); + lPhysicalEstimatedObjectNumber = mainMultiTableMapping->GetDataTableDriver()->GetEstimatedObjectNumber(); // Nettoyage (attention a nettoyer le driver avant de le detruire) - rootMultiTableMapping->GetDataTableDriver()->SetDataTableName(""); - rootMultiTableMapping->GetDataTableDriver()->SetClass(NULL); - delete rootMultiTableMapping->GetDataTableDriver(); - rootMultiTableMapping->SetDataTableDriver(NULL); + mainMultiTableMapping->GetDataTableDriver()->SetDataTableName(""); + mainMultiTableMapping->GetDataTableDriver()->SetClass(NULL); + delete mainMultiTableMapping->GetDataTableDriver(); + mainMultiTableMapping->SetDataTableDriver(NULL); return lPhysicalEstimatedObjectNumber; } double KWMTDatabase::GetPhysicalReadPercentage() { - require(rootMultiTableMapping->GetDataTableDriver() != NULL); - return rootMultiTableMapping->GetDataTableDriver()->GetReadPercentage(); + require(mainMultiTableMapping->GetDataTableDriver() != NULL); + return mainMultiTableMapping->GetDataTableDriver()->GetReadPercentage(); } longint KWMTDatabase::GetPhysicalRecordIndex() const { - if (rootMultiTableMapping->GetDataTableDriver() != NULL) - return rootMultiTableMapping->GetDataTableDriver()->GetRecordIndex(); + if (mainMultiTableMapping->GetDataTableDriver() != NULL) + return mainMultiTableMapping->GetDataTableDriver()->GetRecordIndex(); else return 0; } @@ -1318,8 +1318,8 @@ void KWMTDatabase::MutatePhysicalObject(KWObject* kwoPhysicalObject) const KWDRReference::SetObjectReferenceResolver(&objectReferenceResolver); // Referencement du nouvel objet principal lu depuis le resolveur de reference - if (not rootMultiTableMapping->GetLastReadKey()->IsEmpty()) - objectReferenceResolver.AddObject(kwcPhysicalClass, rootMultiTableMapping->GetLastReadKey(), + if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + objectReferenceResolver.AddObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey(), kwoPhysicalObject); // Appel de la methode ancetre @@ -1328,8 +1328,8 @@ void KWMTDatabase::MutatePhysicalObject(KWObject* kwoPhysicalObject) const // Dereferencement du precedent objet principal lu depuis le resolveur de reference // En effet, l'objet precedement lu est potentiellement detruit et inutilisable pour // la resolution des references (intra-objet dans le cas de l'objet principal) - if (not rootMultiTableMapping->GetLastReadKey()->IsEmpty()) - objectReferenceResolver.RemoveObject(kwcPhysicalClass, rootMultiTableMapping->GetLastReadKey()); + if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + objectReferenceResolver.RemoveObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey()); // Remise a NULL du resolveur de reference dans la regle de derivation gerant les references KWDRReference::SetObjectReferenceResolver(NULL); @@ -1358,8 +1358,8 @@ boolean KWMTDatabase::IsPhysicalObjectSelected(KWObject* kwoPhysicalObject) KWDRReference::SetObjectReferenceResolver(&objectReferenceResolver); // Referencement du nouvel objet principal lu depuis le resolveur de reference - if (not rootMultiTableMapping->GetLastReadKey()->IsEmpty()) - objectReferenceResolver.AddObject(kwcPhysicalClass, rootMultiTableMapping->GetLastReadKey(), + if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + objectReferenceResolver.AddObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey(), kwoPhysicalObject); // Calcul du critere de selection @@ -1375,8 +1375,8 @@ boolean KWMTDatabase::IsPhysicalObjectSelected(KWObject* kwoPhysicalObject) // Dereferencement du precedent objet principal lu depuis le resolveur de reference // En effet, l'objet precedement lu est potentiellement detruit et inutilisable pour // la resolution des references (intra-objet dans le cas de l'objet principal) - if (not rootMultiTableMapping->GetLastReadKey()->IsEmpty()) - objectReferenceResolver.RemoveObject(kwcPhysicalClass, rootMultiTableMapping->GetLastReadKey()); + if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + objectReferenceResolver.RemoveObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey()); // Remise a NULL du resolveur de reference dans la regle de derivation gerant les references KWDRReference::SetObjectReferenceResolver(NULL); @@ -2290,7 +2290,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) // Gestion de la coherence pour toute classe principale ayant une cle // Le cas des classes composant est traite plus loin - if (mapping == rootMultiTableMapping or kwoObject->GetClass()->IsUnique()) + if (mapping == mainMultiTableMapping or kwoObject->GetClass()->IsUnique()) { // Test a partir du deuxieme enregistrement effectivement lu, pour lequel le LastReadKey est // initialise) @@ -2390,7 +2390,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) { // Verification de la coherence entre la classe du sous-objet, et sa // classe attendue depuis son objet englobant - assert(componentMapping != rootMultiTableMapping and + assert(componentMapping != mainMultiTableMapping and not kwoSubObject->GetClass()->GetRoot()); assert(kwoSubObject->GetClass() == kwoObject->GetClass() diff --git a/src/Learning/KWData/KWMTDatabase.h b/src/Learning/KWData/KWMTDatabase.h index eedf5cad3..f2085adfa 100644 --- a/src/Learning/KWData/KWMTDatabase.h +++ b/src/Learning/KWData/KWMTDatabase.h @@ -220,9 +220,9 @@ class KWMTDatabase : public KWDatabase // Ce mapping doit toujours etre present et contient le parametrage (nom de base, nom de classe) principal // L'utilisation d'un mapping pour la racine permet d'unifier les traitements entre tables principales // et tables secondaires - mutable KWMTDatabaseMapping* rootMultiTableMapping; + mutable KWMTDatabaseMapping* mainMultiTableMapping; - // Mapping racine des tables secondaires (reference a un sous-ensemble des mapping du tableau + // Mapping racine des tables secondaires (reference a un sous-ensemble des mappings du tableau // oaMultiTableMappings) mutable ObjectArray oaRootRefTableMappings; diff --git a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp index 1280e0b79..896bfe825 100644 --- a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp +++ b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp @@ -106,16 +106,16 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc lMaxOpenNecessaryMemory = lEmptyOpenNecessaryMemory * 5; // Initialisation recursive du mapping a partir de la racine pour avoir des driver initialises - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); if (bRead) { // En lecture, on utilise la classe physique - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcPhysicalClass, true); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcPhysicalClass, true); } else { // En ecriture, on utile la classe logique - DMTMPhysicalInitializeMapping(rootMultiTableMapping, kwcClass, false); + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcClass, false); } // Nettoyage prealable @@ -350,7 +350,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc } // Nettoyage - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); if (bRead) DeletePhysicalClass(); kwcClass = NULL; @@ -1418,7 +1418,7 @@ void PLShared_MTDatabaseTextFile::DeserializeObject(PLSerializer* serializer, Ob { // Le premier mapping est pre-existant (table racine) if (i == 0) - mapping = database->rootMultiTableMapping; + mapping = database->mainMultiTableMapping; // Les autre sont a creer else { diff --git a/src/Learning/KhiopsNativeInterface/KWMTDatabaseStream.cpp b/src/Learning/KhiopsNativeInterface/KWMTDatabaseStream.cpp index eb2b8aaac..cdee8070b 100644 --- a/src/Learning/KhiopsNativeInterface/KWMTDatabaseStream.cpp +++ b/src/Learning/KhiopsNativeInterface/KWMTDatabaseStream.cpp @@ -136,14 +136,14 @@ KWObject* KWMTDatabaseStream::ReadFromBuffer(const char* sBuffer) int i; require(sBuffer != NULL); - require(rootMultiTableMapping->GetDataTableDriver() != NULL); + require(mainMultiTableMapping->GetDataTableDriver() != NULL); // On repositionne le flag d'erreur a false, pour permettre des lectures sucessives bIsError = false; bSecondaryRecordError = false; // Alimentation du buffer en entree - cast(KWDataTableDriverStream*, rootMultiTableMapping->GetDataTableDriver())->FillBufferWithRecord(sBuffer); + cast(KWDataTableDriverStream*, mainMultiTableMapping->GetDataTableDriver())->FillBufferWithRecord(sBuffer); // Lecture de l'objet kwoObject = Read(); @@ -173,13 +173,13 @@ boolean KWMTDatabaseStream::WriteToBuffer(KWObject* kwoObject, char* sBuffer, in { boolean bOk; - require(rootMultiTableMapping->GetDataTableDriver() != NULL); + require(mainMultiTableMapping->GetDataTableDriver() != NULL); // On repositionne le flag d'erreur a false, pour permettre des ecritures sucessives bIsError = false; // Vidage du buffer en sortie - cast(KWDataTableDriverStream*, rootMultiTableMapping->GetDataTableDriver())->ResetOutputBuffer(); + cast(KWDataTableDriverStream*, mainMultiTableMapping->GetDataTableDriver())->ResetOutputBuffer(); // Ecriture de l'objet dans le buffer du stream Write(kwoObject); @@ -187,7 +187,7 @@ boolean KWMTDatabaseStream::WriteToBuffer(KWObject* kwoObject, char* sBuffer, in // On recupere le resultat bOk = not IsError(); if (bOk) - bOk = cast(KWDataTableDriverStream*, rootMultiTableMapping->GetDataTableDriver()) + bOk = cast(KWDataTableDriverStream*, mainMultiTableMapping->GetDataTableDriver()) ->FillRecordWithBuffer(sBuffer, nMaxBufferLength); return bOk; } From d7f67096cc0556a5a6c5b63606b618a2b7f2be3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 09:51:56 +0100 Subject: [PATCH 04/14] Fix erroneous management of non-root main dictionary as a self-referenced table Contexte: Les tables externes sont gerees par la le referenceSolver (classe KWObjectReferenceResolver), pour retrouver les objets Root references. Dans le cas particulier d'un objet principal Root, celui ci est enregitre temporairement dans le referenceSolver pour gerer ses reference internes. C'est le cas par exemple pour le dictionnaire Molecules, pour chainer ses atomes et liaisons avec des references internes au flocon d'une molecule. Le bug etait que l'objet principal etait enregistre des qu'il avait des champs cles, alors qu'il ne doit etre enregistre que s'il est Root Impacts: - KWMTDatabase - PhysicalReadAllReferenceObjects - MutatePhysicalObject - IsPhysicalObjectSelected --- src/Learning/KWData/KWMTDatabase.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index b9eac960f..198787382 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -1317,8 +1317,8 @@ void KWMTDatabase::MutatePhysicalObject(KWObject* kwoPhysicalObject) const assert(KWDRReference::GetObjectReferenceResolver() == NULL); KWDRReference::SetObjectReferenceResolver(&objectReferenceResolver); - // Referencement du nouvel objet principal lu depuis le resolveur de reference - if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + // Referencement du nouvel objet principal lu depuis le resolveur de reference, s'il est Root + if (kwcPhysicalClass->GetRoot() and not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) objectReferenceResolver.AddObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey(), kwoPhysicalObject); @@ -1328,7 +1328,7 @@ void KWMTDatabase::MutatePhysicalObject(KWObject* kwoPhysicalObject) const // Dereferencement du precedent objet principal lu depuis le resolveur de reference // En effet, l'objet precedement lu est potentiellement detruit et inutilisable pour // la resolution des references (intra-objet dans le cas de l'objet principal) - if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + if (kwcPhysicalClass->GetRoot() and not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) objectReferenceResolver.RemoveObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey()); // Remise a NULL du resolveur de reference dans la regle de derivation gerant les references @@ -1358,7 +1358,7 @@ boolean KWMTDatabase::IsPhysicalObjectSelected(KWObject* kwoPhysicalObject) KWDRReference::SetObjectReferenceResolver(&objectReferenceResolver); // Referencement du nouvel objet principal lu depuis le resolveur de reference - if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + if (kwcPhysicalClass->GetRoot() and not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) objectReferenceResolver.AddObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey(), kwoPhysicalObject); @@ -1375,7 +1375,7 @@ boolean KWMTDatabase::IsPhysicalObjectSelected(KWObject* kwoPhysicalObject) // Dereferencement du precedent objet principal lu depuis le resolveur de reference // En effet, l'objet precedement lu est potentiellement detruit et inutilisable pour // la resolution des references (intra-objet dans le cas de l'objet principal) - if (not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + if (kwcPhysicalClass->GetRoot() and not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) objectReferenceResolver.RemoveObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey()); // Remise a NULL du resolveur de reference dans la regle de derivation gerant les references @@ -1540,9 +1540,9 @@ boolean KWMTDatabase::PhysicalReadAllReferenceObjects(double dSamplePercentage) // peut potentiellement en declencher un grand nombre Global::ActivateErrorFlowControl(); - // Enregistrement du dictionnaire physique principal dans le resolveur de reference + // Enregistrement du dictionnaire physique principal dans le resolveur de reference, s'il est Root // Cela permettra de resoudre les references intra-classe pour la classe principale - if (kwcPhysicalClass->GetKeyAttributeNumber() > 0) + if (kwcPhysicalClass->GetRoot()) objectReferenceResolver.AddClass(kwcPhysicalClass); // Ouverture de chaque table secondaire From c0bb8439600d79efa4c60438cf1301c52e9f8001 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 10:43:53 +0100 Subject: [PATCH 05/14] Improve terminology between root and main dictionary in KWMTDatabase and KWClassDomain Il a souvent dans le code une confusion entre: - main dictionary: dictionnaire d'analyse principal, pas necessairement Root - root dictionary: dictionnaire racine identifie de facon unique, pour gerer les tables externes Recherche systematique des utilisations de root dans le code, pour clarifier la terminologie - renommage des methodes concernees si necessaire - on passe principalement de RootClass a MainClass (Class signifie dictionaire en terminologie interne) - renommage indique car -> dans les notes de commit - renommage des parametres et des variable locales concernes - renommage egalement des commentaires (racine -> principal) Impacts - KWMTDatabase - CheckPartially - CheckObjectConsistency - KWClassDomain - WriteFileFromClass - CloneFromClass - ComputeClassDependence - GetClassDependanceUsedMemory --- src/Learning/KWData/KWClassDomain.cpp | 34 +++++++++++++-------------- src/Learning/KWData/KWClassDomain.h | 8 +++---- src/Learning/KWData/KWMTDatabase.cpp | 30 +++++++++++++---------- 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/Learning/KWData/KWClassDomain.cpp b/src/Learning/KWData/KWClassDomain.cpp index 5e87783da..5c61c4484 100644 --- a/src/Learning/KWData/KWClassDomain.cpp +++ b/src/Learning/KWData/KWClassDomain.cpp @@ -94,7 +94,7 @@ boolean KWClassDomain::WriteFile(const ALString& sFileName) const return bOk; } -boolean KWClassDomain::WriteFileFromClass(const KWClass* rootClass, const ALString& sFileName) const +boolean KWClassDomain::WriteFileFromClass(const KWClass* mainClass, const ALString& sFileName) const { fstream fst; boolean bOk; @@ -105,8 +105,8 @@ boolean KWClassDomain::WriteFileFromClass(const KWClass* rootClass, const ALStri // Pas de gestion des fichiers cloud, car utilise actuellement uniquement en local require(FileService::GetURIScheme(sFileName) == ""); - require(rootClass != NULL); - require(rootClass->GetDomain() == this); + require(mainClass != NULL); + require(mainClass->GetDomain() == this); // Affichage de stats memoire MemoryStatsManager::AddLog(GetClassLabel() + " " + sFileName + " WriteFileFromClass Begin"); @@ -118,7 +118,7 @@ boolean KWClassDomain::WriteFileFromClass(const KWClass* rootClass, const ALStri if (bOk) { // Calcul des classes dependantes - ComputeClassDependence(rootClass, &odDependentClasses); + ComputeClassDependence(mainClass, &odDependentClasses); // Export dans un tableau ou l'on tri les dictionnaires odDependentClasses.ExportObjectArray(&oaDependentClasses); @@ -751,7 +751,7 @@ KWClassDomain* KWClassDomain::Clone() const return kwcdClone; } -KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* rootClass) const +KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* mainClass) const { KWClassDomain* kwcdClone; ObjectArray oaImpactedClasses; @@ -761,8 +761,8 @@ KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* rootClass) const KWClass* kwcCloneRef; KWAttribute* attribute; - require(rootClass != NULL); - require(rootClass->GetDomain() == this); + require(mainClass != NULL); + require(mainClass->GetDomain() == this); kwcdClone = new KWClassDomain; @@ -771,7 +771,7 @@ KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* rootClass) const kwcdClone->usLabel = usLabel; // Duplication de la classe racine - kwcCloneElement = rootClass->Clone(); + kwcCloneElement = mainClass->Clone(); kwcdClone->InsertClass(kwcCloneElement); oaImpactedClasses.Add(kwcCloneElement); @@ -880,7 +880,7 @@ void KWClassDomain::ImportDomain(KWClassDomain* kwcdInputDomain, const ALString& ensure(kwcdInputDomain->GetClassNumber() == 0); } -void KWClassDomain::ComputeClassDependence(const KWClass* rootClass, ObjectDictionary* odDependentClasses) const +void KWClassDomain::ComputeClassDependence(const KWClass* mainClass, ObjectDictionary* odDependentClasses) const { ObjectArray oaDependentClasses; int nClass; @@ -888,15 +888,15 @@ void KWClassDomain::ComputeClassDependence(const KWClass* rootClass, ObjectDicti KWClass* kwcRef; KWAttribute* attribute; - require(rootClass != NULL); - require(rootClass->GetDomain() == this); + require(mainClass != NULL); + require(mainClass->GetDomain() == this); require(odDependentClasses != NULL); // Enregistrement de la classe racine // (en la castant, pour contourner le const du parametre) odDependentClasses->RemoveAll(); - odDependentClasses->SetAt(rootClass->GetName(), cast(KWClass*, rootClass)); - oaDependentClasses.Add(cast(KWClass*, rootClass)); + odDependentClasses->SetAt(mainClass->GetName(), cast(KWClass*, mainClass)); + oaDependentClasses.Add(cast(KWClass*, mainClass)); // Parcours des classes dependantes en memorisant les classes // pour lesquelles il faut propager le calcul de dependance @@ -959,7 +959,7 @@ longint KWClassDomain::GetUsedMemory() const return lUsedMemory; } -longint KWClassDomain::GetClassDependanceUsedMemory(const KWClass* rootClass) const +longint KWClassDomain::GetClassDependanceUsedMemory(const KWClass* mainClass) const { longint lUsedMemory; longint lClassUsedMemory; @@ -968,11 +968,11 @@ longint KWClassDomain::GetClassDependanceUsedMemory(const KWClass* rootClass) co int nClass; KWClass* kwcElement; - require(rootClass != NULL); - require(rootClass->GetDomain() == this); + require(mainClass != NULL); + require(mainClass->GetDomain() == this); // Calcul des classes dependantes - ComputeClassDependence(rootClass, &odDependentClasses); + ComputeClassDependence(mainClass, &odDependentClasses); // Parcours des classes dependantes en memorisant les classes // pour lesquelles il faut propager le calcul de dependance diff --git a/src/Learning/KWData/KWClassDomain.h b/src/Learning/KWData/KWClassDomain.h index e9178a7a7..190b92655 100644 --- a/src/Learning/KWData/KWClassDomain.h +++ b/src/Learning/KWData/KWClassDomain.h @@ -64,7 +64,7 @@ class KWClassDomain : public Object boolean WriteFile(const ALString& sFileName) const; // Ecriture dans un fichier d'une classe avec toutes ses classes dependantes - boolean WriteFileFromClass(const KWClass* rootClass, const ALString& sFileName) const; + boolean WriteFileFromClass(const KWClass* mainClass, const ALString& sFileName) const; // Ecriture dans un fichier au format JSON boolean WriteJSONFile(const ALString& sJSONFileName) const; @@ -131,7 +131,7 @@ class KWClassDomain : public Object // Duplication partielle d'un domaine a partir d'une classe // La classe et ses classes referencees recursivement sont dupliquees de facon coherente - KWClassDomain* CloneFromClass(const KWClass* rootClass) const; + KWClassDomain* CloneFromClass(const KWClass* mainClass) const; // Import de toutes les classes d'un domaine, en y ajoutant un prefixe et un suffixe // et en les renommant si necessaire @@ -140,13 +140,13 @@ class KWClassDomain : public Object // Calcul de l'ensemble des classes (y compris la racine) dependante d'une classe // Le resultat est un dictionnaire referencant les classes resultats par leur nom - void ComputeClassDependence(const KWClass* rootClass, ObjectDictionary* odDependentClasses) const; + void ComputeClassDependence(const KWClass* mainClass, ObjectDictionary* odDependentClasses) const; // Memoire utilisee par le domaine longint GetUsedMemory() const override; // Memoire utilisee par la classe et toutes ses classes referencees recursivement - longint GetClassDependanceUsedMemory(const KWClass* rootClass) const; + longint GetClassDependanceUsedMemory(const KWClass* mainClass) const; // Cle de hashage du domaine et de sa composition longint ComputeHashValue() const; diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index 198787382..ff712a882 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -450,7 +450,8 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const ObjectDictionary odDataTableNames; KWMTDatabaseMapping* mapping; int nMapping; - KWClass* rootClass; + KWClass* originClass; + ALString sOriginLabel; ALString sAttributeName; KWAttribute* attribute; int nAttributeNumber; @@ -475,8 +476,8 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const assert(mainMultiTableMapping->GetClassName() == GetClassName()); // Verification de la classe principale - rootClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); - assert(rootClass != NULL and rootClass->Check()); + originClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); + assert(originClass != NULL and originClass->Check()); // Verification de la table de mapping for (nMapping = 0; nMapping < oaMultiTableMappings.GetSize(); nMapping++) @@ -504,14 +505,19 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const } // Recherche de la classe racine du chemin de mapping - rootClass = KWClassDomain::GetCurrentDomain()->LookupClass(mapping->GetOriginClassName()); + originClass = KWClassDomain::GetCurrentDomain()->LookupClass(mapping->GetOriginClassName()); + assert(originClass->GetName() == GetClassName() or originClass->GetRoot()); // Existence de cette classe - if (rootClass == NULL) + if (originClass == NULL) { bOk = false; - AddError("Data path " + mapping->GetObjectLabel() + " : Root dictionary " + - mapping->GetOriginClassName() + " does not exist"); + if (originClass->GetName() == GetClassName()) + sOriginLabel = "Main"; + else + sOriginLabel = "Root"; + AddError("Data path " + mapping->GetObjectLabel() + " : " + sOriginLabel + + " dictionary " + mapping->GetOriginClassName() + " does not exist"); } // Validite du chemin de donnee @@ -519,7 +525,7 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const { // Parcours des attributs du chemin de donnees du mapping nAttributeNumber = mapping->GetDataPathAttributeNumber(); - pathClass = rootClass; + pathClass = originClass; for (nAttribute = 0; nAttribute < nAttributeNumber; nAttribute++) { check(pathClass); @@ -804,7 +810,7 @@ longint KWMTDatabase::ComputeOpenNecessaryMemory(boolean bRead, boolean bIncludi boolean KWMTDatabase::CheckObjectConsistency() const { boolean bOk = true; - KWClass* rootClass; + KWClass* mainClass; ObjectArray oaClasses; NumericKeyDictionary nkdClasses; int nClass; @@ -817,12 +823,12 @@ boolean KWMTDatabase::CheckObjectConsistency() const require(KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName())->IsCompiled()); // Acces a la classe principale - rootClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); + mainClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetClassName()); // Traitement des classes depuis la classe principale, on les memorisant dans un dictionnaire pour ne les // traiter qu'une seule fois - oaClasses.Add(rootClass); - nkdClasses.SetAt(rootClass, rootClass); + oaClasses.Add(mainClass); + nkdClasses.SetAt(mainClass, mainClass); for (nClass = 0; nClass < oaClasses.GetSize(); nClass++) { secondaryClass = cast(KWClass*, oaClasses.GetAt(nClass)); From 8891ca974e29a6266cf6f1d13832f2e294e63810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 15:16:43 +0100 Subject: [PATCH 06/14] Improve terminology between root and main dictionary in KWMTDatabaseMapping - KWMTDatabaseMapping - GetDataRoot: supression de cette methode obsolete, jamais utilisee --- src/Learning/KWData/KWMTDatabaseMapping.cpp | 11 +---------- src/Learning/KWData/KWMTDatabaseMapping.h | 11 +++++------ 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/Learning/KWData/KWMTDatabaseMapping.cpp b/src/Learning/KWData/KWMTDatabaseMapping.cpp index a27c59009..783f26e08 100644 --- a/src/Learning/KWData/KWMTDatabaseMapping.cpp +++ b/src/Learning/KWData/KWMTDatabaseMapping.cpp @@ -88,14 +88,6 @@ ALString KWMTDatabaseMapping::GetDataPath() const return GetDataPathAttributeNames(); } -ALString KWMTDatabaseMapping::GetDataRoot() const -{ - if (GetExternalTable()) - return ""; - else - return GetFormattedName(GetOriginClassName()); -} - ALString KWMTDatabaseMapping::GetDataPathAttributeNames() const { ALString sDataPathAttributeNames; @@ -247,8 +239,7 @@ void KWMTDatabaseMapping::Write(ostream& ost) const int n; ost << "Data path\t" << GetDataPath() << "\n"; - ost << "Data root\t" << GetDataRoot() << "\n"; - ost << "External table\t" << BooleanToString(GetExternalTable()); + ost << "External table\t" << BooleanToString(GetExternalTable()) << "\n"; ost << "Data path origin dictionary\t" << GetOriginClassName() << "\n"; ost << "Data path variables\t" << GetDataPathAttributeNumber() << "\n"; for (n = 0; n < GetDataPathAttributeNumber(); n++) diff --git a/src/Learning/KWData/KWMTDatabaseMapping.h b/src/Learning/KWData/KWMTDatabaseMapping.h index 4bc7538e0..e80aa26c6 100644 --- a/src/Learning/KWData/KWMTDatabaseMapping.h +++ b/src/Learning/KWData/KWMTDatabaseMapping.h @@ -34,9 +34,6 @@ class KWMTDatabaseMapping : public Object // Data path, calcule d'apres les specifications ALString GetDataPath() const; - // Data root, qui est le dictionnaire origine dans le cas des tables externes - ALString GetDataRoot() const; - // Partie du data path relative aux attributs, calculee d'apres les specifications ALString GetDataPathAttributeNames() const; @@ -48,6 +45,8 @@ class KWMTDatabaseMapping : public Object void SetExternalTable(boolean bValue); // Dictionnaire origine du data path + // - dictionnaire Root si on est dans le cas d'une table externe + // - dictionnaire principal sinon const ALString& GetOriginClassName() const; void SetOriginClassName(const ALString& sValue); @@ -73,7 +72,7 @@ class KWMTDatabaseMapping : public Object // Dans un schema en flocon, // les data paths consistent en une liste de noms de variables avec un separateur "/". // Pour les tables externes, - // les data paths commencent par un DataRoot prefixe par "/", qui fait reference a un nom de dictionnaire Root + // les data paths commencent par un un nom de dictionnaire Root prefixe par "/" // Exemples de DataPath pour differents types de mapping: // classe principale: // sous-objet: Address @@ -99,9 +98,9 @@ class KWMTDatabaseMapping : public Object boolean CheckDataPath() const; // Conversion d'un element de data path vers le format externe - // Cela concerne les noms de dictionnaire (DataRoot) ou de variable + // Cela concerne les noms de dictionnaire ou de variable // S'il contiennent le caractere '`' ou le separateur '/', il doivent - // etre mis au format externe defini pour les dictionnaire, enre '`' + // etre mis au format externe defini pour les dictionnaires, entre '`' static ALString GetFormattedName(const ALString& sValue); // Separateur utilise dans les data paths From a35852e5e0354ba9704085ef84e94a6032a64825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 16:20:31 +0100 Subject: [PATCH 07/14] Improve terminology between root and main dictionary in KWDatabaseIndexer - KWDatabaseIndexer - GetChunkPreviousRootKeyAt -> GetChunkPreviousMainKeyAt - ComputeRootTableBasicIndexation -> ComputeMainTableBasicIndexation - ComputeRootTableIndexation -> ComputeMainTableIndexation - ExtractRootSampleKeyPositions -> ExtractMainSampleKeyPositions --- .../KWDataUtils/KWDatabaseChunkBuilder.cpp | 2 +- .../KWDataUtils/KWDatabaseIndexer.cpp | 118 +++++++++--------- src/Learning/KWDataUtils/KWDatabaseIndexer.h | 28 ++--- 3 files changed, 74 insertions(+), 74 deletions(-) diff --git a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp index 060cc8691..74044aec6 100644 --- a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp @@ -110,7 +110,7 @@ void KWDatabaseChunkBuilder::GetChunkLastRootKeyAt(int nChunkIndex, KWKey* lastR // On recherche l'information pour le micro-chunk correspondant au chunk nMicroChunkIndex = ivChunkBeginIndexes.GetAt(nChunkIndex); - lastRootKey->CopyFrom(databaseIndexer->GetChunkPreviousRootKeyAt(nMicroChunkIndex)); + lastRootKey->CopyFrom(databaseIndexer->GetChunkPreviousMainKeyAt(nMicroChunkIndex)); } void KWDatabaseChunkBuilder::GetChunkPreviousRecordIndexesAt(int nChunkIndex, diff --git a/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp b/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp index 2da0c7552..12853bd73 100644 --- a/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp @@ -45,7 +45,7 @@ void KWDatabaseIndexer::InitializeFromDatabase(const KWDatabase* database) { sourcePLDatabase.InitializeFrom(database); - // Recherche de la classe racine + // Recherche de la classe principale kwcMainClass = KWClassDomain::GetCurrentDomain()->LookupClass(database->GetClassName()); check(kwcMainClass); @@ -206,7 +206,7 @@ int KWDatabaseIndexer::GetChunkNumber() const return cast(LongintVector*, oaTableRecordIndexVectors.GetAt(0))->GetSize(); } -const KWKey* KWDatabaseIndexer::GetChunkPreviousRootKeyAt(int nChunkIndex) const +const KWKey* KWDatabaseIndexer::GetChunkPreviousMainKeyAt(int nChunkIndex) const { require(IsIndexationComputed()); require(0 <= nChunkIndex and nChunkIndex < GetChunkNumber()); @@ -328,7 +328,7 @@ boolean KWDatabaseIndexer::Check() const bOk = bOk and lvRecordIndexVector->GetAt(0) == 0; for (i = 1; i < lvRecordIndexVector->GetSize(); i++) { - // Les inegalites sont strictes uniquement pour la table racine + // Les inegalites sont strictes uniquement pour la table principale if (nTable == 0) bOk = bOk and lvRecordIndexVector->GetAt(i - 1) < lvRecordIndexVector->GetAt(i); @@ -355,7 +355,7 @@ boolean KWDatabaseIndexer::Check() const { for (i = 1; i < lvNextRecordPositionVector->GetSize(); i++) { - // Les inegalites sont strictes uniquement pour la table racine + // Les inegalites sont strictes uniquement pour la table principale if (nTable == 0) bOk = bOk and lvNextRecordPositionVector->GetAt(i - 1) < lvNextRecordPositionVector->GetAt(i); @@ -439,7 +439,7 @@ void KWDatabaseIndexer::Write(ostream& ost) const ost << GetChunkBeginPositionsAt(nChunk, nTable) << "\t"; ost << GetChunkEndPositionsAt(nChunk, nTable) << "\t"; } - ost << GetChunkPreviousRootKeyAt(nChunk)->GetObjectLabel() << "\n"; + ost << GetChunkPreviousMainKeyAt(nChunk)->GetObjectLabel() << "\n"; } } } @@ -612,7 +612,7 @@ boolean KWDatabaseIndexer::ComputeAllDataTableIndexation() { // Indexation basique en un seul troncon dans le cas d'un seul esclave if (GetUsedSlaveNumber() == 1) - bOk = ComputeRootTableBasicIndexation(); + bOk = ComputeMainTableBasicIndexation(); // Cas ou la table principale ne contient pas de cle, et que l'on est donc reduit au cas d'une seule // table principale Remarque: on peut quand meme etre dans le cas multi-table, s'il y a des tables // externes @@ -620,7 +620,7 @@ boolean KWDatabaseIndexer::ComputeAllDataTableIndexation() bOk = ComputeSingleTableIndexation(); // Cas ou la table principale contient une cle, ce qui est possible meme avec une seule table else - bOk = ComputeRootTableIndexation(); + bOk = ComputeMainTableIndexation(); } // Indexation des tables secondaires @@ -639,7 +639,7 @@ boolean KWDatabaseIndexer::ComputeAllDataTableIndexation() return bOk; } -boolean KWDatabaseIndexer::ComputeRootTableBasicIndexation() +boolean KWDatabaseIndexer::ComputeMainTableBasicIndexation() { boolean bOk = true; LongintVector* lvFileBeginPositions; @@ -703,7 +703,7 @@ boolean KWDatabaseIndexer::ComputeSingleTableIndexation() // Indexation basique si le fichier est trop petit if (lTotalFileSizePerProcess >= GetPLDatabase()->GetTotalFileSize()) - bOk = ComputeRootTableBasicIndexation(); + bOk = ComputeMainTableBasicIndexation(); // Indexation effective sinon else { @@ -809,17 +809,17 @@ boolean KWDatabaseIndexer::ComputeSingleTableIndexation() return bOk; } -boolean KWDatabaseIndexer::ComputeRootTableIndexation() +boolean KWDatabaseIndexer::ComputeMainTableIndexation() { boolean bOk = true; boolean bDisplay = false; longint lTotalFileSizePerProcess; - longint lRootMeanKeySize; - longint lRootLineNumber; + longint lMeanMainKeySize; + longint lMainLineNumber; longint lAllKeyPositionMemory; longint lMaxKeyNumber; longint lMaxSlaveProcessNumber; - KWKeyFieldsIndexer rootKeyFieldsIndexer; + KWKeyFieldsIndexer mainKeyFieldsIndexer; double dSamplingRate; ObjectArray oaFoundKeyPositions; KWKeyPosition* recordKeyPosition; @@ -836,23 +836,23 @@ boolean KWDatabaseIndexer::ComputeRootTableIndexation() // Determination du taux d'echantillonnage des cles si necessaire dSamplingRate = 0; - lRootMeanKeySize = 0; - lRootLineNumber = 0; + lMeanMainKeySize = 0; + lMainLineNumber = 0; if (bOk and lTotalFileSizePerProcess < GetPLDatabase()->GetTotalFileSize()) { // Initialisation d'un indexeur de cle pour la table principale - bOk = bOk and InitializeKeyFieldIndexer(0, &rootKeyFieldsIndexer); + bOk = bOk and InitializeKeyFieldIndexer(0, &mainKeyFieldsIndexer); - // Evaluation de la taille des cles et du nombre de lignes de la table racine - bOk = bOk and EvaluateKeySize(&rootKeyFieldsIndexer, lRootMeanKeySize, lRootLineNumber); + // Evaluation de la taille des cles et du nombre de lignes de la table principale + bOk = bOk and EvaluateKeySize(&mainKeyFieldsIndexer, lMeanMainKeySize, lMainLineNumber); // Calcul du taux d'echantillonnage if (bOk) { // Calcul de la taille totale necessaire pour stocker une cle pour toutes les tables - // La cle n'est stockee que pour la table racine, plus au plus un indexe t une position + // La cle n'est stockee que pour la table principale, plus au plus un indexe t une position // par table non externe - lAllKeyPositionMemory = lRootMeanKeySize + sizeof(KWKey*) + + lAllKeyPositionMemory = lMeanMainKeySize + sizeof(KWKey*) + GetMTDatabase()->GetMainTableNumber() * sizeof(longint) * 2; // Calcul du nombre max de cles et de leur position par table utilise, en fonction de la memoire @@ -861,7 +861,7 @@ boolean KWDatabaseIndexer::ComputeRootTableIndexation() if (lMaxKeyNumber < 0) lMaxKeyNumber = 0; - // On limite ce nombre de cle on fonction de la taille des fichiers a analyser + // On limite ce nombre de cle on fonctioRate = 0; de la taille des fichiers a analyser // On utilise (lMaxFileSizePerProcess/8) pour la gestion de la fin des taches lMaxSlaveProcessNumber = 1 + GetMTDatabase()->GetTotalFileSize() / (lTotalFileSizePerProcess / 8); @@ -869,36 +869,36 @@ boolean KWDatabaseIndexer::ComputeRootTableIndexation() lMaxKeyNumber = lMaxSlaveProcessNumber; // On en deduit le taux d'echantillonnage max - dSamplingRate = lMaxKeyNumber * 1.0 / lRootLineNumber; + dSamplingRate = lMaxKeyNumber * 1.0 / max((longint)1, lMainLineNumber); if (dSamplingRate > 1) dSamplingRate = 1; - if (dSamplingRate * lRootLineNumber < 10) + if (dSamplingRate * lMainLineNumber < 10) dSamplingRate = 0; if (lTotalFileSizePerProcess >= GetMTDatabase()->GetTotalFileSize()) dSamplingRate = 0; if (bDisplay) { - cout << "ComputeRootTableIndexation\n"; + cout << "ComputeMainTableIndexation\n"; cout << "\tAll tables size\t" << GetMTDatabase()->GetTotalFileSize() << "\n"; cout << "\tTotal file size per process\t" << lTotalFileSizePerProcess << "\n"; cout << "\tMax slave process number\t" << lMaxSlaveProcessNumber << "\n"; cout << "\tMax key number\t" << lMaxKeyNumber << "\n"; cout << "\tSampling rate\t" << dSamplingRate << "\n"; - cout << "\tRoot mean key size\t" << lRootMeanKeySize << "\n"; - cout << "\tRoot line number\t" << lRootLineNumber << "\n"; + cout << "\tMean main key size\t" << lMeanMainKeySize << "\n"; + cout << "\tMain line number\t" << lMainLineNumber << "\n"; } } } // Indexation basique si aucune cle ne doit etre extraite if (bOk and dSamplingRate == 0) - bOk = ComputeRootTableBasicIndexation(); + bOk = ComputeMainTableBasicIndexation(); // Extraction des cles de la table principale si necessaire if (bOk and dSamplingRate > 0) { - // Extraction des cles et de leur position de la table racine - bOk = ExtractRootSampleKeyPositions(&rootKeyFieldsIndexer, lRootMeanKeySize, lRootLineNumber, + // Extraction des cles et de leur position de la table principale + bOk = ExtractMainSampleKeyPositions(&mainKeyFieldsIndexer, lMeanMainKeySize, lMainLineNumber, dSamplingRate, &oaFoundKeyPositions); // Cas particulier ou la derniere cle arrive en fin de fichier: on la supprime, car elle delimite un @@ -922,7 +922,7 @@ boolean KWDatabaseIndexer::ComputeRootTableIndexation() // Memorisation des resultats si ok if (bOk) { - // Collecte des cles a partir des positions extraites de la table racine + // Collecte des cles a partir des positions extraites de la table principale KWKeyPosition::CollectClonedKeys(&oaFoundKeyPositions, &oaExtractedKeys); // Initialisation des tableaux @@ -1115,7 +1115,7 @@ boolean KWDatabaseIndexer::InitializeKeyFieldIndexer(int nTableIndex, KWKeyField boolean bOk = true; boolean bDisplay = false; const KWMTDatabaseMapping* readMapping; - KWClass* kwcRootClass; + KWClass* kwcMainClass; KWClass* kwcMappingClass; KWClass* kwcHeaderLineClass; StringVector svFirstLine; @@ -1130,10 +1130,10 @@ boolean KWDatabaseIndexer::InitializeKeyFieldIndexer(int nTableIndex, KWKeyField readMapping = GetMTDatabase()->GetUsedMappingAt(nTableIndex); check(readMapping); - // Recherche de la classe racine - kwcRootClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetMTDatabase()->GetClassName()); - check(kwcRootClass); - assert(kwcRootClass->GetKeyAttributeNumber() > 0); + // Recherche de la classe principale + kwcMainClass = KWClassDomain::GetCurrentDomain()->LookupClass(GetMTDatabase()->GetClassName()); + check(kwcMainClass); + assert(kwcMainClass->GetKeyAttributeNumber() > 0); // Recherche de la table associee au mapping kwcMappingClass = KWClassDomain::GetCurrentDomain()->LookupClass(readMapping->GetClassName()); @@ -1143,8 +1143,8 @@ boolean KWDatabaseIndexer::InitializeKeyFieldIndexer(int nTableIndex, KWKeyField kwcMappingClass->ExportNativeFieldNames(keyFieldsIndexer->GetNativeFieldNames()); kwcMappingClass->ExportKeyAttributeNames(keyFieldsIndexer->GetKeyAttributeNames()); - // On restreint les champs cle a ceux correspondant a la classe racine - keyFieldsIndexer->GetKeyAttributeNames()->SetSize(kwcRootClass->GetKeyAttributeNumber()); + // On restreint les champs cle a ceux correspondant a la classe principale + keyFieldsIndexer->GetKeyAttributeNames()->SetSize(kwcMainClass->GetKeyAttributeNumber()); // Extraction des champs de la premiere ligne du fichier d'entree a partir de la classe representant la ligne // d'entete @@ -1192,45 +1192,45 @@ boolean KWDatabaseIndexer::InitializeKeyFieldIndexer(int nTableIndex, KWKeyField return bOk; } -boolean KWDatabaseIndexer::EvaluateKeySize(const KWKeyFieldsIndexer* rootKeyFieldsIndexer, longint& lRootMeanKeySize, - longint& lRootLineNumber) +boolean KWDatabaseIndexer::EvaluateKeySize(const KWKeyFieldsIndexer* mainKeyFieldsIndexer, longint& lMeanMainKeySize, + longint& lMainLineNumber) { boolean bOk = true; KWKeySizeEvaluatorTask keySizeEvaluator; - require(rootKeyFieldsIndexer != NULL); + require(mainKeyFieldsIndexer != NULL); require(not bIsIndexationInterruptedByUser); require(IsMultiTableTechnology()); - // Evaluation de la taille des cles a partir de la table racine - lRootMeanKeySize = 0; - lRootLineNumber = 0; + // Evaluation de la taille des cles a partir de la table principale + lMeanMainKeySize = 0; + lMainLineNumber = 0; if (bOk) { bOk = keySizeEvaluator.EvaluateKeySize( - rootKeyFieldsIndexer->GetConstKeyFieldIndexes(), GetMTDatabase()->GetDatabaseName(), - GetMTDatabase()->GetHeaderLineUsed(), GetMTDatabase()->GetFieldSeparator(), lRootMeanKeySize, - lRootLineNumber); + mainKeyFieldsIndexer->GetConstKeyFieldIndexes(), GetMTDatabase()->GetDatabaseName(), + GetMTDatabase()->GetHeaderLineUsed(), GetMTDatabase()->GetFieldSeparator(), lMeanMainKeySize, + lMainLineNumber); bIsIndexationInterruptedByUser = bIsIndexationInterruptedByUser or keySizeEvaluator.IsTaskInterruptedByUser(); } return bOk; } -boolean KWDatabaseIndexer::ExtractRootSampleKeyPositions(const KWKeyFieldsIndexer* rootKeyFieldsIndexer, - longint lRootMeanKeySize, longint lRootLineNumber, - double dSamplingRate, ObjectArray* oaRootKeyPositions) +boolean KWDatabaseIndexer::ExtractMainSampleKeyPositions(const KWKeyFieldsIndexer* mainKeyFieldsIndexer, + longint lMeanMainKeySize, longint lMainLineNumber, + double dSamplingRate, ObjectArray* oaMainKeyPositions) { boolean bOk = true; KWKeyPositionSampleExtractorTask keyPositionSampleExtractor; require(not bIsIndexationInterruptedByUser); require(IsMultiTableTechnology()); - require(rootKeyFieldsIndexer != NULL); - require(oaRootKeyPositions != NULL); - require(oaRootKeyPositions->GetSize() == 0); - require(lRootMeanKeySize > 0); - require(lRootLineNumber > 0); + require(mainKeyFieldsIndexer != NULL); + require(oaMainKeyPositions != NULL); + require(oaMainKeyPositions->GetSize() == 0); + require(lMeanMainKeySize > 0); + require(lMainLineNumber > 0); require(dSamplingRate > 0); // Extraction des cles et de leur position @@ -1238,12 +1238,12 @@ boolean KWDatabaseIndexer::ExtractRootSampleKeyPositions(const KWKeyFieldsIndexe keyPositionSampleExtractor.SetHeaderLineUsed(GetMTDatabase()->GetHeaderLineUsed()); keyPositionSampleExtractor.SetFieldSeparator(GetMTDatabase()->GetFieldSeparator()); keyPositionSampleExtractor.SetSamplingRate(dSamplingRate); - keyPositionSampleExtractor.SetKeyUsedMemory(lRootMeanKeySize); - keyPositionSampleExtractor.SetFileLineNumber(lRootLineNumber); - keyPositionSampleExtractor.GetKeyFieldIndexes()->CopyFrom(rootKeyFieldsIndexer->GetConstKeyFieldIndexes()); - bOk = keyPositionSampleExtractor.ExtractSample(oaRootKeyPositions); + keyPositionSampleExtractor.SetKeyUsedMemory(lMeanMainKeySize); + keyPositionSampleExtractor.SetFileLineNumber(lMainLineNumber); + keyPositionSampleExtractor.GetKeyFieldIndexes()->CopyFrom(mainKeyFieldsIndexer->GetConstKeyFieldIndexes()); + bOk = keyPositionSampleExtractor.ExtractSample(oaMainKeyPositions); bIsIndexationInterruptedByUser = bIsIndexationInterruptedByUser or keyPositionSampleExtractor.IsTaskInterruptedByUser(); - assert(bOk or oaRootKeyPositions->GetSize() == 0); + assert(bOk or oaMainKeyPositions->GetSize() == 0); return bOk; } diff --git a/src/Learning/KWDataUtils/KWDatabaseIndexer.h b/src/Learning/KWDataUtils/KWDatabaseIndexer.h index 4a3e9f9ab..e33948c45 100644 --- a/src/Learning/KWDataUtils/KWDatabaseIndexer.h +++ b/src/Learning/KWDataUtils/KWDatabaseIndexer.h @@ -104,7 +104,7 @@ class KWDatabaseIndexer : public Object // . debut de position du chunk par table // . fin de position du chunk par table // . index du premier record du chunk par table - // . derniere cle racine du chunk + // . derniere cle principale du chunk // // Ces resultats sont calcules de facon bufferises au fur et a mesure des calcul d'indexation // pour une meme database, uniquement pour la table principale et ses sous-table utilisees. @@ -117,11 +117,11 @@ class KWDatabaseIndexer : public Object // Nombre total de chunk int GetChunkNumber() const; - // Derniere cle racine du chunk precedent + // Derniere cle principale du chunk precedent // Renvoie une cle vide pour le premier chunk // Renvoie une cle vide systematiquement dans le cas particulier d'une base reduite a une seule table sans cle // Memoire: appartient a l'appele - const KWKey* GetChunkPreviousRootKeyAt(int nChunkIndex) const; + const KWKey* GetChunkPreviousMainKeyAt(int nChunkIndex) const; // Index du dernier record du chunk precedent, par table // Renvoie 0 pour le premier chunk @@ -170,14 +170,14 @@ class KWDatabaseIndexer : public Object // On calcule d'abord les index de champ de chaque table en entree, ce qui permet de savoir quelle table doit // etre lue. On collecte un echantillon de cles de la table principale, ainsi que leur position pour chaque // table On determine alors un decoupage des tables pour les traitement par esclave En sortie, si OK, on a donc - // initialise les tableaux oaAllChunksBeginPos, oaAllChunksBeginRecordIndex, et oaAllChunksLastRootKeys + // initialise les tableaux oaAllChunksBeginPos, oaAllChunksBeginRecordIndex, et oaAllChunksLastMainKeys // Pilotage du calcul du plan d'indexation global // Erreur possible si pas assez de ressource par exemple boolean ComputeAllDataTableIndexation(); // Indexation basique avec un seul troncon de la table principale - boolean ComputeRootTableBasicIndexation(); + boolean ComputeMainTableBasicIndexation(); // Extraction d'un echantillon de cles et de leur position pour la table principale // dans le cas particulier d'une table principale sans cle @@ -185,7 +185,7 @@ class KWDatabaseIndexer : public Object // Extraction d'un echantillon de cles et de leur position pour la table principale // dans le cas d'une table princpale avec cle - boolean ComputeRootTableIndexation(); + boolean ComputeMainTableIndexation(); // Indexation basique avec un seul troncon des tables secondaires non deja traitees boolean ComputeSecondaryTablesBasicIndexation(); @@ -199,18 +199,18 @@ class KWDatabaseIndexer : public Object // Initialisation d'un indexeur de champ cle pour un index de table en entree // On n'indexe que les champs cles secondaire correspondant a ceux de la table principale, // Les champs cles secondaire sont potentiellement en positions differentes, de nom different - // et en nombre supperieur a ceux de la table racine. On n'indexe que ceux correspond - // a la table racine (en meme nombre et dans le meme ordre) + // et en nombre supperieur a ceux de la table principale. On n'indexe que ceux correspond + // a la table principale (en meme nombre et dans le meme ordre) boolean InitializeKeyFieldIndexer(int nTableIndex, KWKeyFieldsIndexer* keyFieldsIndexer); - // Evaluation de la taille des cles et du nombre de lignes de la table racine - boolean EvaluateKeySize(const KWKeyFieldsIndexer* rootKeyFieldsIndexer, longint& lRootMeanKeySize, - longint& lRootLineNumber); + // Evaluation de la taille des cles et du nombre de lignes de la table principale + boolean EvaluateKeySize(const KWKeyFieldsIndexer* mainKeyFieldsIndexer, longint& lMeanMainKeySize, + longint& lMainLineNumber); // Extraction d'un echantillon de cles et de leur position pour la table principale en lecture - boolean ExtractRootSampleKeyPositions(const KWKeyFieldsIndexer* rootKeyFieldsIndexer, longint lRootMeanKeySize, - longint lRootLineNumber, double dSamplingRate, - ObjectArray* oaRootKeyPositions); + boolean ExtractMainSampleKeyPositions(const KWKeyFieldsIndexer* mainKeyFieldsIndexer, longint lMeanMainKeySize, + longint lMainLineNumber, double dSamplingRate, + ObjectArray* oaMainKeyPositions); //////////////////////////////////////////////////////////////////////////////////////////////////// // Parametrage de l'indexation From c298f9170eefcb469b3849f0f0aa686da42ebf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 16:35:07 +0100 Subject: [PATCH 08/14] Improve terminology between root and main dictionary in KWDatabaseChunkBuilder - KWDatabaseChunkBuilder - GetChunkLastRootKeyAt -> GetChunkLastMainKeyAt --- src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp | 12 ++++++------ src/Learning/KWDataUtils/KWDatabaseChunkBuilder.h | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp index 74044aec6..9e8fe39fe 100644 --- a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp @@ -100,17 +100,17 @@ int KWDatabaseChunkBuilder::GetChunkNumber() const return ivChunkBeginIndexes.GetSize(); } -void KWDatabaseChunkBuilder::GetChunkLastRootKeyAt(int nChunkIndex, KWKey* lastRootKey) const +void KWDatabaseChunkBuilder::GetChunkLastMainKeyAt(int nChunkIndex, KWKey* lastMainKey) const { int nMicroChunkIndex; require(databaseIndexer != NULL); require(0 <= nChunkIndex and nChunkIndex < GetChunkNumber()); - require(lastRootKey != NULL); + require(lastMainKey != NULL); // On recherche l'information pour le micro-chunk correspondant au chunk nMicroChunkIndex = ivChunkBeginIndexes.GetAt(nChunkIndex); - lastRootKey->CopyFrom(databaseIndexer->GetChunkPreviousMainKeyAt(nMicroChunkIndex)); + lastMainKey->CopyFrom(databaseIndexer->GetChunkPreviousMainKeyAt(nMicroChunkIndex)); } void KWDatabaseChunkBuilder::GetChunkPreviousRecordIndexesAt(int nChunkIndex, @@ -221,7 +221,7 @@ void KWDatabaseChunkBuilder::Write(ostream& ost) const LongintVector lvChunkBeginPositions; LongintVector lvChunkEndPositions; LongintVector lvChunkPreviousRecordIndexes; - KWKey lastRootKey; + KWKey lastMainKey; longint lChunkSize; ost << GetClassLabel() << " " << GetObjectLabel() << "\n"; @@ -247,7 +247,7 @@ void KWDatabaseChunkBuilder::Write(ostream& ost) const for (nChunk = 0; nChunk < GetChunkNumber(); nChunk++) { // Acces aux caracteristique du chunk - GetChunkLastRootKeyAt(nChunk, &lastRootKey); + GetChunkLastMainKeyAt(nChunk, &lastMainKey); GetChunkPreviousRecordIndexesAt(nChunk, &lvChunkPreviousRecordIndexes); GetChunkBeginPositionsAt(nChunk, &lvChunkBeginPositions); GetChunkEndPositionsAt(nChunk, &lvChunkEndPositions); @@ -267,7 +267,7 @@ void KWDatabaseChunkBuilder::Write(ostream& ost) const ost << lvChunkEndPositions.GetAt(nTable) << "\t"; } ost << lChunkSize << "\t"; - ost << lastRootKey.GetObjectLabel() << "\n"; + ost << lastMainKey.GetObjectLabel() << "\n"; } } } diff --git a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.h b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.h index a5fc9db71..86bf156da 100644 --- a/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.h +++ b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.h @@ -72,16 +72,16 @@ class KWDatabaseChunkBuilder : public Object // . debut de position du chunk par table // . fin de position du chunk par table // . index du premier record du chunk par table - // . derniere cle racine du chunk + // . derniere cle principale du chunk // Memoire: les objet retournes appartiennent a l'appelant // Nombre total de chunk int GetChunkNumber() const; - // Derniere cle racine du chunk precedent + // Derniere cle principale du chunk precedent // Renvoie une cle vide pour le premier chunk // Renvoie une cle vide systematiquement dans le cas particulier d'une base reduite a une seule table sans cle - void GetChunkLastRootKeyAt(int nChunkIndex, KWKey* lastRootKey) const; + void GetChunkLastMainKeyAt(int nChunkIndex, KWKey* lastMainKey) const; // Vecteur des index du dernier record du chunk precedent, par table // Renvoie un index 0 par table pour le premier chunk From 6d8ed950fd6dea3c1189e9c86130c20836866783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 17:31:56 +0100 Subject: [PATCH 09/14] Improve terminology between root and main dictionary in KWArtificialDataset - KWArtificialDataset - CreateDataset --- src/Learning/KWDataUtils/KWArtificialDataset.cpp | 16 ++++++++-------- src/Learning/KWDataUtils/KWDatabaseTask.cpp | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Learning/KWDataUtils/KWArtificialDataset.cpp b/src/Learning/KWDataUtils/KWArtificialDataset.cpp index a35b20e5f..377309ecd 100644 --- a/src/Learning/KWDataUtils/KWArtificialDataset.cpp +++ b/src/Learning/KWDataUtils/KWArtificialDataset.cpp @@ -200,7 +200,7 @@ void KWArtificialDataset::CreateDataset() const int nField; int nLine; int nKey; - int nRootBaseKey; + int nMainBaseKey; int nBaseKey; StringVector svFieldValues; int nKeyValue; @@ -253,16 +253,16 @@ void KWArtificialDataset::CreateDataset() const // On calcule la valeur de base de la cle, de facon a ce que les cles de poids forts evoluent de facon // monotone - nRootBaseKey = 1; - nBaseKey = nRootBaseKey; + nMainBaseKey = 1; + nBaseKey = nMainBaseKey; for (nKey = 0; nKey < ivKeyFieldIndexes.GetSize(); nKey++) nBaseKey *= 10; while (nMaxLineNumberPerKey * nBaseKey / 10 < nLineNumber) { nBaseKey *= 10; - nRootBaseKey *= 10; + nMainBaseKey *= 10; } - assert(nMaxLineNumberPerKey * nRootBaseKey * pow(10.0, 1.0 * ivKeyFieldIndexes.GetSize()) / 10 >= + assert(nMaxLineNumberPerKey * nMainBaseKey * pow(10.0, 1.0 * ivKeyFieldIndexes.GetSize()) / 10 >= nLineNumber); // Creation des lignes @@ -278,7 +278,7 @@ void KWArtificialDataset::CreateDataset() const IntToString(nField + 1)); // On alimente d'abord les cles de poids faible, par puissance de 10 - nBaseKey = nRootBaseKey; + nBaseKey = nMainBaseKey; for (nKey = ivKeyFieldIndexes.GetSize() - 1; nKey >= 0; nKey--) { // On cree les cle selon l'ordre souhaite @@ -289,8 +289,8 @@ void KWArtificialDataset::CreateDataset() const nKeyValue = nBaseKey - 1 - ((nLine / nMaxLineNumberPerKey) % nBaseKey); // Les cles de poids fort sont incrementees plus lentement que les cle de poids faible - nKeyValue /= (nBaseKey / nRootBaseKey); - nKeyValue *= (nBaseKey / nRootBaseKey); + nKeyValue /= (nBaseKey / nMainBaseKey); + nKeyValue *= (nBaseKey / nMainBaseKey); // Memorisation de la cle (on maintenant en categoriel son ordre numerique) sKeyValue = sTmp + IntToString(nBaseKey + nKeyValue); diff --git a/src/Learning/KWDataUtils/KWDatabaseTask.cpp b/src/Learning/KWDataUtils/KWDatabaseTask.cpp index e16f7a5d9..191562837 100644 --- a/src/Learning/KWDataUtils/KWDatabaseTask.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseTask.cpp @@ -512,7 +512,7 @@ boolean KWDatabaseTask::MasterPrepareTaskInput(double& dTaskPercent, boolean& bI if (shared_sourceDatabase.GetDatabase()->IsMultiTableTechnology()) { // Recopie de la cle racine - databaseChunkBuilder.GetChunkLastRootKeyAt(nChunkCurrentIndex, input_ChunkLastRootKey.GetKey()); + databaseChunkBuilder.GetChunkLastMainKeyAt(nChunkCurrentIndex, input_ChunkLastRootKey.GetKey()); // Recopie des vecteurs de position de debut et fin pour l'esclave databaseChunkBuilder.GetChunkPreviousRecordIndexesAt( From 6079136ad717bd37083fd7456d30c397b3b0d4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Thu, 5 Dec 2024 17:41:14 +0100 Subject: [PATCH 10/14] Improve terminology between root and main dictionary in KWKeyPositionFinderTask - KWKeyPositionFinderTask - TestWithArtificialRootAndSecondaryTables -> TestWithArtificialMainAndSecondaryTables --- .../KWDataUtils/KWKeyPositionFinderTask.cpp | 50 +++++++++---------- .../KWDataUtils/KWKeyPositionFinderTask.h | 6 +-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp index 0f9f4a726..cef45b788 100644 --- a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp +++ b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp @@ -237,23 +237,23 @@ const ALString KWKeyPositionFinderTask::GetObjectLabel() const void KWKeyPositionFinderTask::Test() { - TestWithArtificialRootAndSecondaryTables(100000, 1, 1, 1000000, 10, 1, 0); - TestWithArtificialRootAndSecondaryTables(10000, 1, 1, 100000, 10, 1, 0); - TestWithArtificialRootAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0.01, 0); - TestWithArtificialRootAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0.01, 1000); - TestWithArtificialRootAndSecondaryTables(100000, 10, 0.01, 1000000, 1, 0.01, 1000); - TestWithArtificialRootAndSecondaryTables(100000, 1, 0, 1000000, 10, 0.01, 1000); - TestWithArtificialRootAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0, 1000); - TestWithArtificialRootAndSecondaryTables(1, 1, 1, 1000000, 10, 0.01, 1000); + TestWithArtificialMainAndSecondaryTables(100000, 1, 1, 1000000, 10, 1, 0); + TestWithArtificialMainAndSecondaryTables(10000, 1, 1, 100000, 10, 1, 0); + TestWithArtificialMainAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0.01, 0); + TestWithArtificialMainAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0.01, 1000); + TestWithArtificialMainAndSecondaryTables(100000, 10, 0.01, 1000000, 1, 0.01, 1000); + TestWithArtificialMainAndSecondaryTables(100000, 1, 0, 1000000, 10, 0.01, 1000); + TestWithArtificialMainAndSecondaryTables(100000, 1, 0.01, 1000000, 10, 0, 1000); + TestWithArtificialMainAndSecondaryTables(1, 1, 1, 1000000, 10, 0.01, 1000); } -boolean KWKeyPositionFinderTask::TestWithArtificialRootAndSecondaryTables( - int nRootLineNumber, int nRootLineNumberPerKey, double dRootSamplingRate, int nSecondaryLineNumber, +boolean KWKeyPositionFinderTask::TestWithArtificialMainAndSecondaryTables( + int nMainLineNumber, int nMainLineNumberPerKey, double dMainSamplingRate, int nSecondaryLineNumber, int nSecondaryLineNumberPerKey, double dSecondarySamplingRate, int nBufferSize) { boolean bOk = true; boolean bCreateDatasets = true; - KWArtificialDataset rootArtificialDataset; + KWArtificialDataset mainArtificialDataset; KWArtificialDataset secondaryArtificialDataset; longint lMeanKeySize; longint lLineNumber; @@ -262,9 +262,9 @@ boolean KWKeyPositionFinderTask::TestWithArtificialRootAndSecondaryTables( ObjectArray oaFoundKeyPositions; KWKeyPositionFinderTask keyPositionFinder; - require(nRootLineNumber >= 0); - require(nRootLineNumberPerKey >= 0); - require(dRootSamplingRate >= 0); + require(nMainLineNumber >= 0); + require(nMainLineNumberPerKey >= 0); + require(dMainSamplingRate >= 0); require(nSecondaryLineNumber >= 0); require(nSecondaryLineNumberPerKey >= 0); require(dSecondarySamplingRate >= 0); @@ -282,31 +282,31 @@ boolean KWKeyPositionFinderTask::TestWithArtificialRootAndSecondaryTables( cout << endl; cout << "===============================================================================" << endl; cout << keyPositionFinder.GetTaskLabel() << ":" - << " Root(" << nRootLineNumber << ", " << nRootLineNumberPerKey << ", " << dRootSamplingRate << ")" + << " Main(" << nMainLineNumber << ", " << nMainLineNumberPerKey << ", " << dMainSamplingRate << ")" << " Secondary(" << nSecondaryLineNumber << ", " << nSecondaryLineNumberPerKey << ", " << dSecondarySamplingRate << ")" << " Buffer(" << nBufferSize << ")" << endl; cout << "===============================================================================" << endl; // Creation d'un fichier racine avec des champs cle - rootArtificialDataset.SpecifySortedDataset(); - rootArtificialDataset.SetLineNumber(nRootLineNumber); - rootArtificialDataset.SetMaxLineNumberPerKey(nRootLineNumberPerKey); - rootArtificialDataset.SetSamplingRate(dRootSamplingRate); - rootArtificialDataset.SetFileName(rootArtificialDataset.BuildFileName()); + mainArtificialDataset.SpecifySortedDataset(); + mainArtificialDataset.SetLineNumber(nMainLineNumber); + mainArtificialDataset.SetMaxLineNumberPerKey(nMainLineNumberPerKey); + mainArtificialDataset.SetSamplingRate(dMainSamplingRate); + mainArtificialDataset.SetFileName(mainArtificialDataset.BuildFileName()); if (bCreateDatasets) - rootArtificialDataset.CreateDataset(); - rootArtificialDataset.DisplayFirstLines(15); + mainArtificialDataset.CreateDataset(); + mainArtificialDataset.DisplayFirstLines(15); // Evaluation de la taille des cles du fichier principal lMeanKeySize = 0; lLineNumber = 0; bOk = bOk and - KWKeySizeEvaluatorTask::TestWithArtificialDataset(&rootArtificialDataset, lMeanKeySize, lLineNumber); + KWKeySizeEvaluatorTask::TestWithArtificialDataset(&mainArtificialDataset, lMeanKeySize, lLineNumber); // Extraction des cle du fichier principal bOk = bOk and KWKeyPositionSampleExtractorTask::TestWithArtificialDataset( - &rootArtificialDataset, 0.25, lMeanKeySize, lLineNumber, &oaInputKeyPositions); + &mainArtificialDataset, 0.25, lMeanKeySize, lLineNumber, &oaInputKeyPositions); // Creation d'un fichier secondaire avec des champs cle secondaryArtificialDataset.SpecifySortedDataset(); @@ -330,7 +330,7 @@ boolean KWKeyPositionFinderTask::TestWithArtificialRootAndSecondaryTables( // Destruction des fichiers if (bCreateDatasets) { - rootArtificialDataset.DeleteDataset(); + mainArtificialDataset.DeleteDataset(); secondaryArtificialDataset.DeleteDataset(); } diff --git a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.h b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.h index 7fc4e6b45..108287cfa 100644 --- a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.h +++ b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.h @@ -89,11 +89,11 @@ class KWKeyPositionFinderTask : public PLParallelTask // Methode de test static void Test(); - // Test en specifiant les caracteristiques d'une table racine et d'une table secondaire + // Test en specifiant les caracteristiques d'une table principale et d'une table secondaire // au moyen de jeux de donnees artificiels // La taille de buffer n'est prise en compte que si elle est differente de 0. - static boolean TestWithArtificialRootAndSecondaryTables(int nRootLineNumber, int nRootLineNumberPerKey, - double dRootSamplingRate, int nSecondaryLineNumber, + static boolean TestWithArtificialMainAndSecondaryTables(int nMainLineNumber, int nMainLineNumberPerKey, + double dMainSamplingRate, int nSecondaryLineNumber, int nSecondaryLineNumberPerKey, double dSecondarySamplingRate, int nBufferSize); From 6b6e68d95523c9bd5e64b879a4ed022ad6c289b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Fri, 6 Dec 2024 09:18:06 +0100 Subject: [PATCH 11/14] Improve terminology between root and main dictionary in KWTestDatabaseTransfer - KWTestDatabaseTransfer - MTTest - MTTestWithArtificialDatabase - MTMainTestReadWrite - MTTestReadWrite --- .../KWDataUtils/KWTestDatabaseTransfer.cpp | 72 +++++++++---------- .../KWDataUtils/KWTestDatabaseTransfer.h | 18 ++--- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp index a488ceabe..44dd3d666 100644 --- a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp +++ b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp @@ -588,35 +588,35 @@ void KWTestDatabaseTransfer::MTTest() MTTestWithArtificialDatabase(2, 1, false, 10000, 1, 1, 100000, 10, 1, 0, 100000, "No use of secondary table"); MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 0.01, 1000000, 10, 0.01, 10000, 100000, "Heavily sampled, with orphan records"); - MTTestWithArtificialDatabase(2, 2, true, 100000, 5, 1, 100000, 1, 1, 10000, 1000000, "Root duplicates"); + MTTestWithArtificialDatabase(2, 2, true, 100000, 5, 1, 100000, 1, 1, 10000, 1000000, "Main duplicates"); MTTestWithArtificialDatabase(2, 1, false, 100, 2, 1, 0, 10, 1, 100, 200, - "Root duplicates with several processes"); + "Main duplicates with several processes"); MTTestWithArtificialDatabase(2, 2, true, 300, 2, 0.3, 500, 2, 1, 100, 1000, - "Root duplicates and orphans records with several processes"); + "Main duplicates and orphans records with several processes"); MTTestWithArtificialDatabase(2, 2, true, 300, 3, 1, 10000, 10, 1, 100, 1000, - "Root duplicates and many orphans records with several processes"); - MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 0, 1000000, 10, 0.01, 10000, 100000, "No root instances"); + "Main duplicates and many orphans records with several processes"); + MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 0, 1000000, 10, 0.01, 10000, 100000, "No main instances"); MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 0.01, 1000000, 10, 0, 10000, 100000, "No secondary records"); MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 0.5, 1000000, 10, 0.2, 10000, 1000000, "Medium sampled with varying record number per instance"); - MTTestWithArtificialDatabase(2, 2, true, 1, 1, 1, 1000000, 10, 0.01, 10000, 10000, "One single root instance"); + MTTestWithArtificialDatabase(2, 2, true, 1, 1, 1, 1000000, 10, 0.01, 10000, 10000, "One single main instance"); MTTestWithArtificialDatabase(2, 2, true, 100000, 1, 1, 1000000, 10, 1, 0, 0, "Large"); MTTestWithArtificialDatabase(3, 3, true, 10000, 1, 1, 100000, 10, 1, 10000, 100000, "Snow-flake schema"); MTTestWithArtificialDatabase(3, 0, true, 10000, 1, 1, 100000, 10, 1, 10000, 100000, - "Snow-flake schema with no used sub-table"); + "Snowflake schema with no used sub-table"); MTTestWithArtificialDatabase(3, 0, false, 10000, 1, 1, 100000, 10, 1, 10000, 100000, - "Snow-flake schema using only root table"); + "Snowflake schema using only main table"); MTTestWithArtificialDatabase(4, 4, true, 10000, 1, 1, 100000, 10, 1, 10000, 100000, "Full schema"); MTTestWithArtificialDatabase(4, 0, true, 10000, 1, 1, 100000, 10, 1, 10000, 100000, "Full schema with no used sub-table"); MTTestWithArtificialDatabase(4, 0, false, 10000, 1, 1, 100000, 10, 1, 10000, 100000, - "Full schema using only root table"); + "Full schema using only main table"); } void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int nUsedTableNumber, - boolean bUseBuildRules, int nRootLineNumber, - int nRootLineNumberPerKey, double dRootSamplingRate, + boolean bUseBuildRules, int nMainLineNumber, + int nMainLineNumberPerKey, double dMainSamplingRate, int nSecondaryLineNumber, int nSecondaryLineNumberPerKey, double dSecondarySamplingRate, int nBufferSize, int lMaxFileSizePerProcess, const ALString& sTestLabel) @@ -624,7 +624,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int boolean bShowTime = false; KWDatabaseTransferTask databaseTransfer; boolean bOk; - const int nRootIndex = 0; + const int nMainIndex = 0; const int nSecondary01Index = 1; const int nSecondary0nIndex = 2; const int nExternalIndex = 3; @@ -651,9 +651,9 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int require(nTableNumber >= 0); require(nUsedTableNumber >= 0); require(nUsedTableNumber <= nTableNumber); - require(nRootLineNumber >= 0); - require(nRootLineNumberPerKey >= 0); - require(dRootSamplingRate >= 0); + require(nMainLineNumber >= 0); + require(nMainLineNumberPerKey >= 0); + require(dMainSamplingRate >= 0); require(nSecondaryLineNumber >= 0); require(nSecondaryLineNumberPerKey >= 0); require(dSecondarySamplingRate >= 0); @@ -672,7 +672,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int cout << endl; cout << "=============================================================================" << endl; cout << databaseTransfer.GetTaskLabel() << ":" - << " Root(" << nRootLineNumber << ", " << nRootLineNumberPerKey << ", " << dRootSamplingRate << ")"; + << " Main(" << nMainLineNumber << ", " << nMainLineNumberPerKey << ", " << dMainSamplingRate << ")"; if (nTableNumber >= 2) cout << " Secondary(" << nSecondaryLineNumber << ", " << nSecondaryLineNumberPerKey << ", " << dSecondarySamplingRate << ")"; @@ -692,15 +692,15 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int // Creation du fichier principal artificialDataset = new KWArtificialDataset; - oaArtificialDatasets.SetAt(nRootIndex, artificialDataset); + oaArtificialDatasets.SetAt(nMainIndex, artificialDataset); timer.Reset(); timer.Start(); if (nTableNumber == 0) artificialDataset->GetKeyFieldIndexes()->SetSize(0); - artificialDataset->SetLineNumber(nRootLineNumber); - artificialDataset->SetMaxLineNumberPerKey(nRootLineNumberPerKey); - artificialDataset->SetSamplingRate(dRootSamplingRate); - artificialDataset->SetFileName(FileService::BuildFilePathName(FileService::GetTmpDir(), "Root.txt")); + artificialDataset->SetLineNumber(nMainLineNumber); + artificialDataset->SetMaxLineNumberPerKey(nMainLineNumberPerKey); + artificialDataset->SetSamplingRate(dMainSamplingRate); + artificialDataset->SetFileName(FileService::BuildFilePathName(FileService::GetTmpDir(), "Main.txt")); artificialDataset->CreateDataset(); artificialDataset->DisplayFirstLines(15); timer.Stop(); @@ -709,7 +709,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int // Creation de son dictionnaire kwcClass = ComputeArtificialClass(artificialDataset); - oaArtificialClasses.SetAt(nRootIndex, kwcClass); + oaArtificialClasses.SetAt(nMainIndex, kwcClass); if (nTableNumber >= 1) kwcClass->SetRoot(true); KWClassDomain::GetCurrentDomain()->InsertClass(kwcClass); @@ -718,7 +718,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int if (nTableNumber >= 3) { // Utilisation d'une copie du fichier principal - artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nRootIndex))->Clone(); + artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nMainIndex))->Clone(); oaArtificialDatasets.SetAt(nSecondary01Index, artificialDataset); timer.Reset(); timer.Start(); @@ -747,7 +747,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int oaArtificialDatasets.SetAt(nSecondary0nIndex, artificialDataset); timer.Reset(); timer.Start(); - artificialDataset->CopyFrom(cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nRootIndex))); + artificialDataset->CopyFrom(cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nMainIndex))); artificialDataset->SetFieldNumber(2); artificialDataset->GetKeyFieldIndexes()->SetAt(0, 1); artificialDataset->SetLineNumber(nSecondaryLineNumber); @@ -771,7 +771,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int if (nTableNumber >= 4) { // Utilisation d'une copie du fichier principal - artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nRootIndex))->Clone(); + artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nMainIndex))->Clone(); oaArtificialDatasets.SetAt(nExternalIndex, artificialDataset); timer.Reset(); timer.Start(); @@ -797,7 +797,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int { // Acces aux tables a lier if (nTableNumber == 2) - kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nRootIndex)); + kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nMainIndex)); else kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nSecondary01Index)); kwcSubClass = cast(KWClass*, oaArtificialClasses.GetAt(nSecondary0nIndex)); @@ -831,7 +831,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int if (nTableNumber >= 3) { // Acces aux tables a lier - kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nRootIndex)); + kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nMainIndex)); kwcSubClass = cast(KWClass*, oaArtificialClasses.GetAt(nSecondary01Index)); // Preparation du schema multi-tables avec un attribut de lien vers la table secondaire @@ -862,7 +862,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int if (nTableNumber >= 4) { // Acces aux tables a lier - kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nRootIndex)); + kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nMainIndex)); kwcSubClass = cast(KWClass*, oaArtificialClasses.GetAt(nExternalIndex)); assert(kwcSubClass->GetKeyAttributeNumber() == 1); @@ -900,8 +900,8 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int KWClassDomain::GetCurrentDomain()->Compile(); // Initialisation de la base source - kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nRootIndex)); - artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nRootIndex)); + kwcClass = cast(KWClass*, oaArtificialClasses.GetAt(nMainIndex)); + artificialDataset = cast(KWArtificialDataset*, oaArtificialDatasets.GetAt(nMainIndex)); databaseSource.SetClassName(kwcClass->GetName()); databaseSource.SetHeaderLineUsed(artificialDataset->GetHeaderLineUsed()); databaseSource.SetFieldSeparator(artificialDataset->GetFieldSeparator()); @@ -1011,9 +1011,9 @@ void KWTestDatabaseTransfer::MTMainTestReadWrite(int argc, char** argv) cout << "TestReadWrite " << " " << " " - << " " + << " " << " " - << " " + << " " << "" << endl; } else @@ -1021,8 +1021,8 @@ void KWTestDatabaseTransfer::MTMainTestReadWrite(int argc, char** argv) } void KWTestDatabaseTransfer::MTTestReadWrite(const ALString& sClassFileName, const ALString& sClassName, - const ALString& sRootReadFileName, const ALString& sSecondaryReadFileName, - const ALString& sRootWriteFileName, + const ALString& sMainReadFileName, const ALString& sSecondaryReadFileName, + const ALString& sMainWriteFileName, const ALString& sSecondaryWriteFileName) { boolean bOk = true; @@ -1053,7 +1053,7 @@ void KWTestDatabaseTransfer::MTTestReadWrite(const ALString& sClassFileName, con { // Initialisation de la base source readDatabase.SetClassName(sClassName); - readDatabase.SetDatabaseName(sRootReadFileName); + readDatabase.SetDatabaseName(sMainReadFileName); readDatabase.UpdateMultiTableMappings(); // Initialisation de la table secondaire @@ -1066,7 +1066,7 @@ void KWTestDatabaseTransfer::MTTestReadWrite(const ALString& sClassFileName, con if (bOk) { writeDatabase.SetClassName(sClassName); - writeDatabase.SetDatabaseName(sRootWriteFileName); + writeDatabase.SetDatabaseName(sMainWriteFileName); writeDatabase.UpdateMultiTableMappings(); // Initialisation de la table secondaire diff --git a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.h b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.h index 0785ccd45..eee4bbd3e 100644 --- a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.h +++ b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.h @@ -45,31 +45,31 @@ class KWTestDatabaseTransfer : public Object // Test en specifiant les caracteristiques d'une base multi-tables au moyen de jeux de donnees artificiels // TableNumber: // . 0: cas mono-table, sans identifiants - // . 1: une table racine avec identifiants - // . 2: une table racine avec une table secondaire en relation 0-n - // . 3: une table racine avec une table secondaire en relation 0-1 (identique a table principale), et + // . 1: une table principale avec identifiants + // . 2: une table principale avec une table secondaire en relation 0-n + // . 3: une table principale avec une table secondaire en relation 0-1 (identique a table principale), et // une autre table secondaire en relation 0-n avec la seconde table // . 4: comme la cas (3), avec en plus une table externe (identique a la table principale) // UsedTableNumber: pour mettre en Unused tout ou partie des tables et des regles de calcul // UseBuildRules: utilisation des regles de calcul liant les tables - // RootLineNumber, RootLineNumberPerKey, RootSamplingRate: caracteristique de la table principale + // MainLineNumber, MainLineNumberPerKey, MainSamplingRate: caracteristique de la table principale // (et de la table en relation 0-1, et de la table externe) // SecondaryLineNumber, SecondaryLineNumberPerKey, SecondarySamplingRate: caracteristique de la table en // relation 0-n La taille de buffer ou des fichier par process n'est prise en compte que si elle est differente // de 0. static void MTTestWithArtificialDatabase(int nTableNumber, int nUsedTableNumber, boolean bUseBuildRules, - int nRootLineNumber, int nRootLineNumberPerKey, - double dRootSamplingRate, int nSecondaryLineNumber, + int nMainLineNumber, int nMainLineNumberPerKey, + double dMainSamplingRate, int nSecondaryLineNumber, int nSecondaryLineNumberPerKey, double dSecondarySamplingRate, int nBufferSize, int lMaxFileSizePerProcess, const ALString& sTestLabel); // Test de transfert de fichier - // Si RootWriteFileName est absent: pas d'ecriture + // Si MainWriteFileName est absent: pas d'ecriture static void MTMainTestReadWrite(int argc, char** argv); static void MTTestReadWrite(const ALString& sClassFileName, const ALString& sClassName, - const ALString& sRootReadFileName, const ALString& sSecondaryReadFileName, - const ALString& sRootWriteFileName, const ALString& sSecondaryWriteFileName); + const ALString& sMainReadFileName, const ALString& sSecondaryReadFileName, + const ALString& sMainWriteFileName, const ALString& sSecondaryWriteFileName); /////////////////////////////////////////////////////////////////////////////// ///// Implementation From 4f936ec674b0bdaa3d02728adb2287c6bf6c9037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Fri, 6 Dec 2024 10:52:16 +0100 Subject: [PATCH 12/14] Improve terminology between root and main dictionary in KWPredictorEvaluator - KWPredictorEvaluator - RenameDatabaseClasses --- .../KWUserInterface/KWPredictorEvaluator.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Learning/KWUserInterface/KWPredictorEvaluator.cpp b/src/Learning/KWUserInterface/KWPredictorEvaluator.cpp index ff361727c..9be28274f 100644 --- a/src/Learning/KWUserInterface/KWPredictorEvaluator.cpp +++ b/src/Learning/KWUserInterface/KWPredictorEvaluator.cpp @@ -909,7 +909,7 @@ void KWPredictorEvaluator::RenameDatabaseClasses(KWDatabase* database, KWClassDo KWMTDatabase* mtDatabase; KWMTDatabaseMapping* mapping; KWClass* kwcClass; - ALString sInitialRootClassName; + ALString sInitialMainClassName; ALString sInitialClassName; int i; @@ -922,13 +922,13 @@ void KWPredictorEvaluator::RenameDatabaseClasses(KWDatabase* database, KWClassDo else { // Recherche de la la classe initiale correspondant a la classe en cours de la base - sInitialRootClassName = ""; + sInitialMainClassName = ""; kwcClass = KWClassDomain::GetCurrentDomain()->LookupClass(database->GetClassName()); if (kwcClass != NULL) - sInitialRootClassName = KWTrainedPredictor::GetMetaDataInitialClassName(kwcClass); + sInitialMainClassName = KWTrainedPredictor::GetMetaDataInitialClassName(kwcClass); // Memorisation de cette classe - database->SetClassName(sInitialRootClassName); + database->SetClassName(sInitialMainClassName); // Cas multi-table if (database->IsMultiTableTechnology()) @@ -946,16 +946,16 @@ void KWPredictorEvaluator::RenameDatabaseClasses(KWDatabase* database, KWClassDo sInitialClassName = KWTrainedPredictor::GetMetaDataInitialClassName(kwcClass); // Recherche de la la classe initiale correspondant a la classe en cours - sInitialRootClassName = ""; + sInitialMainClassName = ""; kwcClass = KWClassDomain::GetCurrentDomain()->LookupClass(mapping->GetOriginClassName()); if (kwcClass != NULL) - sInitialRootClassName = + sInitialMainClassName = KWTrainedPredictor::GetMetaDataInitialClassName(kwcClass); // Memorisation de cette classe ainsi de que la classe principale de la base mapping->SetClassName(sInitialClassName); - mapping->SetOriginClassName(sInitialRootClassName); + mapping->SetOriginClassName(sInitialMainClassName); } } } From f6dbf561deb0de8fa26db74b97314667d42f7f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Fri, 6 Dec 2024 11:05:31 +0100 Subject: [PATCH 13/14] Improve terminology between root and main dictionary in "Build multi-table dictionary" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cette fonctionnalite de la boite de dialogue "Data table key extractor" permet de construire un schéma en etoile a partir d'une table de log, avec un table principale ayant des identifiant uniques. L'impllementation actuel cree un dictionnaire principal, non Root, donc conforme a la nouvelle terminologie. Par contre, l'aide dans les info-bulle reference la a tort notion de root dictionary, au lieuy de main dictionary Corrections dans les info-bulles - KWLearningProblemActionView - KWDataTableKeyExtractorView - KWMTClassBuilderView --- .../KWLearningProblem/KWLearningProblemActionView.cpp | 2 +- src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp | 4 ++-- src/Learning/KWUserInterface/KWMTClassBuilderView.cpp | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Learning/KWLearningProblem/KWLearningProblemActionView.cpp b/src/Learning/KWLearningProblem/KWLearningProblemActionView.cpp index a58df76ce..b21b26aa2 100644 --- a/src/Learning/KWLearningProblem/KWLearningProblemActionView.cpp +++ b/src/Learning/KWLearningProblem/KWLearningProblemActionView.cpp @@ -54,7 +54,7 @@ KWLearningProblemActionView::KWLearningProblemActionView() GetActionAt("ExtractKeysFromDataTable") ->SetHelpText("Extract keys from a sorted input data table." "\n It is dedicated to the preparation of multi-table databases," - "\n where a root entity has to be extracted from a detailed 0-n entity." + "\n where a main entity has to be extracted from a detailed 0-n entity." "\n For example, in case of a web log file with cookies, page, timestamp in each log," "\n extracting keys allow to build a table with unique cookies from the table of logs."); GetActionAt("EvaluatePredictors") diff --git a/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp b/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp index 7c09ab46b..9d42e8e9d 100644 --- a/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp +++ b/src/Learning/KWUserInterface/KWDataTableKeyExtractorView.cpp @@ -43,11 +43,11 @@ KWDataTableKeyExtractorView::KWDataTableKeyExtractorView() GetActionAt("ExtractKeysFromDataTable") ->SetHelpText("Extract keys from a sorted input data table." "\n It is dedicated to the preparation of multi-table databases, where a" - "\n root entity has to be extracted from a detailed 0-n entity." + "\n main entity has to be extracted from a detailed 0-n entity." "\n For example, in case of a web log file with cookies, page, timestamp in each log," "\n extracting keys allow to build a table with unique cookies from the table of logs."); GetActionAt("BuildMultiTableClass") - ->SetHelpText("Build a root dictionary with a Table variable based on" + ->SetHelpText("Build a main dictionary with a Table variable based on" "\n the input dictionary, then save the dictionary file."); // Short cuts diff --git a/src/Learning/KWUserInterface/KWMTClassBuilderView.cpp b/src/Learning/KWUserInterface/KWMTClassBuilderView.cpp index 1d91829fc..fcd4200fc 100644 --- a/src/Learning/KWUserInterface/KWMTClassBuilderView.cpp +++ b/src/Learning/KWUserInterface/KWMTClassBuilderView.cpp @@ -37,7 +37,7 @@ KWMTClassBuilderView::KWMTClassBuilderView() GetFieldAt("SecondaryClassName") ->SetHelpText("Name of secondary dictionary used as a Table in the multi-table dictionary."); classNameList->GetFieldAt("Name")->SetHelpText("Name of dictionary."); - GetActionAt("OK")->SetHelpText("Build a root dictionary with a Table variable based on" + GetActionAt("OK")->SetHelpText("Build a main dictionary with a Table variable based on" "\n the input dictionary, then save the dictionary file."); // Short cuts @@ -66,7 +66,7 @@ void KWMTClassBuilderView::InitDefaultParameters() if (sSecondaryDictionaryName != "") { // Nom par defaut du dictionnaire multi-classes a construire - sDefaultMultiTableClassName = "Root" + sSecondaryDictionaryName; + sDefaultMultiTableClassName = "Main" + sSecondaryDictionaryName; sDefaultMultiTableClassName = KWClassDomain::GetCurrentDomain()->BuildClassName(sDefaultMultiTableClassName); From a7d8ba442afc2af208128c5c5d6247907b058051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Boull=C3=A9?= Date: Fri, 6 Dec 2024 13:24:30 +0100 Subject: [PATCH 14/14] Finalize management of uniqueness in data table drivers and databases Gestion des cles uniques dans les drivers de fichier et les bases de donnes - conditionne par la methode IsUnique de KWClass (auraravant GetRoot) - uniformisation de la terminologie, en passant de root a main, principalement pour la gestion des cles - dans les noms de methodes (rappele dans les notes de commit) - dans les noms d'attributs, de parametres ou de variables locales - dans les commentaires (racine -> principal) Impacts principaux - KWMTDatabase - PhysicalSkip: conditionnements sur le IsUnique au lieu de GetRoot - KWDatabaseTask - input_ChunkLastRootKey -> input_ChunkLastMainKey - PLMTDatabaseTextFile - SetLastReadRootKey -> SetLastReadMainKey - KWDataTableDriver - GetLastReadRootKey -> GetLastReadMainKey - KWDataTableDriverTextFile - SkipRootRecord -> SkipMainRecord - ivRootKeyIndexes -> ivMainKeyIndexes - nombreux conditionnements sur le IsUnique au lieu de GetRoot des dictionnaires - PLDataTableDriverTextFile - GetConstRootKeyIndexes -> GetConstMainKeyIndexes - GetRootKeyIndexes -> GetMainKeyIndexes Autres impacts mineurs, uniquement dans les commentaires Ajout du jeu de test: LearningTest\TestKhiops\MultiTables\NoRootSnowflakeDuplicates - test avec schema en flocon, sans dictionnaire Root, et doublons dans les tables principale et secondaires - verification que les doublons sont correctement detectees Autres tests effectues a la main, sur des cas plus volumineux, ou avec une seule table avec cle, en mode Root ou non Tests complets sur LearningTest Les commits de type "Improve terminology between root and main in..." ne concernent que du renommage, sans aucun impact sur le code: - ils peuvent etre survoles lors du review - ils pourraient etre fusionnes en un seul commit --- .../KDMultiTableFeatureConstruction.cpp | 2 +- .../KDMultiTableFeatureConstruction.h | 4 +- .../KDTextFeatureConstruction.h | 6 +- .../KNITransfer/KNIDatabaseTransferView.cpp | 2 +- src/Learning/KWData/KWAttribute.h | 2 +- src/Learning/KWData/KWClass.cpp | 2 +- src/Learning/KWData/KWClass.h | 7 +- src/Learning/KWData/KWClassDomain.cpp | 4 +- src/Learning/KWData/KWClassDomain.h | 2 +- src/Learning/KWData/KWDataTableDriver.cpp | 4 +- src/Learning/KWData/KWDataTableDriver.h | 8 +- .../KWData/KWDataTableDriverTextFile.cpp | 88 +++++++++---------- .../KWData/KWDataTableDriverTextFile.h | 10 +-- src/Learning/KWData/KWDatabase.cpp | 8 +- src/Learning/KWData/KWMTDatabase.cpp | 62 ++++++------- src/Learning/KWData/KWMTDatabase.h | 6 +- src/Learning/KWData/KWMTDatabaseMapping.h | 2 +- src/Learning/KWData/KWMTDatabaseTextFile.cpp | 10 +-- .../KWData/KWRelationCreationRule.cpp | 2 +- .../KWDataUtils/KWDatabaseIndexer.cpp | 2 +- src/Learning/KWDataUtils/KWDatabaseIndexer.h | 2 +- src/Learning/KWDataUtils/KWDatabaseTask.cpp | 36 ++++---- src/Learning/KWDataUtils/KWDatabaseTask.h | 8 +- .../KWDataUtils/KWKeyPositionFinderTask.cpp | 2 +- .../KWDataUtils/KWTestDatabaseTransfer.cpp | 2 +- .../KWDataUtils/PLDataTableDriverTextFile.cpp | 12 +-- .../KWDataUtils/PLDataTableDriverTextFile.h | 10 +-- .../KWDataUtils/PLMTDatabaseTextFile.cpp | 62 ++++++------- .../KWDataUtils/PLMTDatabaseTextFile.h | 7 +- 29 files changed, 188 insertions(+), 186 deletions(-) diff --git a/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.cpp b/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.cpp index dde1b66a1..45c9ba200 100644 --- a/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.cpp +++ b/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.cpp @@ -1591,7 +1591,7 @@ void KDMultiTableFeatureConstruction::ComputeAllClassesCompliantRules( // On interdit les cles de la classe // De facon generale, il s'agit d'un principe: la cle ne sert qu'a encoder une structure et la - // memoriser: il ne s'agit pas d'attributs porteurs d'information. Pour la classe racine, les cle + // memoriser: il ne s'agit pas d'attributs porteurs d'information. Pour la classe principale, les cle // apparaissent une seule fois instance, et ne peuvent etre informatives. Pour les classes secondaires // inclues, les cles sont soient unique par instance principale (la cle de l'incluant) sans interet, // soit avec un role d'identifiant dans la table secondaire, sans interet autre que compter le nombre diff --git a/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.h b/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.h index 701c8f6e5..803619ad2 100644 --- a/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.h +++ b/src/Learning/KDDomainKnowledge/KDMultiTableFeatureConstruction.h @@ -214,7 +214,7 @@ class KDMultiTableFeatureConstruction : public KDFeatureConstruction // . templateDerivationRule: regle de derivation en cours de construction, selon les parametres de // construction // - controle de la profondeur d'extraction - // . sPriorTreeNodeName: identifiant du noeud de l'arbre de construction a partir de la racine + // . sPriorTreeNodeName: identifiant du noeud de l'arbre de construction a partir de la classe principale // Utilise si non vide, pour indiquer qu'une trace de debugging est demandee // . nDepth: profondeur dans l'arbre de construction, limite par la variable externe nMaxRuleDepth // . dRuleCost: cout de la regle en cours de construction, limite par la variable externe dMaxRuleCost @@ -390,7 +390,7 @@ class KDMultiTableFeatureConstruction : public KDFeatureConstruction // . nSelectionSize: taille de selection // . nMaxSelectionOperandNumber: nombre max d'operandes a constuire // . dMaxSelectionCost: cout maximum de selection - // . sPriorTreeNodeName: identifiant du noeud de l'arbre de construction a partir de la racine + // . sPriorTreeNodeName: identifiant du noeud de l'arbre de construction a partir de la classe principale // Utilise si non vide, pour indiquer qu'une trace de debugging est demandee // . oaSelectionOperands: tableau des dimensions de partition (KDClassSelectionOperandStats: attribut ou regle) // utilisables en operandes de selection . oaSelectionOperandIndexedFrequencies: tableau des effectif indexes diff --git a/src/Learning/KDDomainKnowledge/KDTextFeatureConstruction.h b/src/Learning/KDDomainKnowledge/KDTextFeatureConstruction.h index cacfce168..4b7f21a91 100644 --- a/src/Learning/KDDomainKnowledge/KDTextFeatureConstruction.h +++ b/src/Learning/KDDomainKnowledge/KDTextFeatureConstruction.h @@ -135,9 +135,9 @@ class KDTextFeatureConstruction : public KDFeatureConstruction ObjectDictionary* odConstructedAttributes) const; // Construction d'un attribut de type texte a partir d'un chemin d'attribut dans un schema multi-table - // L'attribut construit est insere en unused dans la classe et permet de ramener a la racine l'attribut - // texte correspondant au chemin d'attribut, avec le type Text ou TextList selon la nature simple ou multiple du - // chemin + // L'attribut construit est insere en unused dans la classe et permet de ramener a la classe principale + // l'attribut texte correspondant au chemin d'attribut, avec le type Text ou TextList selon la + // nature simple ou multiple du chemin KWAttribute* ConstructPathAttribute(KDClassCompliantRules* classCompliantRules, KWClass* kwcClass, const KDTextAttributePath* textAttributePath) const; diff --git a/src/Learning/KNITransfer/KNIDatabaseTransferView.cpp b/src/Learning/KNITransfer/KNIDatabaseTransferView.cpp index 700d7f142..70948d219 100644 --- a/src/Learning/KNITransfer/KNIDatabaseTransferView.cpp +++ b/src/Learning/KNITransfer/KNIDatabaseTransferView.cpp @@ -76,7 +76,7 @@ void KNIDatabaseTransferView::KNITransferDatabase() // Recopie des caracteristiques de la table principale ou des tables secondaires else { - // Cas du mapping racine (premier des mapping) + // Cas du mapping principal (premier des mappings) if (nMapping == 0) { strcpy(recodingOperands.InputFile.DataPath, ""); diff --git a/src/Learning/KWData/KWAttribute.h b/src/Learning/KWData/KWAttribute.h index 059bf6858..3b20a81ec 100644 --- a/src/Learning/KWData/KWAttribute.h +++ b/src/Learning/KWData/KWAttribute.h @@ -214,7 +214,7 @@ class KWAttribute : public KWDataItem // Ecriture si necessaire des informations prives dans les meta-data (_NotLoaded) void WritePrivateMetaData(ostream& ost) const; - // Lecture et prise en compte des l'informations privees depuis les meta-data et nettoyage de ceux-ci + // Lecture et prise en compte des informations privees depuis les meta-data et nettoyage de ceux-ci void ReadPrivateMetaData(); // Bloc d'attribut eventuel auquel l'attribut appartient diff --git a/src/Learning/KWData/KWClass.cpp b/src/Learning/KWData/KWClass.cpp index d3667ef2d..a99773fcd 100644 --- a/src/Learning/KWData/KWClass.cpp +++ b/src/Learning/KWData/KWClass.cpp @@ -371,7 +371,7 @@ void KWClass::IndexClass() ivUsedDenseAttributeNumbers.Initialize(); ivUsedSparseAttributeNumbers.Initialize(); - // Il y a unicite dans le cas d'une classe racine, ou si l'unicite est forcee + // A priori, il y a unicite dans le cas d'une classe racine, ou si l'unicite est forcee (cf methode SetForceUnique) bIsUnique = bRoot or bForceUnique; // Indexage des tableaux d'attributs par parcours de la liste diff --git a/src/Learning/KWData/KWClass.h b/src/Learning/KWData/KWClass.h index d860a2c8a..6f9da1bcc 100644 --- a/src/Learning/KWData/KWClass.h +++ b/src/Learning/KWData/KWClass.h @@ -580,7 +580,7 @@ class KWClass : public Object // Ecriture si necessaire des informations prives dans les meta-data (_ForceUnique, plus celles des attributs) void WritePrivateMetaData(ostream& ost) const; - // Lecture et prise en compte des l'informations privees depuis les meta-data et nettoyage de ceux-ci + // Lecture et prise en compte des informations privees depuis les meta-data et nettoyage de ceux-ci void ReadPrivateMetaData(); // Nom de la classe @@ -598,7 +598,10 @@ class KWClass : public Object // Statut unique force boolean bForceUnique; - // Statut unique: racine, ou ayant des attribut relation natifs, imposant l'unicite + // Statut unique: + // - racine: unicite necessaire pour les references aux tables externes + // - classe ayant des attribut relation natifs: unicite necessaire pour que chaque + // enregistrement secondaire soit rattache de facon unique a son enregistrement parent boolean bIsUnique; // Nom des attributs cles (potentiellement specifies avant la specification des attributs de la classe) diff --git a/src/Learning/KWData/KWClassDomain.cpp b/src/Learning/KWData/KWClassDomain.cpp index 5c61c4484..4f8c3c0d6 100644 --- a/src/Learning/KWData/KWClassDomain.cpp +++ b/src/Learning/KWData/KWClassDomain.cpp @@ -770,7 +770,7 @@ KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* mainClass) const kwcdClone->usName = usName; kwcdClone->usLabel = usLabel; - // Duplication de la classe racine + // Duplication de la classe principale kwcCloneElement = mainClass->Clone(); kwcdClone->InsertClass(kwcCloneElement); oaImpactedClasses.Add(kwcCloneElement); @@ -892,7 +892,7 @@ void KWClassDomain::ComputeClassDependence(const KWClass* mainClass, ObjectDicti require(mainClass->GetDomain() == this); require(odDependentClasses != NULL); - // Enregistrement de la classe racine + // Enregistrement de la classe principale // (en la castant, pour contourner le const du parametre) odDependentClasses->RemoveAll(); odDependentClasses->SetAt(mainClass->GetName(), cast(KWClass*, mainClass)); diff --git a/src/Learning/KWData/KWClassDomain.h b/src/Learning/KWData/KWClassDomain.h index 190b92655..d91b7da45 100644 --- a/src/Learning/KWData/KWClassDomain.h +++ b/src/Learning/KWData/KWClassDomain.h @@ -138,7 +138,7 @@ class KWClassDomain : public Object // Le domaine source est vide a l'issue de l'import void ImportDomain(KWClassDomain* kwcdInputDomain, const ALString& sClassPrefix, const ALString& sClassSuffix); - // Calcul de l'ensemble des classes (y compris la racine) dependante d'une classe + // Calcul de l'ensemble des classes (y compris la classe principale) dependante d'une classe // Le resultat est un dictionnaire referencant les classes resultats par leur nom void ComputeClassDependence(const KWClass* mainClass, ObjectDictionary* odDependentClasses) const; diff --git a/src/Learning/KWData/KWDataTableDriver.cpp b/src/Learning/KWData/KWDataTableDriver.cpp index fbc2b67f3..7e88caecd 100644 --- a/src/Learning/KWData/KWDataTableDriver.cpp +++ b/src/Learning/KWData/KWDataTableDriver.cpp @@ -178,9 +178,9 @@ KWObject* KWDataTableDriver::Read() void KWDataTableDriver::Skip() {} -const KWObjectKey* KWDataTableDriver::GetLastReadRootKey() const +const KWObjectKey* KWDataTableDriver::GetLastReadMainKey() const { - return &lastReadRootKey; + return &lastReadMainKey; } void KWDataTableDriver::Write(const KWObject* kwoObject) diff --git a/src/Learning/KWData/KWDataTableDriver.h b/src/Learning/KWData/KWDataTableDriver.h index 5e194b98d..d22423de5 100644 --- a/src/Learning/KWData/KWDataTableDriver.h +++ b/src/Learning/KWData/KWDataTableDriver.h @@ -164,10 +164,10 @@ class KWDataTableDriver : public Object // Lecture sans production d'un objet physique, pour sauter un enregistrement virtual void Skip(); - // Cle du dernier objet lu physiquement, uniquement dans le cas d'une classe racine + // Cle du dernier objet lu physiquement, uniquement dans le cas d'une classe principale d'un schema multi-table // Permet de verifier l'ordre et la duplication des instances dans le fichier // Mise a jour apres toute analyse d'une ligne, soit par Skip ou par Read (meme si la lecture echoue) - virtual const KWObjectKey* GetLastReadRootKey() const; + virtual const KWObjectKey* GetLastReadMainKey() const; // Ecriture d'une instance (de la classe initiale) virtual void Write(const KWObject* kwoObject); @@ -227,8 +227,8 @@ class KWDataTableDriver : public Object ALString sDataTableName; const KWClass* kwcClass; - // Cle correspondant a la derniere ligne lue, dans le cas d'une classe racine - KWObjectKey lastReadRootKey; + // Cle correspondant a la derniere ligne lue, dans le cas d'une classe principale d'un schema multi-table + KWObjectKey lastReadMainKey; // Des entiers long sont utilises, pour la gestion de fichiers ayant // potentiellement plus de deux milliards d'enregistrements (limite des int) diff --git a/src/Learning/KWData/KWDataTableDriverTextFile.cpp b/src/Learning/KWData/KWDataTableDriverTextFile.cpp index e269ca5af..97982d73d 100644 --- a/src/Learning/KWData/KWDataTableDriverTextFile.cpp +++ b/src/Learning/KWData/KWDataTableDriverTextFile.cpp @@ -323,11 +323,11 @@ KWObject* KWDataTableDriverTextFile::Read() } // Reinitialisation des champ de la derniere cle lue si necessaire - assert(kwcClass->GetRoot() == (ivRootKeyIndexes.GetSize() > 0)); - if (lastReadRootKey.GetSize() > 0) + assert(kwcClass->IsUnique() == (ivMainKeyIndexes.GetSize() > 0)); + if (lastReadMainKey.GetSize() > 0) { - assert(livDataItemLoadIndexes.GetSize() == ivRootKeyIndexes.GetSize()); - lastReadRootKey.Initialize(); + assert(livDataItemLoadIndexes.GetSize() == ivMainKeyIndexes.GetSize()); + lastReadMainKey.Initialize(); } // Lecture des champs de la ligne @@ -400,13 +400,13 @@ KWObject* KWDataTableDriverTextFile::Read() // Alimentation des champs de la derniere cle lue si necessaire // On le fait avant l'analyse des champs, car on doit collecter les champs de la cle // independament des erreurs - if (lastReadRootKey.GetSize() > 0) + if (lastReadMainKey.GetSize() > 0) { - if (nField < livDataItemLoadIndexes.GetSize() and ivRootKeyIndexes.GetAt(nField) >= 0) + if (nField < livDataItemLoadIndexes.GetSize() and ivMainKeyIndexes.GetAt(nField) >= 0) { // Les champs cles sont necessairement lu dans le cas d'un driver physique de classe assert(liLoadIndex.IsValid()); - lastReadRootKey.SetAt(ivRootKeyIndexes.GetAt(nField), Symbol(sField, nFieldLength)); + lastReadMainKey.SetAt(ivMainKeyIndexes.GetAt(nField), Symbol(sField, nFieldLength)); } } @@ -597,10 +597,10 @@ void KWDataTableDriverTextFile::Skip() require(not bWriteMode); require(inputBuffer != NULL); - // Cas d'une classe racine - assert(kwcClass->GetRoot() == (ivRootKeyIndexes.GetSize() > 0)); - if (ivRootKeyIndexes.GetSize() > 0) - SkipRootRecord(); + // Cas d'une classe principale + assert(kwcClass->IsUnique() == (ivMainKeyIndexes.GetSize() > 0)); + if (ivMainKeyIndexes.GetSize() > 0) + SkipMainRecord(); // Cas standard else { @@ -1452,10 +1452,10 @@ void KWDataTableDriverTextFile::SetSilentMode(boolean bValue) outputBuffer->SetSilentMode(GetSilentMode()); } -void KWDataTableDriverTextFile::SkipRootRecord() +void KWDataTableDriverTextFile::SkipMainRecord() { char* sField; - int nRootKeyIndex; + int nMainKeyIndex; int nKeyFieldNumber; boolean bEndOfLine; boolean bLineTooLong; @@ -1467,11 +1467,11 @@ void KWDataTableDriverTextFile::SkipRootRecord() require(inputBuffer != NULL); require(not IsEnd()); require(not inputBuffer->IsBufferEnd()); - assert(kwcClass->GetRoot() == (ivRootKeyIndexes.GetSize() > 0)); + assert(kwcClass->IsUnique() == (ivMainKeyIndexes.GetSize() > 0)); // Reinitialisation des champ de la derniere cle lue si necessaire - assert(livDataItemLoadIndexes.GetSize() == ivRootKeyIndexes.GetSize()); - lastReadRootKey.Initialize(); + assert(livDataItemLoadIndexes.GetSize() == ivMainKeyIndexes.GetSize()); + lastReadMainKey.Initialize(); // Saut d'une ligne if (not IsEnd() and not IsError()) @@ -1487,13 +1487,13 @@ void KWDataTableDriverTextFile::SkipRootRecord() while (not bEndOfLine) { // Analyse du champ si son index ne depasse pas le nombre de colonnes de l'entete et est utilise - nRootKeyIndex = -1; - if (nField < ivRootKeyIndexes.GetSize()) - nRootKeyIndex = ivRootKeyIndexes.GetAt(nField); + nMainKeyIndex = -1; + if (nField < ivMainKeyIndexes.GetSize()) + nMainKeyIndex = ivMainKeyIndexes.GetAt(nField); // On ne retient que les attributs ou blocs reconnus et non calcules // On lit toujours le premier champ pour detecter les lignes vides - if (nRootKeyIndex >= 0 or nField == 0) + if (nMainKeyIndex >= 0 or nField == 0) bEndOfLine = inputBuffer->GetNextField(sField, nFieldLength, nFieldError, bLineTooLong); else bEndOfLine = inputBuffer->SkipField(bLineTooLong); @@ -1503,9 +1503,9 @@ void KWDataTableDriverTextFile::SkipRootRecord() break; // Alimentation des champs de la derniere cle lue si necessaire - if (nRootKeyIndex >= 0) + if (nMainKeyIndex >= 0) { - lastReadRootKey.SetAt(ivRootKeyIndexes.GetAt(nField), Symbol(sField, nFieldLength)); + lastReadMainKey.SetAt(ivMainKeyIndexes.GetAt(nField), Symbol(sField, nFieldLength)); nKeyFieldNumber++; // Arret si on a lu tous les champs de la cle @@ -1520,7 +1520,7 @@ void KWDataTableDriverTextFile::SkipRootRecord() // On ignore les lignes trop longues if (bLineTooLong) { - lastReadRootKey.Initialize(); + lastReadMainKey.Initialize(); AddWarning("Ignored record, " + InputBufferedFile::GetLineTooLongErrorLabel()); } @@ -1620,13 +1620,13 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc require(kwcHeaderLineClass != NULL or not GetHeaderLineUsed()); require(kwcHeaderLineClass == NULL or GetHeaderLineUsed()); - // Initialisation pour le calcul des index des attributs cles que dans le cas d'une classe racine - ivRootKeyIndexes.SetSize(0); - lastReadRootKey.SetSize(0); - if (kwcLogicalClass->GetRoot()) + // Initialisation pour le calcul des index des attributs cles que dans le cas d'une classe principale + ivMainKeyIndexes.SetSize(0); + lastReadMainKey.SetSize(0); + if (kwcLogicalClass->IsUnique()) { - // Creation d'un objet pour accuillir les champ de la cle - lastReadRootKey.SetSize(kwcLogicalClass->GetKeyAttributeNumber()); + // Creation d'un objet pour accueillir les champs de la cle + lastReadMainKey.SetSize(kwcLogicalClass->GetKeyAttributeNumber()); // Creation d'un dictionnaire qui a chaque attribut de la cle associe son index for (i = 0; i < kwcLogicalClass->GetKeyAttributeNumber(); i++) @@ -1778,10 +1778,10 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc } // Calcul des index des attribut de la cle - if (bOk and kwcLogicalClass->GetRoot()) + if (bOk and kwcLogicalClass->IsUnique()) { // Initialisation - ivRootKeyIndexes.SetSize(kwcHeaderLineClass->GetUsedAttributeNumber()); + ivMainKeyIndexes.SetSize(kwcHeaderLineClass->GetUsedAttributeNumber()); // Parcours des champs de l'entete for (i = 0; i < kwcHeaderLineClass->GetUsedAttributeNumber(); i++) @@ -1793,9 +1793,9 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc cast(IntObject*, odKeyFieldIndexes.Lookup(headerLineAttribute->GetName())); // Indexation eventuelle dans le cas d'un attribut de la cle - ivRootKeyIndexes.SetAt(i, -1); + ivMainKeyIndexes.SetAt(i, -1); if (keyFieldIndex != NULL) - ivRootKeyIndexes.SetAt(i, keyFieldIndex->GetInt()); + ivMainKeyIndexes.SetAt(i, keyFieldIndex->GetInt()); } } } @@ -1872,10 +1872,10 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc } // Calcul des index des attribut de la cle - if (bOk and kwcLogicalClass->GetRoot()) + if (bOk and kwcLogicalClass->IsUnique()) { // Initialisation - ivRootKeyIndexes.SetSize(oaNativeLogicalDataItems.GetSize()); + ivMainKeyIndexes.SetSize(oaNativeLogicalDataItems.GetSize()); // Parcours des champs logiques livDataItemLoadIndexes.SetSize(oaNativeLogicalDataItems.GetSize()); @@ -1888,9 +1888,9 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc keyFieldIndex = cast(IntObject*, odKeyFieldIndexes.Lookup(logicalDataItem->GetName())); // Indexation eventuelle dans le cas d'un attribut de la cle - ivRootKeyIndexes.SetAt(i, -1); + ivMainKeyIndexes.SetAt(i, -1); if (keyFieldIndex != NULL) - ivRootKeyIndexes.SetAt(i, keyFieldIndex->GetInt()); + ivMainKeyIndexes.SetAt(i, keyFieldIndex->GetInt()); } } } @@ -1933,16 +1933,16 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc } // Affichage des correspondances entre champs de la cle et leur index dans le fichier - if (kwcClass->GetRoot()) + if (kwcClass->IsUnique()) { - cout << "Compute root key indexes of dictionary " << kwcClass->GetName() << endl; - for (i = 0; i < ivRootKeyIndexes.GetSize(); i++) + cout << "Compute main key indexes of dictionary " << kwcClass->GetName() << endl; + for (i = 0; i < ivMainKeyIndexes.GetSize(); i++) { - if (ivRootKeyIndexes.GetAt(i) != -1) + if (ivMainKeyIndexes.GetAt(i) != -1) { cout << "\t" - << "Key" << ivRootKeyIndexes.GetAt(i) + 1 << "\t" - << kwcLogicalClass->GetKeyAttributeNameAt(ivRootKeyIndexes.GetAt(i)) + << "Key" << ivMainKeyIndexes.GetAt(i) + 1 << "\t" + << kwcLogicalClass->GetKeyAttributeNameAt(ivMainKeyIndexes.GetAt(i)) << "\t" << i << endl; } } @@ -1953,7 +1953,7 @@ boolean KWDataTableDriverTextFile::ComputeDataItemLoadIndexes(const KWClass* kwc if (kwcHeaderLineClass != NULL) cout << "Header line class\n" << *kwcHeaderLineClass << endl; } - assert(not bOk or lastReadRootKey.GetSize() > 0 or not kwcClass->GetRoot()); + assert(not bOk or lastReadMainKey.GetSize() > 0 or not kwcClass->IsUnique()); return bOk; } diff --git a/src/Learning/KWData/KWDataTableDriverTextFile.h b/src/Learning/KWData/KWDataTableDriverTextFile.h index b82c5dc03..af05a1382 100644 --- a/src/Learning/KWData/KWDataTableDriverTextFile.h +++ b/src/Learning/KWData/KWDataTableDriverTextFile.h @@ -125,9 +125,9 @@ class KWDataTableDriverTextFile : public KWDataTableDriver ///////////////////////////////////////////////// ///// Implementation protected: - // Implementation specifique du saut de ligne dans le cas d'une classe racine + // Implementation specifique du saut de ligne dans le cas d'une classe principale // En effet, dans ce cas, on analyse partiellement la ligne pour en extraire la derniere cle - void SkipRootRecord(); + void SkipMainRecord(); // Remplissage du buffer si necessaire (fin de buffer et pas fin de fichier) virtual boolean UpdateInputBuffer(); @@ -147,7 +147,7 @@ class KWDataTableDriverTextFile : public KWDataTableDriver // Calcul des indexes des data items (attributs ou blocs d'attributs) de la classe logique associee // a chaque champ du fichier en comparant la classe logique comportant les champs necessaires // et une classe representant le header du fichier a analyser (optionnelle si pas de ligne d'entete) - // On calcule egalement les index des attributs de la cle dans le cas d'un classe racine + // On calcule egalement les index des attributs de la cle dans le cas d'un classe principale virtual boolean ComputeDataItemLoadIndexes(const KWClass* kwcLogicalClass, const KWClass* kwcHeaderLineClass); // Ouverture du fichier en lecture ou ecriture: retourne true si OK @@ -172,14 +172,14 @@ class KWDataTableDriverTextFile : public KWDataTableDriver // Index invalide si champ du fichier inutilise ou inexistant dans la classe KWLoadIndexVector livDataItemLoadIndexes; - // Index des champs de la cle dans le cas d'une classe racine + // Index des champs de la cle dans le cas d'une classe principale d'un schema multi-table // A chaque index de champ de fichier, on associe soit -1 si le champ ne fait pas partie de la cle, // soit l'index du champs de la cle // On a en effet besoin de memoriser les champs de la cle dans ce cas, que ce soit lors des // lecture par Read (que l'enregistrement soit errone ou non) ou lors des sauts de ligne // C'est necessaire pour faire le controle des enregistrements dupliques, et de ne garder // que le premier (si valide), et ignorant tous les suivants consideres comme dupliques - IntVector ivRootKeyIndexes; + IntVector ivMainKeyIndexes; // Fichier utilise pour la gestion de la base InputBufferedFile* inputBuffer; diff --git a/src/Learning/KWData/KWDatabase.cpp b/src/Learning/KWData/KWDatabase.cpp index 4bc5903af..a3888725a 100644 --- a/src/Learning/KWData/KWDatabase.cpp +++ b/src/Learning/KWData/KWDatabase.cpp @@ -1481,7 +1481,7 @@ void KWDatabase::BuildPhysicalClass() kwcPhysicalClass = kwcdPhysicalDomain->LookupClass(GetClassName()); assert(kwcClass->GetLoadedAttributeNumber() == kwcPhysicalClass->GetLoadedAttributeNumber()); - // Initialisation de l'ensemble des classes physiques necessaires avec la classe physique "racine" + // Initialisation de l'ensemble des classes physiques necessaires avec la classe physique principale // Les classes physiques correspondent a tout ce qui doit etre lu physiquement directement ou indirectement // pour le calcul des regles de derivation nkdAllNeededClasses.SetAt(kwcPhysicalClass, kwcPhysicalClass); @@ -1530,7 +1530,7 @@ void KWDatabase::BuildPhysicalClass() } } - // Ajout des operandes utilise pour le calcul de l'attribut de selection pour la classe racine + // Ajout des operandes utilise pour le calcul de l'attribut de selection pour la classe principale if (kwcCurrentPhysicalClass == kwcPhysicalClass) { attribute = kwcPhysicalClass->LookupAttribute(GetSelectionAttribute()); @@ -1540,7 +1540,7 @@ void KWDatabase::BuildPhysicalClass() &nkdClassNeededAttributes); } - // Ajout de l'attribut de selection pour la classe racine + // Ajout de l'attribut de selection pour la classe principale if (kwcCurrentPhysicalClass == kwcPhysicalClass) { attribute = kwcPhysicalClass->LookupAttribute(GetSelectionAttribute()); @@ -1548,7 +1548,7 @@ void KWDatabase::BuildPhysicalClass() nkdAllNeededAttributes.SetAt(attribute, attribute); } - // Ajout de la cle pour toute classe chargeable depuis la classe racine + // Ajout de la cle pour toute classe chargeable depuis la classe principale for (i = 0; i < kwcCurrentPhysicalClass->GetKeyAttributeNumber(); i++) { keyAttribute = kwcCurrentPhysicalClass->GetKeyAttributeAt(i); diff --git a/src/Learning/KWData/KWMTDatabase.cpp b/src/Learning/KWData/KWMTDatabase.cpp index ff712a882..ccc180bba 100644 --- a/src/Learning/KWData/KWMTDatabase.cpp +++ b/src/Learning/KWData/KWMTDatabase.cpp @@ -28,7 +28,7 @@ KWMTDatabase::~KWMTDatabase() } assert(objectReferenceResolver.GetClassNumber() == 0); - // Destruction du mapping, y compris du mapping racine + // Destruction du mapping, y compris du mapping principal oaMultiTableMappings.DeleteAll(); // Destruction du driver @@ -66,10 +66,10 @@ void KWMTDatabase::CopyFrom(const KWDatabase* kwdSource) oaMultiTableMappings.Add(mapping->Clone()); } - // Memorisation du mapping racine + // Memorisation du mapping principal mainMultiTableMapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(0)); - // Memorisation des mapping racines des classes referencees + // Memorisation des mappings principaux des classes referencees oaRootRefTableMappings.SetSize(0); for (i = 0; i < kwmtdSource->oaRootRefTableMappings.GetSize(); i++) { @@ -82,7 +82,7 @@ void KWMTDatabase::CopyFrom(const KWDatabase* kwdSource) assert(mappingCopy->GetDataPathAttributeNames() == ""); assert(mappingCopy->GetDataPath() == mapping->GetDataPath()); - // Insertion dans le tableau des mappings racine des classes referencees + // Insertion dans le tableau des mappings principaux des classes referencees oaRootRefTableMappings.Add(mappingCopy); } @@ -231,8 +231,8 @@ boolean KWMTDatabase::IsReferencedClassMapping(const KWMTDatabaseMapping* mappin return (mapping->GetOriginClassName() != GetClassName()); } -// Fonction de comparaison sur le nom de la premiere classe (racine) d'un table de mapping -// Permet d'avoir les mappings tries selon leur classe racine +// Fonction de comparaison sur le nom de la premiere classe (principale) d'un table de mapping +// Permet d'avoir les mappings tries selon leur classe principale int KWMTDatabaseCompareMappingMainClass(const void* first, const void* second) { ObjectArray* aFirst; @@ -294,14 +294,14 @@ void KWMTDatabase::UpdateMultiTableMappings() // Si pas de dictionnaire associe, on nettoie le mapping if (mainClass == NULL) { - // Duplication prealable du mapping racine (sans les attributs de gestion) + // Duplication prealable du mapping principal (sans les attributs de gestion) mainMultiTableMapping = mainMultiTableMapping->Clone(); // Nettoyage oaMultiTableMappings.DeleteAll(); oaRootRefTableMappings.SetSize(0); - // On rajoute le mapping racine + // On rajoute le mapping principal oaMultiTableMappings.Add(mainMultiTableMapping); } // Sinon, parcours des champs du dictionnaire pour rechercher les mappings a specifier @@ -349,7 +349,7 @@ void KWMTDatabase::UpdateMultiTableMappings() i++; } - // Tri des tableau de mappings de classes references selon leur classe racine + // Tri des tableau de mappings de classes references selon leur classe principal oaAllMainCreatedMappings.SetCompareFunction(KWMTDatabaseCompareMappingMainClass); oaAllMainCreatedMappings.Sort(); @@ -370,9 +370,9 @@ void KWMTDatabase::UpdateMultiTableMappings() // On recupere si possible les specifications de base a utiliser a partir des mapping precedents // // Attention, il s'agit juste d'une heuristique pour ameliorer l'ergonomie, qui a minima permet - // de recuperer toutes les specifcations de data tables existantes au cas ou on relit le + // de recuperer toutes les specifications de data tables existantes au cas ou on relit le // meme fichier de dictionnaire - // Pour la table-racine, on recupere quoi q'il arrive la data table precedente, en mono-table ou multi-table + // Pour la table principale, on recupere quoi qu'il arrive la data table precedente, en mono-table ou multi-table // Cela permet de rester sur le meme fichier dans le cas ou on passe d'un dictionnaire (ex: Iris) // a sa variante de type modele de prediction (ex: SNB_Iris) // L'implementation marche egalement en multi-table quand on choisit un dictionnaire racine de table externe, @@ -504,7 +504,7 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const mapping->GetDataTableName() + " should not be specified for output database"); } - // Recherche de la classe racine du chemin de mapping + // Recherche de la classe principale du chemin de mapping originClass = KWClassDomain::GetCurrentDomain()->LookupClass(mapping->GetOriginClassName()); assert(originClass->GetName() == GetClassName() or originClass->GetRoot()); @@ -772,7 +772,7 @@ longint KWMTDatabase::ComputeOpenNecessaryMemory(boolean bRead, boolean bIncludi // Nettoyage prealable DMTMPhysicalTerminateMapping(mainMultiTableMapping); - // Initialisation recursive du mapping a partir de la racine pour avoir des driver initialises + // Initialisation recursive du mapping a partir de la table principale pour avoir des driver initialises if (bRead) { // En lecture, on utilise la classe physique @@ -986,10 +986,10 @@ boolean KWMTDatabase::PhysicalOpenForRead() // Ouverture si Ok if (bOk) { - // Initialisation recursive du mapping a partir de la racine + // Initialisation recursive du mapping a partir de la table principale DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcPhysicalClass, true); - // Ouverture recursive des tables a partir de la table racine + // Ouverture recursive des tables a partir de la table principale if (bOk) bOk = DMTMPhysicalOpenForRead(mainMultiTableMapping, kwcClass); @@ -1010,10 +1010,10 @@ boolean KWMTDatabase::PhysicalOpenForWrite() DMTMPhysicalTerminateMapping(mainMultiTableMapping); nSkippedRecordNumber = 0; - // Initialisation recursive du mapping a partir de la racine + // Initialisation recursive du mapping a partir de la table principale DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcClass, false); - // Ouverture recursive des tables a partir de la table racine + // Ouverture recursive des tables a partir de la table principale bOk = DMTMPhysicalOpenForWrite(mainMultiTableMapping); return bOk; } @@ -1171,17 +1171,17 @@ void KWMTDatabase::PhysicalSkip() mainMultiTableMapping->GetDataTableDriver()->Skip(); bIsError = bIsError or mainMultiTableMapping->GetDataTableDriver()->IsError(); - // Memorisation inconditionnelle de la cle du dernier enregistremnt lu, dans le cas d'une classe racine, + // Memorisation inconditionnelle de la cle du dernier enregistremnt lu, dans le cas d'une classe principale, // meme si l'objet n'a pas pu etre lu // Cela permet de gere les lignes dupliquees, que l'objet soit lu ou non (a cause d'une erreur de parsing) assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetName() == kwcClass->GetName()); assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetRoot() == kwcClass->GetRoot()); - if (kwcClass->GetRoot()) + if (kwcClass->IsUnique()) { - assert(mainMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()->GetSize() == + assert(mainMultiTableMapping->GetDataTableDriver()->GetLastReadMainKey()->GetSize() == mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); mainMultiTableMapping->SetLastReadKey( - mainMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()); + mainMultiTableMapping->GetDataTableDriver()->GetLastReadMainKey()); } // Attention, il n'est pas possible de propager les skip sur les sous-tables @@ -1226,7 +1226,7 @@ longint KWMTDatabase::GetPhysicalEstimatedObjectNumber() require(mainMultiTableMapping->GetDataTableDriver() == NULL); - // Parametrage du mapping racine + // Parametrage du mapping principal mainMultiTableMapping->SetDataTableDriver(CreateDataTableDriver(mainMultiTableMapping)); mainMultiTableMapping->GetDataTableDriver()->SetDataTableName(mainMultiTableMapping->GetDataTableName()); mainMultiTableMapping->GetDataTableDriver()->SetClass( @@ -1566,10 +1566,10 @@ boolean KWMTDatabase::PhysicalReadAllReferenceObjects(double dSamplePercentage) // Nettoyage prealable DMTMPhysicalTerminateMapping(referenceMapping); - // Initialisation recursive du mapping a partir de la racine + // Initialisation recursive du mapping a partir de la table principale DMTMPhysicalInitializeMapping(referenceMapping, kwcReferencePhysicalClass, true); - // Ouverture recursive des tables a partir de la table racine, si sa cle est chargee + // Ouverture recursive des tables a partir de la table principale, si sa cle est chargee // Les etapes precedentes ont determine si la table etait utile, et dans le cas inverse // la cle n'est pas chargee if (referenceMapping->GetDataTableDriver()->GetDataTableName() != "" and @@ -1865,7 +1865,7 @@ longint KWMTDatabase::ComputeNecessaryMemoryForReferenceObjects() // Nettoyage prealable DMTMPhysicalTerminateMapping(referenceMapping); - // Initialisation recursive du mapping a partir de la racine + // Initialisation recursive du mapping a partir de la table principale DMTMPhysicalInitializeMapping(referenceMapping, kwcReferencePhysicalClass, true); // Collecte de tous les mapping de la hierarchie de composition @@ -2273,16 +2273,16 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) // Positionnement du flag d'erreur bIsError = bIsError or mapping->GetDataTableDriver()->IsError(); - // Memorisation inconditionnelle de la cle du dernier enregistremnt lu, dans le cas d'une classe racine, + // Memorisation inconditionnelle de la cle du dernier enregistremnt lu, dans le cas d'une classe unique, // meme si l'objet n'a pas pu etre lu // Cela permet de gere les lignes dupliquees, que l'objet soit lu ou non (a cause d'une erreur de parsing) if (kwoObject == NULL) { - if (mapping->GetDataTableDriver()->GetClass()->GetRoot()) + if (mapping->GetDataTableDriver()->GetClass()->IsUnique()) { - assert(mapping->GetDataTableDriver()->GetLastReadRootKey()->GetSize() == + assert(mapping->GetDataTableDriver()->GetLastReadMainKey()->GetSize() == mapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); - mapping->SetLastReadKey(mapping->GetDataTableDriver()->GetLastReadRootKey()); + mapping->SetLastReadKey(mapping->GetDataTableDriver()->GetLastReadMainKey()); } return NULL; } @@ -2304,7 +2304,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) { assert(mapping->GetDataTableDriver()->GetRecordIndex() > 1); - // Warning si la cle egale dans le cas d'une classe racine, et supression de + // Warning si la cle egale dans le cas d'une classe principale, et supression de // l'enregistrement if (kwoObject->GetClass()->IsUnique() and objectKey.StrictCompare(mapping->GetLastReadKey()) == 0) @@ -2343,7 +2343,7 @@ KWObject* KWMTDatabase::DMTMPhysicalRead(KWMTDatabaseMapping* mapping) return NULL; // Incrementation du compteur d'objet utilise au niveau physique pour la classe principale - // L'incrementation pour les mapping de la composiitonn est effectuee par la suite + // L'incrementation pour les mappings de la composition est effectuee par la suite if (mapping == mainMultiTableMapping) mapping->GetDataTableDriver()->SetUsedRecordNumber( mapping->GetDataTableDriver()->GetUsedRecordNumber() + 1); diff --git a/src/Learning/KWData/KWMTDatabase.h b/src/Learning/KWData/KWMTDatabase.h index f2085adfa..58d3b09b5 100644 --- a/src/Learning/KWData/KWMTDatabase.h +++ b/src/Learning/KWData/KWMTDatabase.h @@ -216,9 +216,9 @@ class KWMTDatabase : public KWDatabase ///////////////////////////////////////////////// // Attributs de l'implementation - // Mapping racine pour la table principale + // Mapping pour la table principale // Ce mapping doit toujours etre present et contient le parametrage (nom de base, nom de classe) principal - // L'utilisation d'un mapping pour la racine permet d'unifier les traitements entre tables principales + // L'utilisation d'un mapping pour la classe principale permet d'unifier les traitements entre tables principales // et tables secondaires mutable KWMTDatabaseMapping* mainMultiTableMapping; @@ -227,7 +227,7 @@ class KWMTDatabase : public KWDatabase mutable ObjectArray oaRootRefTableMappings; // Mapping multi-tables: tableau exhaustif de tous les mappings (permet une interface d'edition "a plat") - // Attention, le mapping racine est toujours integree comme premier element du tableau, + // Attention, le mapping de la classe principale est toujours integree comme premier element du tableau, // et ne doit toujours etre synchronise mutable ObjectArray oaMultiTableMappings; diff --git a/src/Learning/KWData/KWMTDatabaseMapping.h b/src/Learning/KWData/KWMTDatabaseMapping.h index e80aa26c6..555021d15 100644 --- a/src/Learning/KWData/KWMTDatabaseMapping.h +++ b/src/Learning/KWData/KWMTDatabaseMapping.h @@ -146,7 +146,7 @@ class KWMTDatabaseMapping : public Object ObjectArray* GetComponentTableMappings(); // Collecte de tous les mapping de la hierarchie de composition, - // y compris le mapping courant (racine de la hierarchie) + // y compris le mapping courant (mapping principal de la hierarchie) void CollectFullHierarchyComponentTableMappings(ObjectArray* oaResults); // Base de donnees associee au mapping diff --git a/src/Learning/KWData/KWMTDatabaseTextFile.cpp b/src/Learning/KWData/KWMTDatabaseTextFile.cpp index 19f30a8d7..dd11ecd0d 100644 --- a/src/Learning/KWData/KWMTDatabaseTextFile.cpp +++ b/src/Learning/KWData/KWMTDatabaseTextFile.cpp @@ -30,7 +30,7 @@ void KWMTDatabaseTextFile::AddPrefixToUsedFiles(const ALString& sPrefix) // Renommage si nom existant if (GetDatabaseName() != "") { - // Personnalisation des noms de table du mapping (qui comprennent la table racine) + // Personnalisation des noms de table du mapping (qui comprennent la table principale) for (nMapping = 0; nMapping < GetMultiTableMappings()->GetSize(); nMapping++) { mapping = cast(KWMTDatabaseMapping*, GetMultiTableMappings()->GetAt(nMapping)); @@ -64,7 +64,7 @@ void KWMTDatabaseTextFile::AddSuffixToUsedFiles(const ALString& sSuffix) // Renommage si nom existant if (GetDatabaseName() != "") { - // Personnalisation des noms de table du mapping (qui comprennent la table racine) + // Personnalisation des noms de table du mapping (qui comprennent la table principale) for (nMapping = 0; nMapping < GetMultiTableMappings()->GetSize(); nMapping++) { mapping = cast(KWMTDatabaseMapping*, GetMultiTableMappings()->GetAt(nMapping)); @@ -101,7 +101,7 @@ void KWMTDatabaseTextFile::AddPathToUsedFiles(const ALString& sPathName) // avec un fichier bidon en entree pour qu'il extrait correctement la path en entree resultFilePathBuilder.SetInputFilePathName(FileService::BuildFilePathName(sPathName, "dummy.txt")); - // Personnalisation des noms de table du mapping (qui comprennent la table racine) + // Personnalisation des chemins pour les tables du mapping (qui comprennent la table principale) for (nMapping = 0; nMapping < GetMultiTableMappings()->GetSize(); nMapping++) { mapping = cast(KWMTDatabaseMapping*, GetMultiTableMappings()->GetAt(nMapping)); @@ -130,7 +130,7 @@ void KWMTDatabaseTextFile::ExportUsedFileSpecs(ObjectArray* oaUsedFileSpecs) con // Appel de la methode ancetre KWMTDatabase::ExportUsedFileSpecs(oaUsedFileSpecs); - // Personnalisation des noms de table du mapping (hors table racine, deja traitee) + // Personnalisation des noms de table du mapping (hors table principale, deja traitee) for (nMapping = 1; nMapping < oaMultiTableMappings.GetSize(); nMapping++) { mapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(nMapping)); @@ -154,7 +154,7 @@ void KWMTDatabaseTextFile::ExportUsedWriteFileSpecs(ObjectArray* oaUsedFileSpecs // Appel de la methode ancetre KWMTDatabase::ExportUsedFileSpecs(oaUsedFileSpecs); - // Personnalisation des noms de table du mapping (hors table racine, deja traitee) + // Personnalisation des noms de table du mapping (hors table principale, deja traitee) for (nMapping = 1; nMapping < oaMultiTableMappings.GetSize(); nMapping++) { mapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(nMapping)); diff --git a/src/Learning/KWData/KWRelationCreationRule.cpp b/src/Learning/KWData/KWRelationCreationRule.cpp index 2e0672f57..fe6b3e9ba 100644 --- a/src/Learning/KWData/KWRelationCreationRule.cpp +++ b/src/Learning/KWData/KWRelationCreationRule.cpp @@ -499,7 +499,7 @@ boolean KWDRRelationCreationRule::CheckOperandsCompleteness(const KWClass* kwcOw kwcTargetClass = kwcOwnerClass->GetDomain()->LookupClass(GetObjectClassName()); assert(kwcTargetClass != NULL); - // La class cible ne doit pas etre Root + // La classe cible ne doit pas etre Root if (kwcTargetClass->GetRoot()) { AddError(sTmp + "Invalid output dictionary " + kwcTargetClass->GetName() + diff --git a/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp b/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp index 12853bd73..5086e2b70 100644 --- a/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp @@ -861,7 +861,7 @@ boolean KWDatabaseIndexer::ComputeMainTableIndexation() if (lMaxKeyNumber < 0) lMaxKeyNumber = 0; - // On limite ce nombre de cle on fonctioRate = 0; de la taille des fichiers a analyser + // On limite ce nombre de cle en fonction de la taille des fichiers a analyser // On utilise (lMaxFileSizePerProcess/8) pour la gestion de la fin des taches lMaxSlaveProcessNumber = 1 + GetMTDatabase()->GetTotalFileSize() / (lTotalFileSizePerProcess / 8); diff --git a/src/Learning/KWDataUtils/KWDatabaseIndexer.h b/src/Learning/KWDataUtils/KWDatabaseIndexer.h index e33948c45..0c044f44b 100644 --- a/src/Learning/KWDataUtils/KWDatabaseIndexer.h +++ b/src/Learning/KWDataUtils/KWDatabaseIndexer.h @@ -199,7 +199,7 @@ class KWDatabaseIndexer : public Object // Initialisation d'un indexeur de champ cle pour un index de table en entree // On n'indexe que les champs cles secondaire correspondant a ceux de la table principale, // Les champs cles secondaire sont potentiellement en positions differentes, de nom different - // et en nombre supperieur a ceux de la table principale. On n'indexe que ceux correspond + // et en nombre superieur a ceux de la table principale. On n'indexe que ceux qui correspondent // a la table principale (en meme nombre et dans le meme ordre) boolean InitializeKeyFieldIndexer(int nTableIndex, KWKeyFieldsIndexer* keyFieldsIndexer); diff --git a/src/Learning/KWDataUtils/KWDatabaseTask.cpp b/src/Learning/KWDataUtils/KWDatabaseTask.cpp index 191562837..46eae9afc 100644 --- a/src/Learning/KWDataUtils/KWDatabaseTask.cpp +++ b/src/Learning/KWDataUtils/KWDatabaseTask.cpp @@ -29,7 +29,7 @@ KWDatabaseTask::KWDatabaseTask() DeclareTaskInput(&input_lvChunkBeginPositions); DeclareTaskInput(&input_lvChunkEndPositions); DeclareTaskInput(&input_lvChunkPreviousRecordIndexes); - DeclareTaskInput(&input_ChunkLastRootKey); + DeclareTaskInput(&input_ChunkLastMainKey); DeclareTaskInput(&input_lFileBeginPosition); DeclareTaskInput(&input_lFileEndPosition); DeclareTaskInput(&input_lFilePreviousRecordIndex); @@ -260,7 +260,6 @@ boolean KWDatabaseTask::ComputeAllDataTableIndexation() KWFileIndexerTask fileIndexerTask; int nSlaveNumber; longint lMinSlaveGrantedMemoryForSourceDatabase; - ObjectArray oaRootKeys; ObjectArray oaAllTableFoundKeyPositions; Timer timer; @@ -511,8 +510,8 @@ boolean KWDatabaseTask::MasterPrepareTaskInput(double& dTaskPercent, boolean& bI // Cas multi-tables if (shared_sourceDatabase.GetDatabase()->IsMultiTableTechnology()) { - // Recopie de la cle racine - databaseChunkBuilder.GetChunkLastMainKeyAt(nChunkCurrentIndex, input_ChunkLastRootKey.GetKey()); + // Recopie de la cle principale + databaseChunkBuilder.GetChunkLastMainKeyAt(nChunkCurrentIndex, input_ChunkLastMainKey.GetKey()); // Recopie des vecteurs de position de debut et fin pour l'esclave databaseChunkBuilder.GetChunkPreviousRecordIndexesAt( @@ -752,7 +751,7 @@ boolean KWDatabaseTask::SlaveProcessStartDatabase() int i; KWMTDatabaseMapping* mapping; PLDataTableDriverTextFile* driver; - KWObjectKey lastRootObjectKey; + KWObjectKey lastMainObjectKey; InputBufferedFile* inputBuffer; boolean bLineTooLong; ALString sChunkFileName; @@ -776,14 +775,14 @@ boolean KWDatabaseTask::SlaveProcessStartDatabase() { sourceMTDatabase = shared_sourceDatabase.GetMTDatabase(); - // Parametrage de la derniere cle racine lue, apres avoir transforme la cle de fichier (KWKey) en cle + // Parametrage de la derniere cle principale lue, apres avoir transforme la cle de fichier (KWKey) en cle // d'objet (KWObjectKey) if (bOk) { - lastRootObjectKey.SetSize(input_ChunkLastRootKey.GetKey()->GetSize()); - for (i = 0; i < lastRootObjectKey.GetSize(); i++) - lastRootObjectKey.SetAt(i, (Symbol)input_ChunkLastRootKey.GetKey()->GetAt(i)); - sourceMTDatabase->SetLastReadRootKey(&lastRootObjectKey); + lastMainObjectKey.SetSize(input_ChunkLastMainKey.GetKey()->GetSize()); + for (i = 0; i < lastMainObjectKey.GetSize(); i++) + lastMainObjectKey.SetAt(i, (Symbol)input_ChunkLastMainKey.GetKey()->GetAt(i)); + sourceMTDatabase->SetLastReadMainKey(&lastMainObjectKey); } // Parcours des mapping pour lire les buffers en lecture @@ -852,7 +851,7 @@ boolean KWDatabaseTask::SlaveProcessStartDatabase() << "\t" << input_lvChunkPreviousRecordIndexes.GetAt(i) << "\t" << input_lvChunkBeginPositions.GetAt(i) << "\t" << input_lvChunkEndPositions.GetAt(i) << "\t" - << *input_ChunkLastRootKey.GetKey() << "\t" + << *input_ChunkLastMainKey.GetKey() << "\t" << sourceMTDatabase->GetBufferSize() << endl; } } @@ -925,10 +924,9 @@ boolean KWDatabaseTask::SlaveProcessExploitDatabase() longint lObjectNumber; longint lRecordNumber; KWMTDatabaseMapping* mapping; - KWObjectKey lastRootObjectKey; KWObject* kwoObject; ALString sChunkFileName; - PLDataTableDriverTextFile* rootDriver; + PLDataTableDriverTextFile* mainDriver; double dProgression; ALString sTmp; @@ -940,17 +938,17 @@ boolean KWDatabaseTask::SlaveProcessExploitDatabase() lRecordNumber = 0; if (bOk) { - // Dans le cas multi-tables, acces au driver de la table racine, pour la gestion de la progression - rootDriver = NULL; + // Dans le cas multi-tables, acces au driver de la table principale, pour la gestion de la progression + mainDriver = NULL; if (sourceDatabase->IsMultiTableTechnology()) { mapping = cast(KWMTDatabaseMapping*, shared_sourceDatabase.GetMTDatabase()->GetMultiTableMappings()->GetAt(0)); - rootDriver = shared_sourceDatabase.GetMTDatabase()->GetDriverAt(mapping); + mainDriver = shared_sourceDatabase.GetMTDatabase()->GetDriverAt(mapping); } - // Sinon, on prend le drive de la base mono-table + // Sinon, on prend le driver de la base mono-table else - rootDriver = shared_sourceDatabase.GetSTDatabase()->GetDriver(); + mainDriver = shared_sourceDatabase.GetSTDatabase()->GetDriver(); // Parcours des objets sources Global::ActivateErrorFlowControl(); @@ -960,7 +958,7 @@ boolean KWDatabaseTask::SlaveProcessExploitDatabase() if (TaskProgression::IsRefreshNecessary()) { // Avancement - dProgression = rootDriver->GetReadPercentage(); + dProgression = mainDriver->GetReadPercentage(); TaskProgression::DisplayProgression((int)floor(dProgression * 100)); // Message d'avancement, uniquement dans la premiere tache (la seule ou les comptes sont diff --git a/src/Learning/KWDataUtils/KWDatabaseTask.h b/src/Learning/KWDataUtils/KWDatabaseTask.h index 6142f208f..969564abe 100644 --- a/src/Learning/KWDataUtils/KWDatabaseTask.h +++ b/src/Learning/KWDataUtils/KWDatabaseTask.h @@ -100,7 +100,7 @@ class KWDatabaseTask : public PLParallelTask // On calcule d'abord les index de champ de chaque table en entree, ce qui permet de savoir quelle table doit // etre lue. On collecte un echantillon de cle de la table principale, ainsi que leur position pour chaque table // secondaire On determine alors un decoupage des tables pour les traitement par esclave En sortie, si OK, on a - // donc initialise les tableaux oaAllChunksBeginPos, oaAllChunksBeginRecordIndex, et oaAllChunksLastRootKeys + // donc initialise les tableaux oaAllChunksBeginPos, oaAllChunksBeginRecordIndex, et oaAllChunksLastMainKeys // Calcul du plan d'indexation global des bases pour le pilotage de la parallelisation // Erreur possible si pas assez de ressource par exemple @@ -224,7 +224,7 @@ class KWDatabaseTask : public PLParallelTask // . un vecteur de position de debut (comprises), // . un vecteur de position de fin (non comprises), // . un vecteur d'index de record de debut (en fait, le dernier index du troncon precedent) - // . la derniere cle racine du troncon precedent + // . la derniere cle principale du troncon precedent // La taille des vecteurs et egale au nombre de tables en entree // (les index des table non utilises sont ignores lors de traitements). @@ -240,8 +240,8 @@ class KWDatabaseTask : public PLParallelTask // Cf. variable oaAllChunksBeginRecordIndex du maitre PLShared_LongintVector input_lvChunkPreviousRecordIndexes; - // Cles racine de depart pour le traitement de l'esclave - PLShared_Key input_ChunkLastRootKey; + // Cles principale de depart pour le traitement de l'esclave + PLShared_Key input_ChunkLastMainKey; // Position de depart pour le pilotage de la lecture du fichier dans le cas mono-table PLShared_Longint input_lFileBeginPosition; diff --git a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp index cef45b788..b622816d2 100644 --- a/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp +++ b/src/Learning/KWDataUtils/KWKeyPositionFinderTask.cpp @@ -288,7 +288,7 @@ boolean KWKeyPositionFinderTask::TestWithArtificialMainAndSecondaryTables( << " Buffer(" << nBufferSize << ")" << endl; cout << "===============================================================================" << endl; - // Creation d'un fichier racine avec des champs cle + // Creation d'un fichier principal avec des champs cle mainArtificialDataset.SpecifySortedDataset(); mainArtificialDataset.SetLineNumber(nMainLineNumber); mainArtificialDataset.SetMaxLineNumberPerKey(nMainLineNumberPerKey); diff --git a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp index 44dd3d666..732652ea5 100644 --- a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp +++ b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp @@ -742,7 +742,7 @@ void KWTestDatabaseTransfer::MTTestWithArtificialDatabase(int nTableNumber, int if (nTableNumber >= 2) { // Utilisation de deux champs, avec la cle en fin - // pour perturber sa position par rapport a la table racine + // pour perturber sa position par rapport a la table principale artificialDataset = new KWArtificialDataset; oaArtificialDatasets.SetAt(nSecondary0nIndex, artificialDataset); timer.Reset(); diff --git a/src/Learning/KWDataUtils/PLDataTableDriverTextFile.cpp b/src/Learning/KWDataUtils/PLDataTableDriverTextFile.cpp index 557f6a9c6..1c9f5c641 100644 --- a/src/Learning/KWDataUtils/PLDataTableDriverTextFile.cpp +++ b/src/Learning/KWDataUtils/PLDataTableDriverTextFile.cpp @@ -226,19 +226,19 @@ KWLoadIndexVector* PLDataTableDriverTextFile::GetDataItemLoadIndexes() return &livDataItemLoadIndexes; } -const IntVector* PLDataTableDriverTextFile::GetConstRootKeyIndexes() const +const IntVector* PLDataTableDriverTextFile::GetConstMainKeyIndexes() const { - return &ivRootKeyIndexes; + return &ivMainKeyIndexes; } -IntVector* PLDataTableDriverTextFile::GetRootKeyIndexes() +IntVector* PLDataTableDriverTextFile::GetMainKeyIndexes() { - return &ivRootKeyIndexes; + return &ivMainKeyIndexes; } void PLDataTableDriverTextFile::InitializeLastReadKeySize(int nValue) { require(nValue >= 0); - lastReadRootKey.SetSize(nValue); - lastReadRootKey.Initialize(); + lastReadMainKey.SetSize(nValue); + lastReadMainKey.Initialize(); } diff --git a/src/Learning/KWDataUtils/PLDataTableDriverTextFile.h b/src/Learning/KWDataUtils/PLDataTableDriverTextFile.h index 947e2a7bd..2e00449f2 100644 --- a/src/Learning/KWDataUtils/PLDataTableDriverTextFile.h +++ b/src/Learning/KWDataUtils/PLDataTableDriverTextFile.h @@ -17,8 +17,8 @@ // La methode ComputeDataItemLoadIndexes permet de calculer les index (a faire dans le Master) // Les methodes GetConstDataItemLoadIndexes et GetDataItemLoadIndexes permettent de transmettre // l'index entre le maitre et les esclaves -// Dans le cas multi-table, les methodes GetConstRootKeyIndexes et GetRootKeyIndexes permettent -// de transmettre les index des attributs de la cle en cas de classe racine +// Dans le cas multi-table, les methodes GetConstMainKeyIndexes et GetMainKeyIndexes permettent +// de transmettre les index des attributs de la cle en cas de classe principale // Enfin, chaque process gere une portion de fichier comprise entre une position de debut et de fin, // qui peut potentiellement necessiter la lecture de plusieurs buffers pour etre traitee. class PLDataTableDriverTextFile : public KWDataTableDriverTextFile @@ -88,9 +88,9 @@ class PLDataTableDriverTextFile : public KWDataTableDriverTextFile const KWLoadIndexVector* GetConstDataItemLoadIndexes() const; KWLoadIndexVector* GetDataItemLoadIndexes(); - // Acces en lecture et ecriture aux index des attributs de la cle en cas de classe racine - const IntVector* GetConstRootKeyIndexes() const; - IntVector* GetRootKeyIndexes(); + // Acces en lecture et ecriture aux index des attributs de la cle en cas de classe principale + const IntVector* GetConstMainKeyIndexes() const; + IntVector* GetMainKeyIndexes(); // Initialisation de la taille de la derniere cle lu void InitializeLastReadKeySize(int nValue); diff --git a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp index 896bfe825..018bb6ec5 100644 --- a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp +++ b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.cpp @@ -32,7 +32,7 @@ PLMTDatabaseTextFile::~PLMTDatabaseTextFile() { oaUsedMappingHeaderLineClasses.DeleteAll(); oaIndexedMappingsDataItemLoadIndexes.DeleteAll(); - oaIndexedMappingsRootKeyIndexes.DeleteAll(); + oaIndexedMappingsMainKeyIndexes.DeleteAll(); } void PLMTDatabaseTextFile::Reset() @@ -40,7 +40,7 @@ void PLMTDatabaseTextFile::Reset() ivUsedMappingFlags.SetSize(0); oaUsedMappingHeaderLineClasses.DeleteAll(); oaIndexedMappingsDataItemLoadIndexes.DeleteAll(); - oaIndexedMappingsRootKeyIndexes.DeleteAll(); + oaIndexedMappingsMainKeyIndexes.DeleteAll(); lvFileSizes.SetSize(0); lTotalFileSize = 0; lTotalUsedFileSize = 0; @@ -60,7 +60,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc KWMTDatabaseMapping* outputMapping; PLDataTableDriverTextFile* driver; KWLoadIndexVector* livDataItemLoadIndexes; - IntVector* ivRootKeyIndexes; + IntVector* ivMainKeyIndexes; KWClass* kwcDriverLogicalClass; KWClass* kwcHeaderLineClass; KWClass* kwcUsedHeaderLineClass; @@ -105,7 +105,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc // Pour le max, on ne se limite pas (il peut y avoir des sous-estimation importantes pour les tables externes) lMaxOpenNecessaryMemory = lEmptyOpenNecessaryMemory * 5; - // Initialisation recursive du mapping a partir de la racine pour avoir des driver initialises + // Initialisation recursive du mapping a partir de la table principale pour avoir des driver initialises DMTMPhysicalTerminateMapping(mainMultiTableMapping); if (bRead) { @@ -120,7 +120,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc // Nettoyage prealable oaIndexedMappingsDataItemLoadIndexes.DeleteAll(); - oaIndexedMappingsRootKeyIndexes.DeleteAll(); + oaIndexedMappingsMainKeyIndexes.DeleteAll(); ivUsedMappingFlags.SetSize(0); // Dimensionnement des resultats de calcul bufferises @@ -134,7 +134,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc // Dimensionnement des resultats de calcul non bufferises oaIndexedMappingsDataItemLoadIndexes.SetSize(GetMultiTableMappings()->GetSize()); - oaIndexedMappingsRootKeyIndexes.SetSize(GetMultiTableMappings()->GetSize()); + oaIndexedMappingsMainKeyIndexes.SetSize(GetMultiTableMappings()->GetSize()); ivUsedMappingFlags.SetSize(GetMultiTableMappings()->GetSize()); // Calcul des index pour tous les mappings, et recopie des caracteristiques des drivers @@ -226,9 +226,9 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc oaIndexedMappingsDataItemLoadIndexes.SetAt(i, livDataItemLoadIndexes); // Memorisation du vecteur des indexes des champs de la cle - assert(oaIndexedMappingsRootKeyIndexes.GetAt(i) == NULL); - ivRootKeyIndexes = driver->GetRootKeyIndexes()->Clone(); - oaIndexedMappingsRootKeyIndexes.SetAt(i, ivRootKeyIndexes); + assert(oaIndexedMappingsMainKeyIndexes.GetAt(i) == NULL); + ivMainKeyIndexes = driver->GetMainKeyIndexes()->Clone(); + oaIndexedMappingsMainKeyIndexes.SetAt(i, ivMainKeyIndexes); // Estimation de la place disque necessaire en sortie if (outputDatabaseTextFile != NULL) @@ -378,7 +378,7 @@ void PLMTDatabaseTextFile::CleanOpenInformation() nReadSizeMin = 0; nReadSizeMax = 0; oaIndexedMappingsDataItemLoadIndexes.DeleteAll(); - oaIndexedMappingsRootKeyIndexes.DeleteAll(); + oaIndexedMappingsMainKeyIndexes.DeleteAll(); lEstimatedMinSingleInstanceMemoryLimit = 0; lEstimatedMaxSingleInstanceMemoryLimit = 0; } @@ -951,17 +951,17 @@ boolean PLMTDatabaseTextFile::IsMappingInitialized(KWMTDatabaseMapping* mapping) return (mapping->GetDataTableDriver() != NULL); } -void PLMTDatabaseTextFile::SetLastReadRootKey(const KWObjectKey* objectKey) +void PLMTDatabaseTextFile::SetLastReadMainKey(const KWObjectKey* objectKey) { - KWMTDatabaseMapping* rootMapping; + KWMTDatabaseMapping* mainMapping; require(IsOpenedForRead()); - rootMapping = cast(KWMTDatabaseMapping*, GetMultiTableMappings()->GetAt(0)); - check(rootMapping); - assert(rootMapping->GetLastReadKey()->GetSize() == 0); - assert(rootMapping->GetLastReadObject() == NULL); - rootMapping->SetLastReadKey(objectKey); + mainMapping = cast(KWMTDatabaseMapping*, GetMultiTableMappings()->GetAt(0)); + check(mainMapping); + assert(mainMapping->GetLastReadKey()->GetSize() == 0); + assert(mainMapping->GetLastReadObject() == NULL); + mainMapping->SetLastReadKey(objectKey); } void PLMTDatabaseTextFile::CleanMapping(KWMTDatabaseMapping* mapping) @@ -1197,7 +1197,7 @@ KWDataTableDriver* PLMTDatabaseTextFile::CreateDataTableDriver(KWMTDatabaseMappi KWDataTableDriverTextFile dataTableDriverTextFileCreator; PLDataTableDriverTextFile* dataTableDriver; KWLoadIndexVector* livDataItemLoadIndexes; - IntVector* ivRootKeyIndexes; + IntVector* ivMainKeyIndexes; int i; KWMTDatabaseMapping* usedMapping; int nLastReadKeySize; @@ -1216,7 +1216,7 @@ KWDataTableDriver* PLMTDatabaseTextFile::CreateDataTableDriver(KWMTDatabaseMappi { // Recherche des index des attributs s'ils sont specifies livDataItemLoadIndexes = NULL; - ivRootKeyIndexes = NULL; + ivMainKeyIndexes = NULL; assert(oaIndexedMappingsDataItemLoadIndexes.GetSize() == 0 or oaIndexedMappingsDataItemLoadIndexes.GetSize() == oaMultiTableMappings.GetSize()); for (i = 0; i < oaIndexedMappingsDataItemLoadIndexes.GetSize(); i++) @@ -1226,7 +1226,7 @@ KWDataTableDriver* PLMTDatabaseTextFile::CreateDataTableDriver(KWMTDatabaseMappi { livDataItemLoadIndexes = cast(KWLoadIndexVector*, oaIndexedMappingsDataItemLoadIndexes.GetAt(i)); - ivRootKeyIndexes = cast(IntVector*, oaIndexedMappingsRootKeyIndexes.GetAt(i)); + ivMainKeyIndexes = cast(IntVector*, oaIndexedMappingsMainKeyIndexes.GetAt(i)); break; } } @@ -1237,13 +1237,13 @@ KWDataTableDriver* PLMTDatabaseTextFile::CreateDataTableDriver(KWMTDatabaseMappi { // Initialisation des index des attributs, et des attribut de cle dataTableDriver->GetDataItemLoadIndexes()->CopyFrom(livDataItemLoadIndexes); - dataTableDriver->GetRootKeyIndexes()->CopyFrom(ivRootKeyIndexes); + dataTableDriver->GetMainKeyIndexes()->CopyFrom(ivMainKeyIndexes); // Calcul du nombre de champs de la cle, puis initilisation du driver pour cette taille de cle nLastReadKeySize = 0; - for (i = 0; i < ivRootKeyIndexes->GetSize(); i++) + for (i = 0; i < ivMainKeyIndexes->GetSize(); i++) { - if (ivRootKeyIndexes->GetAt(i) >= 0) + if (ivMainKeyIndexes->GetAt(i) >= 0) nLastReadKeySize++; } dataTableDriver->InitializeLastReadKeySize(nLastReadKeySize); @@ -1295,7 +1295,7 @@ void PLShared_MTDatabaseTextFile::SerializeObject(PLSerializer* serializer, cons KWMTDatabaseMapping* mapping; debug(boolean bInitialSilentMode); PLShared_ObjectArray shared_oaIndexedMappingsDataItemLoadIndexes(new PLShared_LoadIndexVector); - PLShared_ObjectArray shared_oaIndexedMappingsRootKeyIndexes(new PLShared_IntVector); + PLShared_ObjectArray shared_oaIndexedMappingsMainKeyIndexes(new PLShared_IntVector); require(serializer != NULL); require(serializer->IsOpenForWrite()); @@ -1369,9 +1369,9 @@ void PLShared_MTDatabaseTextFile::SerializeObject(PLSerializer* serializer, cons &database->oaIndexedMappingsDataItemLoadIndexes); // Ecriture des index des champs de la cle par mapping - assert(database->oaIndexedMappingsRootKeyIndexes.GetSize() == 0 or - database->oaIndexedMappingsRootKeyIndexes.GetSize() == database->GetMultiTableMappings()->GetSize()); - shared_oaIndexedMappingsRootKeyIndexes.SerializeObject(serializer, &database->oaIndexedMappingsRootKeyIndexes); + assert(database->oaIndexedMappingsMainKeyIndexes.GetSize() == 0 or + database->oaIndexedMappingsMainKeyIndexes.GetSize() == database->GetMultiTableMappings()->GetSize()); + shared_oaIndexedMappingsMainKeyIndexes.SerializeObject(serializer, &database->oaIndexedMappingsMainKeyIndexes); // Ecriture des parametres du memory guard serializer->PutLongint(database->GetMemoryGuardMaxSecondaryRecordNumber()); @@ -1387,7 +1387,7 @@ void PLShared_MTDatabaseTextFile::DeserializeObject(PLSerializer* serializer, Ob int i; KWMTDatabaseMapping* mapping; PLShared_ObjectArray shared_oaIndexedMappingsDataItemLoadIndexes(new PLShared_LoadIndexVector); - PLShared_ObjectArray shared_oaIndexedMappingsRootKeyIndexes(new PLShared_IntVector); + PLShared_ObjectArray shared_oaIndexedMappingsMainKeyIndexes(new PLShared_IntVector); require(serializer != NULL); require(serializer->IsOpenForRead()); @@ -1416,7 +1416,7 @@ void PLShared_MTDatabaseTextFile::DeserializeObject(PLSerializer* serializer, Ob assert(database->oaMultiTableMappings.GetSize() == 1); for (i = 0; i < nMappingNumber; i++) { - // Le premier mapping est pre-existant (table racine) + // Le premier mapping est pre-existant (table principale) if (i == 0) mapping = database->mainMultiTableMapping; // Les autre sont a creer @@ -1460,8 +1460,8 @@ void PLShared_MTDatabaseTextFile::DeserializeObject(PLSerializer* serializer, Ob &database->oaIndexedMappingsDataItemLoadIndexes); // Lecture des index des attributs de cle par mapping - shared_oaIndexedMappingsRootKeyIndexes.DeserializeObject(serializer, - &database->oaIndexedMappingsRootKeyIndexes); + shared_oaIndexedMappingsMainKeyIndexes.DeserializeObject(serializer, + &database->oaIndexedMappingsMainKeyIndexes); // Lecture des parametres du memory guard database->SetMemoryGuardMaxSecondaryRecordNumber(serializer->GetLongint()); diff --git a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.h b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.h index fa72cea1d..29fafd7c8 100644 --- a/src/Learning/KWDataUtils/PLMTDatabaseTextFile.h +++ b/src/Learning/KWDataUtils/PLMTDatabaseTextFile.h @@ -161,7 +161,7 @@ class PLMTDatabaseTextFile : public KWMTDatabaseTextFile boolean IsMappingInitialized(KWMTDatabaseMapping* mapping); // Parametrage de la derniere cle lue dans la table principale - void SetLastReadRootKey(const KWObjectKey* objectKey); + void SetLastReadMainKey(const KWObjectKey* objectKey); // Nettoyage d'un mapping de ses informations de contexte (last key ou last object) void CleanMapping(KWMTDatabaseMapping* mapping); @@ -220,11 +220,12 @@ class PLMTDatabaseTextFile : public KWMTDatabaseTextFile // Memorisation des index des attributs pour les mappings pour la serialisation // Un vecteur d'index est memorise pour chaque mapping - // ainsi qu'un vecteur des index des attributs de cle dans le cas de classes racines + // ainsi qu'un vecteur des index des attributs de cle dans le cas de classes principales, + // plus precisement de toute classe "unique" d'un schema multi-table // Utile pour la serialisation des bases destinees a etre ouverte en lecture, // pour transferer aux esclaves les index calcules une fois pour toutes par le maitre ObjectArray oaIndexedMappingsDataItemLoadIndexes; - ObjectArray oaIndexedMappingsRootKeyIndexes; + ObjectArray oaIndexedMappingsMainKeyIndexes; }; ///////////////////////////////////////////////////