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/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/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.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..3b20a81ec 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 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 b9f32e7e7..a99773fcd 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(); + // 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 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); @@ -1814,6 +1828,9 @@ void KWClass::Write(ostream& ost) const ost << ")"; } ost << "\n"; + + // Meta-donnees + WritePrivateMetaData(ost); if (metaData.GetKeyNumber() > 0) { metaData.Write(ost); @@ -2767,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; @@ -2794,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 5dd8094a6..6f9da1bcc 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; @@ -552,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 informations privees depuis les meta-data et nettoyage de ceux-ci + void ReadPrivateMetaData(); + // Nom de la classe KWCDUniqueString usName; @@ -571,6 +595,15 @@ class KWClass : public Object // Statut racine ou composant boolean bRoot; + // Statut unique force + boolean bForceUnique; + + // 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) StringVector svKeyAttributeNames; @@ -684,6 +717,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 +924,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/KWClassDomain.cpp b/src/Learning/KWData/KWClassDomain.cpp index 5e87783da..4f8c3c0d6 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; @@ -770,8 +770,8 @@ KWClassDomain* KWClassDomain::CloneFromClass(const KWClass* rootClass) const kwcdClone->usName = usName; kwcdClone->usLabel = usLabel; - // Duplication de la classe racine - kwcCloneElement = rootClass->Clone(); + // Duplication de la classe principale + 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 + // Enregistrement de la classe principale // (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..d91b7da45 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,22 +131,22 @@ 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 // 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* 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/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 f0bb3d3e4..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); @@ -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..ccc180bba 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)); @@ -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,15 +66,15 @@ void KWMTDatabase::CopyFrom(const KWDatabase* kwdSource) oaMultiTableMappings.Add(mapping->Clone()); } - // Memorisation du mapping racine - rootMultiTableMapping = cast(KWMTDatabaseMapping*, oaMultiTableMappings.GetAt(0)); + // 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++) { 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 @@ -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); } @@ -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; } @@ -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; @@ -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()); @@ -294,15 +294,15 @@ 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) - rootMultiTableMapping = rootMultiTableMapping->Clone(); + // Duplication prealable du mapping principal (sans les attributs de gestion) + mainMultiTableMapping = mainMultiTableMapping->Clone(); // Nettoyage oaMultiTableMappings.DeleteAll(); oaRootRefTableMappings.SetSize(0); - // On rajoute le mapping racine - oaMultiTableMappings.Add(rootMultiTableMapping); + // On rajoute le mapping principal + 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); @@ -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, @@ -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 @@ -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; @@ -471,12 +472,12 @@ 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()); - 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++) @@ -503,15 +504,20 @@ boolean KWMTDatabase::CheckPartially(boolean bWriteOnly) const mapping->GetDataTableName() + " should not be specified for output database"); } - // Recherche de la classe racine du chemin de mapping - rootClass = KWClassDomain::GetCurrentDomain()->LookupClass(mapping->GetOriginClassName()); + // Recherche de la classe principale du chemin de mapping + 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); @@ -764,20 +770,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 + // Initialisation recursive du mapping a partir de la table principale 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 +798,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) @@ -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)); @@ -974,18 +980,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); + // 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(rootMultiTableMapping, kwcClass); + bOk = DMTMPhysicalOpenForRead(mainMultiTableMapping, kwcClass); // Ouverture des tables referencees if (bOk) @@ -1001,21 +1007,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); + // Initialisation recursive du mapping a partir de la table principale + DMTMPhysicalInitializeMapping(mainMultiTableMapping, kwcClass, false); - // Ouverture recursive des tables a partir de la table racine - bOk = DMTMPhysicalOpenForWrite(rootMultiTableMapping); + // Ouverture recursive des tables a partir de la table principale + 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 +1029,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 +1040,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 +1060,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 +1168,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, + // 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(rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetName() == kwcClass->GetName()); - assert(rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetRoot() == kwcClass->GetRoot()); - if (kwcClass->GetRoot()) + assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetName() == kwcClass->GetName()); + assert(mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetRoot() == kwcClass->GetRoot()); + if (kwcClass->IsUnique()) { - assert(rootMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()->GetSize() == - rootMultiTableMapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); - rootMultiTableMapping->SetLastReadKey( - rootMultiTableMapping->GetDataTableDriver()->GetLastReadRootKey()); + assert(mainMultiTableMapping->GetDataTableDriver()->GetLastReadMainKey()->GetSize() == + mainMultiTableMapping->GetDataTableDriver()->GetClass()->GetKeyAttributeNumber()); + mainMultiTableMapping->SetLastReadKey( + mainMultiTableMapping->GetDataTableDriver()->GetLastReadMainKey()); } // Attention, il n'est pas possible de propager les skip sur les sous-tables @@ -1185,14 +1191,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 +1206,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 +1217,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( + // Parametrage du mapping principal + 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; } @@ -1317,9 +1323,9 @@ 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 rootMultiTableMapping->GetLastReadKey()->IsEmpty()) - objectReferenceResolver.AddObject(kwcPhysicalClass, rootMultiTableMapping->GetLastReadKey(), + // 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); // Appel de la methode ancetre @@ -1328,8 +1334,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 (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 KWDRReference::SetObjectReferenceResolver(NULL); @@ -1358,8 +1364,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 (kwcPhysicalClass->GetRoot() and not mainMultiTableMapping->GetLastReadKey()->IsEmpty()) + objectReferenceResolver.AddObject(kwcPhysicalClass, mainMultiTableMapping->GetLastReadKey(), kwoPhysicalObject); // Calcul du critere de selection @@ -1375,8 +1381,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 (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 KWDRReference::SetObjectReferenceResolver(NULL); @@ -1540,9 +1546,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 @@ -1560,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 @@ -1859,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 @@ -2267,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; } @@ -2290,7 +2296,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 == mainMultiTableMapping or kwoObject->GetClass()->IsUnique()) { // Test a partir du deuxieme enregistrement effectivement lu, pour lequel le LastReadKey est // initialise) @@ -2298,9 +2304,9 @@ 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()->GetRoot() and + if (kwoObject->GetClass()->IsUnique() and objectKey.StrictCompare(mapping->GetLastReadKey()) == 0) { // Warning de lecture @@ -2336,9 +2342,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 mappings de la composition 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 @@ -2388,7 +2396,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 6fdc41e21..58d3b09b5 100644 --- a/src/Learning/KWData/KWMTDatabase.h +++ b/src/Learning/KWData/KWMTDatabase.h @@ -216,18 +216,18 @@ 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 traitement 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* 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; // 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.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..555021d15 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 @@ -147,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/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/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/KWDatabaseChunkBuilder.cpp b/src/Learning/KWDataUtils/KWDatabaseChunkBuilder.cpp index 060cc8691..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->GetChunkPreviousRootKeyAt(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 diff --git a/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp b/src/Learning/KWDataUtils/KWDatabaseIndexer.cpp index 2da0c7552..5086e2b70 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 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); @@ -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..0c044f44b 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 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); - // 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 diff --git a/src/Learning/KWDataUtils/KWDatabaseTask.cpp b/src/Learning/KWDataUtils/KWDatabaseTask.cpp index e16f7a5d9..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.GetChunkLastRootKeyAt(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 0f9f4a726..b622816d2 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()); + // Creation d'un fichier principal avec des champs cle + 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); diff --git a/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp b/src/Learning/KWDataUtils/KWTestDatabaseTransfer.cpp index a488ceabe..732652ea5 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(); @@ -742,12 +742,12 @@ 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(); 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 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 1280e0b79..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,22 +105,22 @@ 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 - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + // Initialisation recursive du mapping a partir de la table principale pour avoir des driver initialises + 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 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) @@ -350,7 +350,7 @@ boolean PLMTDatabaseTextFile::ComputeOpenInformation(boolean bRead, boolean bInc } // Nettoyage - DMTMPhysicalTerminateMapping(rootMultiTableMapping); + DMTMPhysicalTerminateMapping(mainMultiTableMapping); if (bRead) DeletePhysicalClass(); kwcClass = 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,9 +1416,9 @@ 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->rootMultiTableMapping; + mapping = database->mainMultiTableMapping; // Les autre sont a creer else { @@ -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; }; /////////////////////////////////////////////////// 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); 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); } } } 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; } 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); }