/** * 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; }