Create a new entity manager
public static build ( Bravo3\Orm\Drivers\DriverInterface $driver, Bravo3\Orm\Mappers\MapperInterface $mapper, |
||
$driver | Bravo3\Orm\Drivers\DriverInterface | |
$mapper | Bravo3\Orm\Mappers\MapperInterface | |
$serialiser_map | ||
$key_scheme | Bravo3\Orm\KeySchemes\KeySchemeInterface | |
$configuration | ||
$cache | Bravo3\Orm\Services\Cache\EntityCachingInterface | |
return |
/** * @param InputInterface $input * @param OutputInterface $output * @param bool $export * @return void */ protected function port(InputInterface $input, OutputInterface $output, $export = true) { $entities = $this->getEntities($input->getOption('list')); $em = $this->getContainer()->get('orm.em'); $porter = new Porter(new OutputLogger($output)); $porter->registerManager('PRIMARY', $em); $io = new PharIoDriver($input->getOption($export ? 'output' : 'input'), ArchiveType::memberByKey(strtoupper($input->getOption('format')))); $driver = new FilesystemDriver($io); $aux = EntityManager::build($driver, $em->getMapper(), $em->getSerialiserMap()); $porter->registerManager('AUX', $aux); $batch_size = max(1, min(1000, (int) $input->getOption('batch'))); $term = $export ? 'Exporting' : 'Importing'; foreach ($entities as $class_name) { $output->writeln($term . " <info>" . $class_name . "</info>.."); try { if ($export) { $porter->portTable($class_name, 'PRIMARY', 'AUX', $batch_size); } else { $porter->portTable($class_name, 'AUX', 'PRIMARY', $batch_size); } } catch (\Exception $e) { $output->writeln("<error>ERROR:</error> " . $e->getMessage()); } } if ($export) { $output->writeln("<comment>EXPORT COMPLETE</comment>"); } else { $output->writeln("<comment>IMPORT COMPLETE</comment>"); } }
/** * Gets an array of EntityManager's with different drivers * * @return EntityManager[] */ public function entityManagerDataProvider() { $drivers = [$this->getRedisDriver(), $this->getFsDriver(), $this->getTarDriver(), $this->getZipDriver()]; $ems = []; /** @var DriverInterface $driver */ foreach ($drivers as $index => $driver) { $driver->setDebugMode(true); $mapper = new AnnotationMapper(); $em = EntityManager::build($driver, $mapper); $temp = sys_get_temp_dir() . '/bravo3-orm/' . $index; if (!file_exists($temp)) { mkdir($temp, 0777, true); } $em->getConfig()->setCacheDir($temp); $ems[] = [$em]; } return $ems; }
/** * Gets an array of EntityManager's with different drivers * * @return EntityManager[] */ public function entityManagerDataProvider() { $drivers = [$this->getRedisDriver(), $this->getFsDriver(), $this->getTarDriver(), $this->getZipDriver()]; $ems = []; /** @var DriverInterface $driver */ foreach ($drivers as $index => $driver) { $driver->setDebugMode(true); $mapper = new AnnotationMapper(); $em = EntityManager::build($driver, $mapper); $temp = sys_get_temp_dir() . '/bravo3-orm/' . $index; if (!file_exists($temp)) { mkdir($temp, 0777, true); } $em->getConfig()->setCacheDir($temp); $ems[] = [$em]; } // Alternative mappers - run these against fresh filesystem databases $mappers = [new YamlMapper([__DIR__ . '/Resources/mappings.yml']), new ChainedMapper([new AnnotationMapper(), new YamlMapper([__DIR__ . '/Resources/mappings.yml'])])]; $index = 0; foreach ($mappers as $mapper) { $ems[] = [EntityManager::build($this->getFsDriver('fs-db-' . ++$index), $mapper)]; } return $ems; }
public function testPortation() { $mapper = new AnnotationMapper(); $src = EntityManager::build($this->getRedisDriver(), $mapper); $dest = EntityManager::build($this->getFsDriver('porter-db'), $mapper); $porter = new Porter(); $porter->registerManager('redis', $src); $porter->registerManager('tar', $dest); // Create some dummy data $category = new Category(); $category->setId(600); $src->persist($category); for ($i = 0; $i < 15; $i++) { $article = new Article(); $article->setId(601 + $i); $article->setTitle('Art ' . (601 + $i)); $time = new \DateTime(); $time->modify('+' . ($i + 1) . ' minutes'); $article->setSortDate($time); $article->setCanonicalCategory($category); $src->persist($article); } $src->flush(); // Port the database $porter->portTable(Article::class, 'redis', 'tar'); $porter->portTable(Category::class, 'redis', 'tar'); // Check entity counts $articles = $dest->indexedQuery(new IndexedQuery(Article::class, ['@id' => '*']), false); $this->assertCount(15, $articles); $categories = $dest->indexedQuery(new IndexedQuery(Category::class, ['@id' => '*']), false); $this->assertCount(1, $categories); // Test indices were preserved /** @var Article $article */ // Date sorting - $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'sort_date')); $this->assertCount(15, $results); $article = $results[0]; $this->assertEquals('Art 601', $article->getTitle()); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'sort_date', Direction::DESC())); $this->assertCount(15, $results); $this->assertEquals(15, $results->getFullSize()); $article = $results[0]; $this->assertEquals('Art 615', $article->getTitle()); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'sort_date', Direction::DESC(), 5, -6), true); $this->assertCount(5, $results); $this->assertEquals(15, $results->getFullSize()); $article = $results[0]; $this->assertEquals('Art 610', $article->getTitle()); $article = $results[4]; $this->assertEquals('Art 606', $article->getTitle()); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'sort_date', Direction::ASC(), 2, 5)); $this->assertCount(4, $results); $this->assertNull($results->getFullSize()); $article = $results[0]; $this->assertEquals('Art 603', $article->getTitle()); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'sort_date', Direction::ASC(), 20, 29)); $this->assertCount(0, $results); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'title')); $this->assertCount(15, $results); $article = $results[0]; $this->assertEquals('Art 601', $article->getTitle()); // Lexicographic sorting - $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'title')); $this->assertCount(15, $results); $article = $results[0]; $this->assertEquals('Art 601', $article->getTitle()); $results = $dest->sortedQuery(new SortedQuery($category, 'articles', 'title', Direction::DESC())); $this->assertCount(15, $results); $article = $results[0]; $this->assertEquals('Art 615', $article->getTitle()); }
/** * Provides all pool implementations * * @return array */ public function poolProvider() { $em = EntityManager::build(new FilesystemDriver(new NativeIoDriver(sys_get_temp_dir() . '/bravo3-cache/')), new AnnotationMapper()); return [[new EphemeralCachePool()], [new RedisCachePool()], [new OrmCachePool($em)], [new OrmCachePool($em, null, true)]]; }
<?php use Bravo3\Orm\Drivers\Filesystem\FilesystemDriver; use Bravo3\Orm\Drivers\Filesystem\Io\NativeIoDriver; use Bravo3\Orm\Mappers\Annotation\AnnotationMapper; use Bravo3\Orm\Mappers\Portation\MapWriterInterface; use Bravo3\Orm\Mappers\Yaml\YamlMapWriter; use Bravo3\Orm\Services\EntityLocator; use Bravo3\Orm\Services\EntityManager; use Bravo3\Properties\Conf; use Predis\Client; require __DIR__ . '/../vendor/autoload.php'; Conf::init(__DIR__ . '/config/', 'parameters.yml'); $redis = new Client(['host' => Conf::get('parameters.redis_host'), 'port' => Conf::get('parameters.redis_port'), 'database' => Conf::get('parameters.redis_database')]); $redis->flushdb(); // Solely for portation (reading metadata) - will never do anything $em = EntityManager::build(new FilesystemDriver(new NativeIoDriver('/dev/null')), new AnnotationMapper()); $locator = new EntityLocator($em); $entities = $locator->locateEntities(__DIR__ . '/Bravo3/Orm/Tests/Entities', 'Bravo3\\Orm\\Tests\\Entities'); /** @var MapWriterInterface[] $porters */ $porters = [new YamlMapWriter(__DIR__ . '/Bravo3/Orm/Tests/Resources/mappings.yml')]; foreach ($porters as $porter) { $porter->setInputManager($em); foreach ($entities as $class_name) { $porter->compileMetadataForEntity($class_name); } $porter->flush(); }
/** * Build an entity manager * * @param DriverInterface $driver * @param MapperInterface $mapper * @param string $cache_dir * @return EntityManager */ public static function createEntityManager(DriverInterface $driver, MapperInterface $mapper, $cache_dir) { $config = new Configuration(); $config->setCacheDir($cache_dir); return EntityManager::build($driver, $mapper, null, null, $config); }