render(); $statement = ( $adapter ?: static::$defaultAdapter )->connector()->select($rendered, $queryBuilder->parameters ?? []); $i = 0; while ( $row = $statement->fetch() ) { yield $row; } $statement->closeCursor(); $queryBuilder->reset(); return [ 'count' => $statement->rowCount(), ]; } public static function datasetQueryBuilder(Query\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) : array { $rows = []; $rendered = $queryBuilder->render(); $statement = ( $adapter ?: static::$defaultAdapter )->connector()->select($rendered, $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(Query\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(Query\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(Query\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) { $return = static::connector($adapter)->runInsertQuery($queryBuilder->render(), array_merge($queryBuilder->values ?? [], $queryBuilder->parameters ?? [])); $queryBuilder->reset(); return $return; } public static function runUpdateQuery(Query\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(Query\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) : Query\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(Query\QueryBuilderInterface $queryBuilder, ? ConnectionAdapter $adapter = null) : array { $result = ( $adapter ?: static::$defaultAdapter )->connector->select($queryBuilder->render(), $queryBuilder->parameters ?? [])->fetchAll(); $queryBuilder->reset(); return $result; } }