diff --git a/composer.json b/composer.json index 952552d..9bf6121 100644 --- a/composer.json +++ b/composer.json @@ -6,5 +6,10 @@ "psr-4": { "TipsTricks\\": "src" } + }, + "require": { + "php" : "7.3", + "zendframework/zend-db": "^2.10", + "inovia-team/matters-repository": "^1.1" } } diff --git a/composer.lock b/composer.lock index 1906415..02ddbd8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,205 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2e756aa16a51ab824d1775c97f233eb2", - "packages": [], + "content-hash": "600aeab7dca57e429628b0c20a869a53", + "packages": [ + { + "name": "inovia-team/matters-repository", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/matterstech/matters-repository.git", + "reference": "c4cc6f0cc7499e469f78e043d5c240c7f0f2f072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matterstech/matters-repository/zipball/c4cc6f0cc7499e469f78e043d5c240c7f0f2f072", + "reference": "c4cc6f0cc7499e469f78e043d5c240c7f0f2f072", + "shasum": "" + }, + "require": { + "zendframework/zend-db": "^2.9", + "zendframework/zend-hydrator": "^2.3" + }, + "require-dev": { + "mockery/mockery": "~0.9", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matters\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "Matters' proposal on how to use zendframework/zend-db", + "time": "2018-05-18T16:30:04+00:00" + }, + { + "name": "zendframework/zend-db", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-db.git", + "reference": "77022f06f6ffd384fa86d22ab8d8bbdb925a1e8e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-db/zipball/77022f06f6ffd384fa86d22ab8d8bbdb925a1e8e", + "reference": "77022f06f6ffd384fa86d22ab8d8bbdb925a1e8e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.25 || ^6.4.4", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-hydrator": "^1.1 || ^2.1 || ^3.0", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-eventmanager": "Zend\\EventManager component", + "zendframework/zend-hydrator": "Zend\\Hydrator component for using HydratingResultSets", + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.9-dev", + "dev-develop": "2.10-dev" + }, + "zf": { + "component": "Zend\\Db", + "config-provider": "Zend\\Db\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\Db\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations", + "keywords": [ + "ZendFramework", + "db", + "zf" + ], + "time": "2019-02-25T11:37:45+00:00" + }, + { + "name": "zendframework/zend-hydrator", + "version": "2.4.2", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-hydrator.git", + "reference": "2bfc6845019e7b6d38b0ab5e55190244dc510285" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-hydrator/zipball/2bfc6845019e7b6d38b0ab5e55190244dc510285", + "reference": "2bfc6845019e7b6d38b0ab5e55190244dc510285", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "zendframework/zend-stdlib": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0", + "zendframework/zend-filter": "^2.6", + "zendframework/zend-inputfilter": "^2.6", + "zendframework/zend-serializer": "^2.6.1", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" + }, + "suggest": { + "zendframework/zend-eventmanager": "^2.6.2 || ^3.0, to support aggregate hydrator usage", + "zendframework/zend-filter": "^2.6, to support naming strategy hydrator usage", + "zendframework/zend-serializer": "^2.6.1, to use the SerializableStrategy", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3, to support hydrator plugin manager usage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-release-2.4": "2.4.x-dev" + }, + "zf": { + "component": "Zend\\Hydrator", + "config-provider": "Zend\\Hydrator\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Zend\\Hydrator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Serialize objects to arrays, and vice versa", + "keywords": [ + "ZendFramework", + "hydrator", + "zf" + ], + "time": "2019-10-04T11:17:36+00:00" + }, + { + "name": "zendframework/zend-stdlib", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-stdlib.git", + "reference": "66536006722aff9e62d1b331025089b7ec71c065" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/66536006722aff9e62d1b331025089b7ec71c065", + "reference": "66536006722aff9e62d1b331025089b7ec71c065", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpbench/phpbench": "^0.13", + "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2", + "zendframework/zend-coding-standard": "~1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev", + "dev-develop": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "keywords": [ + "ZendFramework", + "stdlib", + "zf" + ], + "time": "2018-08-28T21:34:05+00:00" + } + ], "packages-dev": [ { "name": "doctrine/instantiator", diff --git a/src/Repo/Column.php b/src/Repo/Column.php new file mode 100644 index 0000000..aee4db2 --- /dev/null +++ b/src/Repo/Column.php @@ -0,0 +1,14 @@ +getFullName(), $columnName); + parent::__construct($expression); + } +} \ No newline at end of file diff --git a/src/Repo/Condition.php b/src/Repo/Condition.php new file mode 100644 index 0000000..8990230 --- /dev/null +++ b/src/Repo/Condition.php @@ -0,0 +1,14 @@ +appendExpression($expression); + } + + public function equals($left, $right) + { + $this->appendExpression(new Equals($left, $right)); + return $this; + } + + private function appendExpression(Expression $expression) + { + $this->parts[] = '('. $expression->getExpression() .')'; + $this->expression = implode(' AND ', $this->parts); + } +} diff --git a/src/Repo/Condition/Equals.php b/src/Repo/Condition/Equals.php new file mode 100644 index 0000000..53598fb --- /dev/null +++ b/src/Repo/Condition/Equals.php @@ -0,0 +1,25 @@ +castAsExpression($left); + $right = $this->castAsExpression($right); + + $expression = sprintf('%s = %s', $left->getExpression(), $right->getExpression()); + parent::__construct($expression); + } + + private function castAsExpression($expression) : Expression + { + if (!is_a($expression, Expression::class)) { + return new Expression($expression); + } + return $expression; + } +} \ No newline at end of file diff --git a/src/Repo/Condition/OrSql.php b/src/Repo/Condition/OrSql.php new file mode 100644 index 0000000..4d55f99 --- /dev/null +++ b/src/Repo/Condition/OrSql.php @@ -0,0 +1,23 @@ +appendExpression($expression); + } + + public function equals(Expression $left, Expression $right) + { + $this->appendExpression(new Equals($left, $right)); + } + + private function appendExpression(Expression $expression) + { + $this->expression .= ' OR ('. $expression->getExpression() .')'; + } +} diff --git a/src/Repo/Entity.php b/src/Repo/Entity.php new file mode 100644 index 0000000..8f4a6e3 --- /dev/null +++ b/src/Repo/Entity.php @@ -0,0 +1,23 @@ +id = $id; + $self->name = $name; + $self->plaque = $plaque; + return $self; + } +} diff --git a/src/Repo/Repo.php b/src/Repo/Repo.php new file mode 100644 index 0000000..e104e54 --- /dev/null +++ b/src/Repo/Repo.php @@ -0,0 +1,41 @@ +column('uuid'); + $vehicleId = $vehicles->column('resa_id'); + $transactionId = $transactions->column('resa_id'); + + $select = (new Select()) + ->from($resas) + ->join($vehicles, new Equals($resaId, $vehicleId)) + ->join($transactions, new Equals($resaId, $transactionId)) + ; + + + $plop = new Columns(Entity::class, [ + $resas->column('uuid'), + $resas->column('first_name'), + $vehicles->column('plaque') + ]); + + $where = new Where('uuid > 4'); + + return new Select($columns, $jointure, $where); + } +} +} \ No newline at end of file diff --git a/src/Repo/Select.php b/src/Repo/Select.php new file mode 100644 index 0000000..9b4235f --- /dev/null +++ b/src/Repo/Select.php @@ -0,0 +1,21 @@ +where->expression( + $expression->getExpression() + ); + } +} \ No newline at end of file diff --git a/src/Repo/TableIdentifier.php b/src/Repo/TableIdentifier.php new file mode 100644 index 0000000..5ed5c98 --- /dev/null +++ b/src/Repo/TableIdentifier.php @@ -0,0 +1,21 @@ +table, $this->schema)); + } + + public function getFullName() + { + if (!$this->schema) { + return sprintf('"%s"', $this->table); + } + return sprintf('"%s"."%s"', $this->schema, $this->table); + } +} \ No newline at end of file diff --git a/tests/Repo/RepoTest.php b/tests/Repo/RepoTest.php new file mode 100644 index 0000000..2950fdf --- /dev/null +++ b/tests/Repo/RepoTest.php @@ -0,0 +1,53 @@ +columns([ + 'title' , + 'officer' , + 'reference', + ]); + + $designs = new TableIdentifier('asset_design', 'mis'); + $invoices = new TableIdentifier('invoice', 'public'); + + $designJoinCondition = Condition::AndSql() + ->equals($designs->column('id'), $invoices->column('asset_id')) + ->equals($invoices->column('asset_type'), 'design'); + + $select->from($designs); + + $select->joinLeft( + $invoices, + $designJoinCondition, + [] + ); + + $select->where->equalTo( + $invoices->column('owner_id'), 4 + ); + + $platform = new class extends Postgresql + { + public function quoteValue($value) + { + return $value; + } + }; + self::assertSame( + 'SELECT "mis"."asset_design"."title" AS "title", "mis"."asset_design"."officer" AS "officer", "mis"."asset_design"."reference" AS "reference" FROM "mis"."asset_design" LEFT JOIN "public"."invoice" ON ("mis"."asset_design".id = "public"."invoice".asset_id) AND ("public"."invoice".asset_type = design) WHERE "public"."invoice".owner_id = 4', + $select->getSqlString($platform) + ); + } +} \ No newline at end of file