/**
  * Méthode permettant de localiser la partie du JDD à lier à l'élément du block.
  *
  * TODO: Unifier les deux méthodes en une seule.
  * TODO: A vérifier
  *
  * Liée à EiTestSetBlockStack->getDataFromDataSet
  *
  * @param EiTestSet $testSet
  * @param EiVersionStructure $block
  * @param EiTestSetBlockStack $previousStack
  * @param EiTestSetBlockStack $parentStack
  * @return mixed|null
  */
 public function getDataFromDataSet(EiTestSet $testSet, EiVersionStructure $block, EiTestSetBlockStack $previousStack = null, EiTestSetBlockStack $parentStack = null)
 {
     /** @var EiTestSetDataSetTable $tableDSS */
     $tableDSS = Doctrine_Core::getTable("EiTestSetDataSet");
     $mapping = $block->getMappingDataSet(EiBlockDataSetMapping::$TYPE_IN);
     $dssStr = null;
     // Cas où il y a un mapping et que le parent est nul : On prend le premier élément que l'on trouve.
     if ($parentStack == null && $mapping != null) {
         $dssStr != null ? $tableDSS->getRelatedDataFromUniqueDataSetStructure($testSet->getId(), $mapping) : null;
     } elseif ($mapping != null) {
         // On vérifie que le block en question est une boucle.
         if ($block->isEiLoop()) {
             // On récupère le contexte du père.
             $contexte = $parentStack->getContext();
             $index = 1;
             //                var_dump("DataSet Père : " . $parentStack->getEiTestSetDatasetId());
             //                var_dump("Contexte DataSet Père : " . $contexte);
             // Si le block courant est de même nature que le block précédent
             if ($parentStack->getEiVersionStructureId() != $block->getId() && $block->getId() == $previousStack->getEiVersionStructureId()) {
                 //                    var_dump("DataSet Structure CAS 1");
                 // On vérifie s'il s'agit de la même boucle mais concerne une partie différente.
                 if ($previousStack->getPartIndex() < $previousStack->getPartsCount()) {
                     $index = $previousStack->getRepetitionIndex();
                     $contexte .= "-" . $index;
                 } else {
                     $index = $previousStack->getRepetitionIndex() + 1;
                     $contexte .= "-" . $index;
                 }
             } elseif ($parentStack->getEiVersionStructureId() != $block->getId()) {
                 //                    var_dump("DataSet Structure CAS 2");
                 $parentStr = $parentStack->getEiTestSetDataSet() != null ? $parentStack->getEiTestSetDataSet()->getEiDataSetStructure() : null;
                 if ($parentStr != null && $mapping->getEiDataSetStructureMapping()->getNode()->isDescendantOf($parentStr)) {
                     //                        var_dump("DataSet Structure CAS 2.1");
                     $parentMapping = $parentStr != null ? $parentStr->getId() : null;
                     $myMappingParent = $mapping->getEiDataSetStructureMapping()->getEiDatasetStructureParentId();
                     if ($parentMapping == null || $myMappingParent == $parentMapping) {
                         $contexte .= "-1";
                     } else {
                         if (preg_match("/([0-9]+)\$/", $contexte, $matched)) {
                             $length = strlen($matched[1]);
                         } else {
                             $length = 1;
                         }
                         $contexte = substr($contexte, 0, -$length) . 1;
                     }
                 } else {
                     //                        var_dump("DataSet Structure CAS 2.2");
                     $contexteArray = array();
                     for ($cpt = 0; $cpt <= $mapping->getEiDataSetStructureMapping()->getLevel(); $cpt++) {
                         $contexteArray[] = 1;
                     }
                     $contexte = implode("-", $contexteArray);
                     //                        var_dump("New context : " . $contexte);
                 }
             } else {
                 //                    var_dump("DataSet Structure CAS 3");
                 if (preg_match("/([0-9]+)\$/", $contexte, $matched)) {
                     $length = strlen($matched[1]);
                 } else {
                     $length = 1;
                 }
                 $contexte = substr($contexte, 0, -$length);
                 // On vérifie s'il s'agit de la même boucle mais concerne une partie différente.
                 if (!$parentStack->isComplete()) {
                     $index = $parentStack->getRepetitionIndex();
                 } else {
                     $index = $parentStack->getRepetitionIndex() + 1;
                 }
                 $contexte .= $index;
                 //                    var_dump($parentStack->getEiVersionStructureId(), $block->getId());
                 //                    var_dump($contexte);
             }
             $dssStr = $tableDSS->getDataFromContext($testSet->getId(), $mapping->getEiDatasetStructureId(), $contexte, $index);
         }
     }
     return $dssStr;
 }
 /**
  * Génération des paramètres des blocks à partir du jeu de test et de son jeu de données.
  *
  * @param EiTestSet $testSet
  * @param EiTestSetBlockStack $stack
  * @return EiTestSetBlockParam|void
  */
 public function generate(EiTestSet $testSet, EiTestSetBlockStack $stack, Doctrine_Connection $conn = null)
 {
     $conn = $conn == null ? Doctrine_Manager::connection() : $conn;
     $chronometre = new Chronometre();
     // Début mesure.
     $gen = $chronometre->lancerChrono("GENERATION PARAMETRES DE BLOCK", true);
     // On récupère le block à partir de la pile.
     $block = $stack->getEiVersionStructure();
     // Récupération du parent.
     $parent = $block->getNode()->getParent();
     $index = null;
     $path = "";
     if ($parent != null && ($parent instanceof EiTestSetBlockParam || $parent instanceof EiVersionStructure)) {
         /** @var EiTestSetBlockParam $parent */
         $parent = $this->getParentBlock($testSet, $parent);
         $path = $parent->getPath();
         // TODO: Calcul index.
         $index = $stack->getRepetitionIndex();
     } else {
         $index = 1;
     }
     // Si le fragment de l'élément de la pile est supérieur à 1 alors le père a déjà été généré et on le récupère.
     if ($stack->getPartIndex() > 1) {
         $blockParam = Doctrine_Core::getTable("EiTestSetBlockParam")->findOneByEiTestSetIdAndIndexRepetitionAndEiVersionStructureId($testSet->getId(), $index, $block->getId());
         //            var_dump($blockParam->toArray(false));
         //            var_dump($stack->toArray(false));
     } else {
         // Génération des paramètres du Block.
         $blockParam = $block->generateTestSetParameters($testSet, $parent, $index, $path, false, $conn);
     }
     if ($blockParam != null) {
         // Ajout du block param dans la stack.
         $stack->setEiTestSetBlockParam($blockParam);
         $stack->setPath($blockParam->getPath());
         $stack->save($conn);
     }
     // Fin de la mesure.
     $chronometre->arreterEtAfficherChrono("GENERATION PARAMETRES DE BLOCK", $gen);
     return $blockParam;
 }