Files
ulmus/src/Ulmus.php
T
mcndave 13b7cf06f1 - ArrayOf errors now catched in EntityTrait (event soon to be attached to it)
- Fixed some non-nullable defaulted to null vars in functions
- Added a new diff method for entities which skips nullable values if they are not defined.
2026-07-13 12:33:40 +00:00

163 lines
5.7 KiB
PHP

<?php
namespace Ulmus;
use Generator;
use Psr\SimpleCache\CacheInterface;
abstract class Ulmus
{
# @todo Remove, unused, now defined by the adapter (logically, right ?)
public static string $repositoryClass = "\\Ulmus\\Repository";
# @todo Remove, unused, now defined by the adapter (logically, right ?)
public static string $queryBuilderClass = "\\Ulmus\\QueryBuilder";
public static array $registeredAdapters = [];
public static ConnectionAdapter $defaultAdapter;
public static Entity\ObjectInstanciator $objectInstanciator;
public static CacheInterface $cache;
public static array $resolved = [];
public static function iterateQueryBuilder(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) : Generator
{
$statement = ( $adapter ?: static::$defaultAdapter )->connector()->select($queryBuilder->render(), $queryBuilder->parameters ?? []);
while ( $row = $statement->fetch() ) {
yield $row;
}
$statement->closeCursor();
$queryBuilder->reset();
return [
'count' => $statement->rowCount(),
];
}
public static function datasetQueryBuilder(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) : array
{
$rows = [];
$statement = ( $adapter ?: static::$defaultAdapter )->connector()->select($queryBuilder->render(), $queryBuilder->parameters ?? []);
while ( $row = $statement->fetch() ) {
$rows[] = $row;
}
$statement->closeCursor();
$queryBuilder->reset();
return $rows;
}
public static function connector(? ConnectionAdapter $adapter = null) : object
{
return ( $adapter ?: static::$defaultAdapter )->connector();
}
public static function runSelectQuery(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null)
{
$dataset = static::connector($adapter)->select($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
$queryBuilder->reset();
return $dataset;
}
public static function runQuery(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null)
{
$return = static::connector($adapter)->runQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
$queryBuilder->reset();
return $return;
}
public static function runInsertQuery(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null)
{
$return = static::connector($adapter)->runInsertQuery($queryBuilder->render(), $queryBuilder->values ?? []);
$queryBuilder->reset();
return $return;
}
public static function runUpdateQuery(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null)
{
$return = static::connector($adapter)->runUpdateQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
$queryBuilder->reset();
return $return;
}
public static function runDeleteQuery(QueryBuilder\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null)
{
$return = static::connector($adapter)->runDeleteQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? []));
$queryBuilder->reset();
return $return;
}
public static function resolveEntity(string $entityClass) : Common\EntityResolver
{
return static::$resolved[$entityClass] ?? static::$resolved[$entityClass] = new Common\EntityResolver($entityClass, static::$cache);
}
public static function repository(string $entityClass, string $alias = Repository::DEFAULT_ALIAS, ?ConnectionAdapter $adapter = null) : Repository
{
$adapter ??= $entityClass::resolveEntity()->sqlAdapter();
$cls = $adapter->adapter()->repositoryClass();
return new $cls($entityClass, $alias, $adapter);
}
public static function queryBuilder($entityClass, ...$arguments) : QueryBuilder\QueryBuilderInterface
{
$cls = $entityClass::resolveEntity()->sqlAdapter()->adapter()->queryBuilderClass();
return new $cls(...$arguments);
}
public static function instanciateObject(string $type, array $arguments) : object
{
return ( static::$objectInstanciator ?? static::$objectInstanciator = new Entity\ObjectInstanciator() )->instanciate($type, $arguments);
}
public static function convertObject(object $obj)
{
return ( static::$objectInstanciator ?? static::$objectInstanciator = new Entity\ObjectInstanciator() )->convert($obj);
}
public static function convertEnum(\UnitEnum $enum)
{
return ( static::$objectInstanciator ?? static::$objectInstanciator = new Entity\ObjectInstanciator() )->enum($enum);
}
public static function encodeArray(array $array)
{
return json_encode($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\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) : array
{
$result = ( $adapter ?: static::$defaultAdapter )->connector->select($queryBuilder->render(), $queryBuilder->parameters ?? [])->fetchAll();
$queryBuilder->reset();
return $result;
}
}