Skip to content

Commit 0333b39

Browse files
author
Falaleev Maxim
committed
New QueryBuilder
1 parent d144247 commit 0333b39

23 files changed

+241
-183
lines changed

AbstractModel.php

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ protected function insertInternal(array $fields = [])
7979

8080
$tableName = $qb->getQuotedName(TableNameResolver::getTableName($this->tableName()));
8181
$sql = $qb
82-
->insert($tableName)
82+
->insert()
83+
->table($tableName)
8384
->values($values)
8485
->toSQL();
8586
$inserted = $connection->executeUpdate($sql);
@@ -88,13 +89,11 @@ protected function insertInternal(array $fields = [])
8889
}
8990

9091
foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) {
91-
foreach (self::getMeta()->getPrimaryKeyName(true) as $primaryKeyName) {
92-
if (
93-
empty($this->getAttribute($this->getSequenceName())) ||
94-
in_array($primaryKeyName, $dirty) === false
95-
) {
96-
$values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName());
97-
}
92+
if (
93+
empty($this->getAttribute($this->getSequenceName())) ||
94+
in_array($primaryKeyName, $dirty) === false
95+
) {
96+
$values[$primaryKeyName] = $connection->lastInsertId($this->getSequenceName());
9897
}
9998
}
10099

Callback/JoinCallback.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Mindy\Orm\Fields\ManyToManyField;
1414
use Mindy\Orm\Fields\RelatedField;
1515
use Mindy\Orm\ModelInterface;
16-
use Mindy\QueryBuilder\LookupBuilder\LookupBuilder;
16+
use Mindy\QueryBuilder\LookupBuilder;
1717
use Mindy\QueryBuilder\QueryBuilder;
1818

1919
class JoinCallback

Callback/LookupCallback.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Mindy\Orm\Fields\RelatedField;
1515
use Mindy\Orm\Model;
1616
use Mindy\Orm\ModelInterface;
17-
use Mindy\QueryBuilder\LookupBuilder\LookupBuilder;
17+
use Mindy\QueryBuilder\LookupBuilder;
1818
use Mindy\QueryBuilder\QueryBuilder;
1919

2020
class LookupCallback

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
test:
2+
php ./vendor/bin/phpunit
3+
4+
test-coverage:
5+
php -dzend_extension=/usr/local/opt/php71-xdebug/xdebug.so ./vendor/bin/phpunit --coverage-html=./coverage

ManyToManyManager.php

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
use Exception;
1414
use Mindy\QueryBuilder\QueryBuilder;
15+
use Mindy\QueryBuilder\QueryBuilderFactory;
16+
use Mindy\QueryBuilder\Utils\TableNameResolver;
1517

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

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

9597
/**
@@ -125,16 +127,21 @@ protected function linkUnlinkProcess(Model $model, $link = true, array $extra =
125127
return $through->pk;
126128
}
127129
$db = $this->primaryModel->getConnection();
128-
$builder = QueryBuilder::getInstance($db);
130+
$builder = QueryBuilderFactory::getQueryBuilder($db);
129131
$data = array_merge([
130132
$this->primaryModelColumn => $this->primaryModel->pk,
131133
$this->modelColumn => $model->pk,
132134
], $extra);
133-
$adapter = $builder->getAdapter();
134135
if ($link) {
135-
$state = $model->getConnection()->insert($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data);
136+
$state = $model->getConnection()->insert(
137+
$builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)),
138+
$data
139+
);
136140
} else {
137-
$state = $model->getConnection()->delete($adapter->quoteTableName($adapter->getRawTableName($this->relatedTable)), $data);
141+
$state = $model->getConnection()->delete(
142+
$builder->getQuotedName(TableNameResolver::getTableName($this->relatedTable)),
143+
$data
144+
);
138145
}
139146

140147
return $state;

QuerySet.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -564,18 +564,18 @@ public function delete()
564564
*/
565565
public function deleteSql()
566566
{
567-
// if ($this->filterHasJoin()) {
567+
// if ($this->filterHasJoin()) {
568568
// $this->prepareConditions();
569569
// return $this->createCommand()->delete($tableName, [
570570
// $this->getPrimaryKeyName() => $this->valuesList(['pk'], true)
571571
// ], $this->params);
572572
// }
573573

574-
$builder = $this->getQueryBuilder()
575-
->setTypeDelete()
576-
->setAlias(null);
577-
578-
return $builder->toSQL();
574+
return $this
575+
->getQueryBuilder()
576+
->delete($this->getModel()->tableName())
577+
->setAlias(null)
578+
->toSQL();
579579
}
580580

581581
/**

QuerySetBase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ public function getQueryBuilder()
134134
$builder->setAlias($this->getTableAlias());
135135
$model = $this->getModel();
136136
$meta = $model->getMeta();
137-
$builder->from($model->tableName());
137+
$builder->table($model->tableName());
138138

139139
$fetchColumnCallback = new FetchColumnCallback($model, $meta);
140140
$callback = new LookupCallback($model);

Sync.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,16 @@ public function dropTable(ModelInterface $model)
125125

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

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

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

132132
$schemaManager = $this->connection->getSchemaManager();
133133
foreach ($model->getMeta()->getManyToManyFields() as $field) {
134134
if ($field->through === null) {
135-
$fieldTable = $adapter->getRawTableName($field->getTableName());
135+
$fieldTable = TableNameResolver::getTableName($field->getTableName());
136136
if ($this->hasTable($fieldTable)) {
137-
$schemaManager->dropTable($adapter->quoteTableName($fieldTable));
137+
$schemaManager->dropTable($builder->getQuotedName($fieldTable));
138138
$i += 1;
139139
}
140140
}

Tests/Basic/CrudTest.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
use Mindy\Orm\Tests\Models\User;
1616
use Mindy\Orm\Tests\OrmDatabaseTestCase;
1717
use Mindy\QueryBuilder\QueryBuilder;
18+
use Mindy\QueryBuilder\QueryBuilderFactory;
19+
use Mindy\QueryBuilder\Utils\TableNameResolver;
1820

1921
abstract class CrudTest extends OrmDatabaseTestCase
2022
{
@@ -26,9 +28,8 @@ public function getModels()
2628
public function testLastInsertId()
2729
{
2830
$c = $this->getConnection();
29-
$adapter = QueryBuilder::getInstance($c)->getAdapter();
3031
$model = new User();
31-
$tableName = $adapter->getRawTableName($model->tableName());
32+
$tableName = TableNameResolver::getTableName($model->tableName());
3233
$c->insert($tableName, ['username' => 'foo']);
3334
$this->assertEquals(1, $c->lastInsertId($model->getSequenceName()));
3435
}
@@ -39,8 +40,8 @@ public function testBrokenLastInsertId()
3940
$this->markTestSkipped('mysql specific test');
4041
}
4142
$c = $this->getConnection();
42-
$adapter = QueryBuilder::getInstance($c)->getAdapter();
43-
$c->insert($adapter->quoteTableName($adapter->getRawTableName(User::tableName())), ['username' => 'foo']);
43+
$builder = QueryBuilderFactory::getQueryBuilder($c);
44+
$c->insert($builder->getQuotedName(TableNameResolver::getTableName(User::tableName())), ['username' => 'foo']);
4445

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

Tests/Databases/Mysql/MysqlLookupTest.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ public function testYear()
2323
$this->assertTrue((new ProductList(['name' => 'bar', 'date_action' => '2013-03-29 10:35:45']))->save());
2424

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 commit comments

Comments
 (0)