Example #1
0
 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");
 }
Example #2
0
 public function createData($ouuid, array $rawdata, ContentType $contentType, $byARealUser = true)
 {
     $now = new \DateTime();
     $until = $now->add(new \DateInterval($byARealUser ? "PT5M" : "PT1M"));
     //+5 minutes
     $newRevision = new Revision();
     $newRevision->setContentType($contentType);
     $newRevision->setOuuid($ouuid);
     $newRevision->setStartTime($now);
     $newRevision->setEndTime(null);
     $newRevision->setDeleted(0);
     $newRevision->setDraft(1);
     $newRevision->setLockBy($this->tokenStorage->getToken()->getUsername());
     $newRevision->setLockUntil($until);
     $newRevision->setRawData($rawdata);
     $em = $this->doctrine->getManager();
     if (!empty($ouuid)) {
         $revisionRepository = $em->getRepository('AppBundle:Revision');
         $anotherObject = $revisionRepository->findOneBy(['contentType' => $contentType, 'ouuid' => $newRevision->getOuuid(), 'endTime' => null]);
         if (!empty($anotherObject)) {
             throw new ConflictHttpException('Duplicate OUUID ' . $ouuid . ' for this content type');
         }
     }
     $em->persist($newRevision);
     $em->flush();
     return $newRevision;
 }