Skip to content

Commit

Permalink
New QueryBuilder
Browse files Browse the repository at this point in the history
  • Loading branch information
Falaleev Maxim committed Feb 5, 2018
1 parent d144247 commit 0333b39
Show file tree
Hide file tree
Showing 23 changed files with 241 additions and 183 deletions.
15 changes: 7 additions & 8 deletions AbstractModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,8 @@ protected function insertInternal(array $fields = [])

$tableName = $qb->getQuotedName(TableNameResolver::getTableName($this->tableName()));
$sql = $qb
->insert($tableName)
->insert()
->table($tableName)
->values($values)
->toSQL();
$inserted = $connection->executeUpdate($sql);
Expand All @@ -88,13 +89,11 @@ protected function insertInternal(array $fields = [])
}

foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) {
foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) {
if (
empty($this->getAttribute($this->getSequenceName())) ||
in_array($primaryKeyName, $dirty) === false
) {
$values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName());
}
if (
empty($this->getAttribute($this->getSequenceName())) ||
in_array($primaryKeyName, $dirty) === false
) {
$values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName());
}
}

Expand Down
2 changes: 1 addition & 1 deletion Callback/JoinCallback.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
use Mindy\Orm\Fields\ManyToManyField;
use Mindy\Orm\Fields\RelatedField;
use Mindy\Orm\ModelInterface;
use Mindy\QueryBuilder\LookupBuilder\LookupBuilder;
use Mindy\QueryBuilder\LookupBuilder;
use Mindy\QueryBuilder\QueryBuilder;

class JoinCallback
Expand Down
2 changes: 1 addition & 1 deletion Callback/LookupCallback.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
use Mindy\Orm\Fields\RelatedField;
use Mindy\Orm\Model;
use Mindy\Orm\ModelInterface;
use Mindy\QueryBuilder\LookupBuilder\LookupBuilder;
use Mindy\QueryBuilder\LookupBuilder;
use Mindy\QueryBuilder\QueryBuilder;

class LookupCallback
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
test:
php ./vendor/bin/phpunit

test-coverage:
php -dzend_extension=/usr/local/opt/php71-xdebug/xdebug.so ./vendor/bin/phpunit --coverage-html=./coverage
19 changes: 13 additions & 6 deletions ManyToManyManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

use Exception;
use Mindy\QueryBuilder\QueryBuilder;
use Mindy\QueryBuilder\QueryBuilderFactory;
use Mindy\QueryBuilder\Utils\TableNameResolver;

/**
* Class ManyToManyManager.
Expand Down Expand Up @@ -87,9 +89,9 @@ public function clean()
throw new Exception('Unable to clean models: the primary key of '.get_class($this->primaryModel).' is null.');
}
$db = $this->primaryModel->getConnection();
$adapter = QueryBuilder::getInstance($db)->getAdapter();
$builder = QueryBuilderFactory::getQueryBuilder($db);

return $db->delete($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), [$this->primaryModelColumn => $this->primaryModel->pk]);
return $db->delete($builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)), [$this->primaryModelColumn => $this->primaryModel->pk]);
}

/**
Expand Down Expand Up @@ -125,16 +127,21 @@ protected function linkUnlinkProcess(Model $model, $link = true, array $extra =
return $through->pk;
}
$db = $this->primaryModel->getConnection();
$builder = QueryBuilder::getInstance($db);
$builder = QueryBuilderFactory::getQueryBuilder($db);
$data = array_merge([
$this->primaryModelColumn => $this->primaryModel->pk,
$this->modelColumn => $model->pk,
], $extra);
$adapter = $builder->getAdapter();
if ($link) {
$state = $model->getConnection()->insert($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data);
$state = $model->getConnection()->insert(
$builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)),
$data
);
} else {
$state = $model->getConnection()->delete($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data);
$state = $model->getConnection()->delete(
$builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)),
$data
);
}

return $state;
Expand Down
12 changes: 6 additions & 6 deletions QuerySet.php
Original file line number Diff line number Diff line change
Expand Up @@ -564,18 +564,18 @@ public function delete()
*/
public function deleteSql()
{
// if ($this->filterHasJoin()) {
// if ($this->filterHasJoin()) {
// $this->prepareConditions();
// return $this->createCommand()->delete($tableName, [
// $this->getPrimaryKeyName() => $this->valuesList(['pk'], true)
// ], $this->params);
// }

$builder = $this->getQueryBuilder()
->setTypeDelete()
->setAlias(null);

return $builder->toSQL();
return $this
->getQueryBuilder()
->delete($this->getModel()->tableName())
->setAlias(null)
->toSQL();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion QuerySetBase.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public function getQueryBuilder()
$builder->setAlias($this->getTableAlias());
$model = $this->getModel();
$meta = $model->getMeta();
$builder->from($model->tableName());
$builder->table($model->tableName());

$fetchColumnCallback = new FetchColumnCallback($model, $meta);
$callback = new LookupCallback($model);
Expand Down
6 changes: 3 additions & 3 deletions Sync.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,16 @@ public function dropTable(ModelInterface $model)

$model->setConnection($this->connection);

$adapter = $this->getQueryBuilder()->getAdapter();
$builder = $this->getQueryBuilder();

// $this->connection->executeUpdate($adapter->sqlCheckIntegrity(false, 'public', $model->tableName()));

$schemaManager = $this->connection->getSchemaManager();
foreach ($model->getMeta()->getManyToManyFields() as $field) {
if ($field->through === null) {
$fieldTable = $adapter->getRawTableName($field->getTableName());
$fieldTable = TableNameResolver::getTableName($field->getTableName());
if ($this->hasTable($fieldTable)) {
$schemaManager->dropTable($adapter->quoteTableName($fieldTable));
$schemaManager->dropTable($builder->getQuotedName($fieldTable));
$i += 1;
}
}
Expand Down
11 changes: 6 additions & 5 deletions Tests/Basic/CrudTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
use Mindy\Orm\Tests\Models\User;
use Mindy\Orm\Tests\OrmDatabaseTestCase;
use Mindy\QueryBuilder\QueryBuilder;
use Mindy\QueryBuilder\QueryBuilderFactory;
use Mindy\QueryBuilder\Utils\TableNameResolver;

abstract class CrudTest extends OrmDatabaseTestCase
{
Expand All @@ -26,9 +28,8 @@ public function getModels()
public function testLastInsertId()
{
$c = $this->getConnection();
$adapter = QueryBuilder::getInstance($c)->getAdapter();
$model = new User();
$tableName = $adapter->getRawTableName($model->tableName());
$tableName = TableNameResolver::getTableName($model->tableName());
$c->insert($tableName, ['username' => 'foo']);
$this->assertEquals(1, $c->lastInsertId($model->getSequenceName()));
}
Expand All @@ -39,8 +40,8 @@ public function testBrokenLastInsertId()
$this->markTestSkipped('mysql specific test');
}
$c = $this->getConnection();
$adapter = QueryBuilder::getInstance($c)->getAdapter();
$c->insert($adapter->quoteTableName($adapter->getRawTableName(User::tableName())), ['username' => 'foo']);
$builder = QueryBuilderFactory::getQueryBuilder($c);
$c->insert($builder->getQuotedName(TableNameResolver::getTableName(User::tableName())), ['username' => 'foo']);

// Выполняется запрос после INSERT
$c->query('SELECT 1+1')->fetchAll();
Expand Down Expand Up @@ -332,7 +333,7 @@ public function testIssue11()
]);
$this->assertEquals(1, $modelOne->pk);
$sql = Solution::objects()->filter(['id' => '1'])->updateSql(['status' => 2]);
$this->assertSql("UPDATE [[solution]] SET [[status]]=2 WHERE ([[id]]='1')", $sql);
$this->assertSql("UPDATE [[solution]] SET status = '2' WHERE (id = '1')", $sql);
$this->dropModels([new Solution()], $this->getConnection());
}

Expand Down
38 changes: 19 additions & 19 deletions Tests/Databases/Mysql/MysqlLookupTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ public function testYear()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-29 10:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__year' => 2014]);
$this->assertSql(
'SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]])=@2014@)',
$this->assertSame(
'SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action) = \'2014\')',
$qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__year' => '2012']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(YEAR FROM [[product_list_1]].[[date_action]])=@2012@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(YEAR FROM product_list_1.date_action) = \'2012\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -39,11 +39,11 @@ public function testMonth()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-02-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__month' => 4]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]])=@4@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action) = \'4\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__month' => '3']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MONTH FROM [[product_list_1]].[[date_action]])=@3@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MONTH FROM product_list_1.date_action) = \'3\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -53,11 +53,11 @@ public function testDay()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__day' => 29]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]])=@29@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action) = \'29\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__day' => '30']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(DAY FROM [[product_list_1]].[[date_action]])=@30@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(DAY FROM product_list_1.date_action) = \'30\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -67,11 +67,11 @@ public function testWeekDay()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__week_day' => 2]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (DAYOFWEEK([[product_list_1]].[[date_action]])=@3@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (DAYOFWEEK(product_list_1.date_action) = \'3\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__week_day' => '5']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (DAYOFWEEK([[product_list_1]].[[date_action]])=@6@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (DAYOFWEEK(product_list_1.date_action) = \'6\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -81,11 +81,11 @@ public function testHour()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 9:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__hour' => 10]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]])=@10@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action) = \'10\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__hour' => '11']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(HOUR FROM [[product_list_1]].[[date_action]])=@11@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(HOUR FROM product_list_1.date_action) = \'11\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -95,11 +95,11 @@ public function testMinute()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:34:45']))->save());

$qs = ProductList::objects()->filter(['date_action__minute' => 35]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]])=@35@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action) = \'35\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__minute' => '36']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(MINUTE FROM [[product_list_1]].[[date_action]])=@36@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(MINUTE FROM product_list_1.date_action) = \'36\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -109,11 +109,11 @@ public function testSecond()
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['date_action__second' => 45]);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]])=@45@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action) = \'45\')', $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['date_action__second' => '46']);
$this->assertSql('SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (EXTRACT(SECOND FROM [[product_list_1]].[[date_action]])=@46@)', $qs->countSql());
$this->assertSame('SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (EXTRACT(SECOND FROM product_list_1.date_action) = \'46\')', $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -123,11 +123,11 @@ public function testRegex()
$this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2013-03-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['name__regex' => '[a-z]']);
$this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (BINARY [[product_list_1]].[[name]] REGEXP '[a-z]')", $qs->countSql());
$this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (BINARY product_list_1.name REGEXP '[a-z]')", $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['name__regex' => '[0-9]']);
$this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE (BINARY [[product_list_1]].[[name]] REGEXP '[0-9]')", $qs->countSql());
$this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (BINARY product_list_1.name REGEXP '[0-9]')", $qs->countSql());
$this->assertEquals(0, $qs->count());
}

Expand All @@ -137,11 +137,11 @@ public function testIregex()
$this->assertTrue((new ProductList(['name' => '@@@', 'date_action' => '2013-03-28 10:35:45']))->save());

$qs = ProductList::objects()->filter(['name__iregex' => '[A-Z]']);
$this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '[A-Z]')", $qs->countSql());
$this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '[A-Z]')", $qs->countSql());
$this->assertEquals(1, $qs->count());

$qs = ProductList::objects()->filter(['name__iregex' => '[0-9]']);
$this->assertSql("SELECT COUNT(*) FROM [[product_list]] AS [[product_list_1]] WHERE ([[product_list_1]].[[name]] REGEXP '[0-9]')", $qs->countSql());
$this->assertSame("SELECT COUNT(*) FROM product_list AS product_list_1 WHERE (product_list_1.name REGEXP '[0-9]')", $qs->countSql());
$this->assertEquals(0, $qs->count());
}
}
Loading

0 comments on commit 0333b39

Please sign in to comment.