public function addCriteriaRevision(View $view, array $rawData, $targetFieldName, array $loadedRevision = []) { $multipleField = $this->getMultipleField($view->getContentType()->getFieldType()); $body = ['query' => ['bool' => ['must' => []]]]; foreach ($rawData as $name => $key) { if ($multipleField != $name) { $body['query']['bool']['must'][] = ['term' => [$name => ['value' => $key]]]; } } $result = $this->getElasticsearch()->search(['body' => $body, 'index' => $view->getContentType()->getEnvironment()->getAlias(), 'type' => $view->getContentType()->getName()]); if ($result['hits']['total'] == 0) { $revision = false; foreach ($loadedRevision as $item) { $found = true; foreach ($rawData as $name => $key) { if ($multipleField != $name) { if ($item->getRawData()[$name] != $key) { $found = false; break; } } } if ($found) { $revision = $item; } } $multipleValueToAdd = $rawData[$multipleField]; if (!$revision) { $revision = new Revision(); $revision->setContentType($view->getContentType()); $rawData[$multipleField] = []; $revision->setRawData($rawData); } $rawData = $revision->getRawData(); $rawData[$multipleField][] = $multipleValueToAdd; $revision->setRawData($rawData); // $revision= $this->getDataService()->finalizeDraft($revision); // $this->getDataService()->waitForGreen(); $message = $multipleValueToAdd; foreach ($rawData as $key => $value) { if ($key != $multipleField && $key != $targetFieldName) { $message .= ', ' . $value; } } $this->addFlash('notice', 'A new criteria has been created for ' . $targetFieldName . ':' . $rawData[$targetFieldName] . ' (' . $message . ')'); return $revision; } else { if ($result['hits']['total'] == 1) { /**@var Revision $revision*/ $revision = null; if (isset($loadedRevision[$result['hits']['hits'][0]['_id']])) { $revision = $loadedRevision[$result['hits']['hits'][0]['_id']]; } else { $revision = $this->getDataService()->initNewDraft($view->getContentType()->getName(), $result['hits']['hits'][0]['_id']); } $multipleValueToAdd = $rawData[$multipleField]; $rawData = $revision->getRawData(); if (in_array($multipleValueToAdd, $rawData[$multipleField])) { $this->addFlash('warning', 'A criteria already exist for ' . $multipleField . '=' . $multipleValueToAdd); } else { $rawData[$multipleField][] = $multipleValueToAdd; $revision->setRawData($rawData); $message = $multipleValueToAdd; foreach ($rawData as $key => $value) { if ($key != $multipleField && $key != $targetFieldName) { $message .= ', ' . $value; } } $this->addFlash('notice', 'A criteria has added for ' . $targetFieldName . ':' . $rawData[$targetFieldName] . ' (' . $message . ')'); } return $revision; } else { $message = false; foreach ($result['hits']['hits'] as $hit) { if ($message) { $message .= ', '; } else { $message = ''; } $message .= $hit['_id']; } $this->addFlash('error', 'Too many criteria found (' . $result['hits']['total'] . '). There is something wrong with this combinaison of criteria!: ' . $message); } } return NULL; }
protected function execute(InputInterface $input, OutputInterface $output) { /** @var EntityManager $em */ $em = $this->doctrine->getManager(); $contentTypeNameFrom = $input->getArgument('contentTypeNameFrom'); $contentTypeNameTo = $input->getArgument('contentTypeNameTo'); $elasticsearchIndex = $input->getArgument('elasticsearchIndex'); if (null !== $input->getArgument('mode') && ($input->getArgument('mode')[0] == "M" || $input->getArgument('mode')[0] == "m")) { $mode = "merge"; } else { $mode = "earse"; } /** @var \AppBundle\Repository\ContentTypeRepository $contentTypeRepository */ $contentTypeRepository = $em->getRepository('AppBundle:ContentType'); /** @var \AppBundle\Entity\ContentType $contentTypeTo */ $contentTypeTo = $contentTypeRepository->findOneBy(array("name" => $contentTypeNameTo, 'deleted' => false)); if (!$contentTypeTo) { $output->writeln("<error>Content type " . $contentTypeNameTo . " not found</error>"); exit; } $output->writeln("Start migration of " . $contentTypeTo->getPluralName()); if ($contentTypeTo->getDirty()) { $output->writeln("<error>Content type \"" . $contentTypeNameTo . "\" is dirty. Please clean it first</error>"); exit; } if (!$input->getOption('force') && strcmp($contentTypeTo->getEnvironment()->getAlias(), $elasticsearchIndex) === 0 && strcmp($contentTypeNameFrom, $contentTypeNameTo) === 0) { $output->writeln("<error>You can not import a content type on himself</error>"); exit; } //Delete ContentType if erase if ($mode == "erase") { /** @var RevisionRepository $repository */ $repository = $em->getRepository('AppBundle:Revision'); $repository->deleteRevisions(); $repository->clear(); } $arrayElasticsearchIndex = $this->client->search(['index' => $elasticsearchIndex, 'type' => $contentTypeNameFrom, 'size' => 1]); $total = $arrayElasticsearchIndex["hits"]["total"]; // create a new progress bar $progress = new ProgressBar($output, $total); // start and displays the progress bar $progress->start(); for ($from = 0; $from < $total; $from = $from + 50) { $arrayElasticsearchIndex = $this->client->search(['index' => $elasticsearchIndex, 'type' => $contentTypeNameFrom, 'size' => 50, 'from' => $from, 'preference' => '_primary']); // $output->writeln("\nMigrating " . ($from+1) . " / " . $total ); /** @var RevisionRepository $repository */ $repository = $em->getRepository('AppBundle:Revision'); foreach ($arrayElasticsearchIndex["hits"]["hits"] as $index => $value) { try { $now = new \DateTime(); $until = $now->add(new \DateInterval("PT5M")); //+5 minutes $newRevision = new Revision(); $newRevision->setContentType($contentTypeTo); $newRevision->addEnvironment($contentTypeTo->getEnvironment()); $newRevision->setOuuid($value['_id']); $newRevision->setStartTime($now); $newRevision->setEndTime(null); $newRevision->setDeleted(0); $newRevision->setDraft(1); $newRevision->setLockBy('SYSTEM_MIGRATE'); $newRevision->setLockUntil($until); $currentRevision = $repository->getCurrentRevision($contentTypeTo, $value['_id']); if ($currentRevision) { //If there is a current revision, datas in fields that are protected against migration must not be overridden //So we load the datas from the current revision into the next revision $newRevision->setRawData($currentRevision->getRawData()); //We build the new revision object $this->dataService->loadDataStructure($newRevision); //We update the new revision object with the new datas. Here, the protected fields are not overridden. $newRevision->getDataField()->updateDataValue($value['_source'], true); //isMigrate=true //We serialize the new object $objectArray = $this->mapping->dataFieldToArray($newRevision->getDataField()); $newRevision->setRawData($objectArray); } else { if ($input->getOption('strip')) { $newRevision->setRawData([]); $this->dataService->loadDataStructure($newRevision); $newRevision->getDataField()->updateDataValue($value['_source'], true); //We serialize the new object $objectArray = $this->mapping->dataFieldToArray($newRevision->getDataField()); $newRevision->setRawData($objectArray); } else { $newRevision->setRawData($value['_source']); $objectArray = $value['_source']; } } $this->client->index(['index' => $contentTypeTo->getEnvironment()->getAlias(), 'type' => $contentTypeNameTo, 'id' => $value['_id'], 'body' => $objectArray]); //TODO: Test if client->index OK $em->persist($newRevision); $em->flush(); $repository->finaliseRevision($contentTypeTo, $value['_id'], $now); //hot fix query: insert into `environment_revision` select id, 1 from `revision` where `end_time` is null; $repository->publishRevision($newRevision); } catch (NotLockedException $e) { $output->writeln("<error>'.{$e}.'</error>"); } // advance the progress bar 1 unit $progress->advance(); } $repository->clear(); } // ensure that the progress bar is at 100% $progress->finish(); $output->writeln(""); $output->writeln("Migration done"); }
public function initNewDraft($type, $ouuid, $fromRev = null, $username = NULL) { /** @var EntityManager $em */ $em = $this->doctrine->getManager(); /** @var ContentTypeRepository $contentTypeRepo */ $contentTypeRepo = $em->getRepository('AppBundle:ContentType'); $contentType = $contentTypeRepo->findOneBy(['name' => $type, 'deleted' => false]); if (!$contentType) { throw new NotFoundHttpException('ContentType ' . $type . ' Not found'); } try { $revision = $this->getNewestRevision($type, $ouuid); $revision->setDeleted(false); if (null !== $revision->getDataField()) { $revision->getDataField()->propagateOuuid($revision->getOuuid()); } } catch (NotFoundHttpException $e) { $revision = new Revision(); $revision->setDraft(true); $revision->setOuuid($ouuid); $revision->setContentType($contentType); } $this->setCircles($revision); $this->lockRevision($revision, false, false, $username); if (!$revision->getDraft()) { $now = new \DateTime(); if ($fromRev) { $newDraft = new Revision($fromRev); } else { $newDraft = new Revision($revision); } $newDraft->setStartTime($now); $revision->setEndTime($now); $this->lockRevision($newDraft, false, false, $username); $em->persist($revision); $em->persist($newDraft); $em->flush(); return $newDraft; } return $revision; }