- Worked on support for multiple adapters based on @Table() annotation's entity

This commit is contained in:
Dave M. 2020-02-12 22:56:53 -05:00
parent d01e99b18f
commit 79fdabe786
7 changed files with 47 additions and 21 deletions

View File

@ -8,6 +8,8 @@ class Table implements \Ulmus\Annotation\Annotation {
public string $schema;
public string $adapter;
public function __construct($name = null)
{
if ( $name !== null ) {

View File

@ -136,6 +136,23 @@ class EntityResolver {
return $table->name;
}
public function databaseAdapter() : ? \Ulmus\ConnectionAdapter
{
if ( null !== $table = $this->getAnnotationFromClassname( Table::class ) ) {
if ( $table->adapter ?? null ) {
if ( null === ( $adapter = \Ulmus\Ulmus::$registeredAdapters[$table->adapter] ?? null ) ) {
throw new \Exception("Requested database adapter ( {$table->adapter} ) is not registered.");
}
else {
return $adapter;
}
}
}
return null;
}
public function schemaName() : ? string
{
if ( null === $table = $this->getAnnotationFromClassname( Table::class ) ) {
@ -150,10 +167,10 @@ class EntityResolver {
}
public function getPrimaryKeyField() : ? array
{
{
foreach($this->fieldList() as $key => $value) {
if ( null !== ( $field = $this->searchFieldAnnotation($key, new Field() ) ) ) {
if (false !== $field->attributes['primary_key'] ?? false ) {
if ( false !== ( $field->attributes['primary_key'] ?? false ) ) {
return [ $key => $field ];
}
}

View File

@ -16,15 +16,13 @@ class ConnectionAdapter
public PdoObject $pdo;
public function __construct(string $name = "default", array $configuration = [])
public function __construct(string $name = "default", array $configuration = [], bool $default = false)
{
$this->name = $name;
$this->configuration = $configuration;
if ( $name === "default" ) {
Ulmus::$defaultAdapter = $this;
}
Ulmus::registerAdapter($this, $default);
}
public function resolveConfiguration() : void

View File

@ -204,7 +204,7 @@ trait EntityTrait {
*/
public static function repository(string $alias = Repository::DEFAULT_ALIAS) : Repository
{
return Ulmus::repository(static::class, $alias, Ulmus::$defaultAdapter);
return Ulmus::repository(static::class, $alias);
}
/**

View File

@ -117,7 +117,7 @@ class QueryBuilder
public function from(string $table, ? string $alias = null, ? string $database = null, ? string $schema = null) : self
{
if ( $database ) {
$table = "\"$database\".$table";
$table = "$database.$table";
}
if ( $schema ) {

View File

@ -21,9 +21,9 @@ class Repository
public function __construct(string $entity, string $alias = self::DEFAULT_ALIAS, ConnectionAdapter $adapter = null) {
$this->entityClass = $entity;
$this->alias = $alias;
$this->adapter = $adapter ?: Ulmus::$defaultAdapter;
$this->queryBuilder = new QueryBuilder( $this->adapter->adapter() );
$this->entityResolver = Ulmus::resolveEntity($entity);
$this->adapter = $adapter ?? $this->entityResolver->databaseAdapter() ?? Ulmus::$defaultAdapter;
$this->queryBuilder = new QueryBuilder( $this->adapter->adapter() );
}
public function loadOne() : ? object
@ -52,7 +52,7 @@ class Repository
$this->finalizeQuery();
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder) as $entityData) {
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
return $entityData['totalItem'];
}
@ -106,8 +106,6 @@ class Repository
$diff = array_diff_assoc($dataset, $entity->entityGetDataset(true));
var_dump( "<pre>", $diff, $dataset, $entity->entityGetDataset(true) );
if ( [] !== $diff ) {
$update = $this->updateSqlQuery($diff)->runQuery();
@ -174,7 +172,7 @@ class Repository
public function from(string $table, ? string $alias, ? string $schema) : self
{
$this->queryBuilder->from($table, $alias, null, $schema);
$this->queryBuilder->from($table, $alias, $this->adapter->adapter()->database, $schema);
return $this;
}
@ -365,7 +363,7 @@ class Repository
$this->finalizeQuery();
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder) as $entityData) {
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
$entityCollection->append( ( new $class() )->entityFillFromDataset($entityData) );
}
@ -376,7 +374,7 @@ class Repository
{
$this->finalizeQuery();
return Ulmus::runQuery($this->queryBuilder);
return Ulmus::runQuery($this->queryBuilder, $this->adapter);
}
protected function insertSqlQuery(array $dataset) : self

View File

@ -10,13 +10,15 @@ abstract class Ulmus
public static string $queryBuilderClass = "\\Ulmus\\QueryBuilder";
public static array $registeredAdapters = [];
public static ConnectionAdapter $defaultAdapter;
public static Entity\ObjectInstanciator $objectInstanciator;
public static array $resolved = [];
public static function iterateQueryBuilder(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null) : Generator
public static function iterateQueryBuilder(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null) : Generator
{
$sql = $queryBuilder->render();
$statement = ( $adapter ?: static::$defaultAdapter )->pdo->select($sql, $queryBuilder->parameters ?? []);
@ -32,12 +34,12 @@ abstract class Ulmus
];
}
public static function pdo(?ConnectionAdapter $adapter = null) : Common\PdoObject
public static function pdo(? ConnectionAdapter $adapter = null) : Common\PdoObject
{
return ( $adapter ?: static::$defaultAdapter )->pdo;
}
public static function runQuery(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null)
public static function runQuery(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null)
{
return static::pdo($adapter)->runQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
}
@ -67,7 +69,16 @@ abstract class Ulmus
return ( static::$objectInstanciator ?? static::$objectInstanciator = new Entity\ObjectInstanciator() )->convert($obj);
}
protected static function fetchQueryBuilder(QueryBuilder $queryBuilder, ?ConnectionAdapter $adapter = null) : array
public static function registerAdapter(ConnectionAdapter $adapter, bool $default = false) : void
{
if ($default) {
static::$defaultAdapter = $adapter;
}
static::$registeredAdapters[$adapter->name] = $adapter;
}
protected static function fetchQueryBuilder(QueryBuilder $queryBuilder, ? ConnectionAdapter $adapter = null) : array
{
return ( $adapter ?: static::$defaultAdapter )->pdo->select($queryBuilder->render(), $queryBuilder->parameters ?? [])->fetchAll();
}