Skip to content

Commit a2c1e2c

Browse files
authored
Merge pull request #136 from skipperbent/v4-development
Version 4.15.0
2 parents 472ec91 + 11b4fa5 commit a2c1e2c

File tree

13 files changed

+97
-74
lines changed

13 files changed

+97
-74
lines changed

.phpunit.result.cache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
C:37:"PHPUnit\Runner\DefaultTestResultCache":7432:{a:2:{s:7:"defects";a:47:{s:39:"Pecee\Pixie\QueryBuilderTest::testAlias";i:4;s:45:"Pecee\Pixie\QueryBuilderTest::testDeleteQuery";i:4;s:50:"Pecee\Pixie\QueryBuilderTest::testEventPropagation";i:4;s:51:"Pecee\Pixie\QueryBuilderTest::testInsertIgnoreQuery";i:4;s:65:"Pecee\Pixie\QueryBuilderTest::testInsertOnDuplicateKeyUpdateQuery";i:4;s:45:"Pecee\Pixie\QueryBuilderTest::testInsertQuery";i:4;s:70:"Pecee\Pixie\QueryBuilderTest::testIsPossibleToUseSubqueryInWhereClause";i:4;s:73:"Pecee\Pixie\QueryBuilderTest::testIsPossibleToUseSubqueryInWhereNotClause";i:4;s:52:"Pecee\Pixie\QueryBuilderTest::testOrderByFlexibility";i:4;s:61:"Pecee\Pixie\QueryBuilderTest::testRawStatementsWithinCriteria";i:4;s:61:"Pecee\Pixie\QueryBuilderTest::testRawStatementWithinStatement";i:4;s:58:"Pecee\Pixie\QueryBuilderTest::testRawStatementWithinSelect";i:3;s:46:"Pecee\Pixie\QueryBuilderTest::testReplaceQuery";i:4;s:47:"Pecee\Pixie\QueryBuilderTest::testSelectAliases";i:4;s:48:"Pecee\Pixie\QueryBuilderTest::testSelectDistinct";i:4;s:62:"Pecee\Pixie\QueryBuilderTest::testSelectDistinctAndSelectCalls";i:4;s:64:"Pecee\Pixie\QueryBuilderTest::testSelectDistinctWithSingleColumn";i:4;s:51:"Pecee\Pixie\QueryBuilderTest::testSelectFlexibility";i:4;s:45:"Pecee\Pixie\QueryBuilderTest::testSelectQuery";i:3;s:71:"Pecee\Pixie\QueryBuilderTest::testSelectQueryWithNestedCriteriaAndJoins";i:4;s:53:"Pecee\Pixie\QueryBuilderTest::testSelectQueryWithNull";i:4;s:55:"Pecee\Pixie\QueryBuilderTest::testSelectWithQueryEvents";i:4;s:52:"Pecee\Pixie\QueryBuilderTest::testStandaloneWhereNot";i:4;s:45:"Pecee\Pixie\QueryBuilderTest::testUpdateQuery";i:4;s:53:"Pecee\Pixie\QueryBuilderTest::testDeleteAdvancedQuery";i:4;s:53:"Pecee\Pixie\QueryBuilderTest::testUpdateAdvancedQuery";i:4;s:46:"Pecee\Pixie\QueryBuilderTest::testFromSubQuery";i:4;s:44:"Pecee\Pixie\QueryBuilderTest::testTableAlias";i:4;s:54:"Pecee\Pixie\QueryBuilderTest::testWhereNotNullSubQuery";i:4;s:43:"Pecee\Pixie\QueryBuilderTest::testJoinUsing";i:4;s:55:"Pecee\Pixie\QueryBuilderTest::testJoinQueryBuilderUsing";i:4;s:60:"Pecee\Pixie\CustomExceptionsTest::testTableNotFoundException";i:4;s:61:"Pecee\Pixie\CustomExceptionsTest::testColumnNotFoundException";i:4;s:61:"Pecee\Pixie\CustomExceptionsTest::testDuplicateEntryException";i:4;s:75:"Pecee\Pixie\CustomExceptionsTest::testQueryAggregateColumnNotFoundException";i:4;s:57:"Pecee\Pixie\CustomExceptionsTest::testForeignKeyException";i:4;s:54:"Pecee\Pixie\CustomExceptionsTest::testNotNullException";i:4;s:53:"Pecee\Pixie\QueryBuilderAggregateTest::testQueryCount";i:4;s:59:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQueryCount";i:4;s:51:"Pecee\Pixie\QueryBuilderAggregateTest::testQuerySum";i:4;s:57:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQuerySum";i:4;s:55:"Pecee\Pixie\QueryBuilderAggregateTest::testQueryAverage";i:4;s:61:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQueryAverage";i:4;s:50:"Pecee\Pixie\TransactionTest::testTransactionResult";i:4;s:51:"Pecee\Pixie\TransactionTest::testNestedTransactions";i:4;s:58:"Pecee\Pixie\TransactionTest::testTransactionMultipleInsert";i:4;s:42:"Pecee\Pixie\TransactionTest::testLastQuery";i:4;}s:5:"times";a:64:{s:39:"Pecee\Pixie\QueryBuilderTest::testAlias";d:0.001;s:45:"Pecee\Pixie\QueryBuilderTest::testDeleteQuery";d:0;s:50:"Pecee\Pixie\QueryBuilderTest::testEventPropagation";d:0.001;s:51:"Pecee\Pixie\QueryBuilderTest::testInsertIgnoreQuery";d:0;s:65:"Pecee\Pixie\QueryBuilderTest::testInsertOnDuplicateKeyUpdateQuery";d:0;s:45:"Pecee\Pixie\QueryBuilderTest::testInsertQuery";d:0;s:70:"Pecee\Pixie\QueryBuilderTest::testIsPossibleToUseSubqueryInWhereClause";d:0;s:73:"Pecee\Pixie\QueryBuilderTest::testIsPossibleToUseSubqueryInWhereNotClause";d:0;s:52:"Pecee\Pixie\QueryBuilderTest::testOrderByFlexibility";d:0;s:61:"Pecee\Pixie\QueryBuilderTest::testRawStatementsWithinCriteria";d:0;s:61:"Pecee\Pixie\QueryBuilderTest::testRawStatementWithinStatement";d:0.001;s:58:"Pecee\Pixie\QueryBuilderTest::testRawStatementWithinSelect";d:0;s:46:"Pecee\Pixie\QueryBuilderTest::testReplaceQuery";d:0;s:47:"Pecee\Pixie\QueryBuilderTest::testSelectAliases";d:0;s:48:"Pecee\Pixie\QueryBuilderTest::testSelectDistinct";d:0;s:62:"Pecee\Pixie\QueryBuilderTest::testSelectDistinctAndSelectCalls";d:0;s:64:"Pecee\Pixie\QueryBuilderTest::testSelectDistinctWithSingleColumn";d:0;s:51:"Pecee\Pixie\QueryBuilderTest::testSelectFlexibility";d:0;s:45:"Pecee\Pixie\QueryBuilderTest::testSelectQuery";d:0.001;s:71:"Pecee\Pixie\QueryBuilderTest::testSelectQueryWithNestedCriteriaAndJoins";d:0.001;s:53:"Pecee\Pixie\QueryBuilderTest::testSelectQueryWithNull";d:0;s:55:"Pecee\Pixie\QueryBuilderTest::testSelectWithQueryEvents";d:0.001;s:52:"Pecee\Pixie\QueryBuilderTest::testStandaloneWhereNot";d:0;s:45:"Pecee\Pixie\QueryBuilderTest::testUpdateQuery";d:0.001;s:53:"Pecee\Pixie\QueryBuilderTest::testDeleteAdvancedQuery";d:0;s:53:"Pecee\Pixie\QueryBuilderTest::testUpdateAdvancedQuery";d:0.001;s:46:"Pecee\Pixie\QueryBuilderTest::testFromSubQuery";d:0;s:44:"Pecee\Pixie\QueryBuilderTest::testTableAlias";d:0;s:54:"Pecee\Pixie\QueryBuilderTest::testWhereNotNullSubQuery";d:0;s:43:"Pecee\Pixie\QueryBuilderTest::testJoinUsing";d:0;s:55:"Pecee\Pixie\QueryBuilderTest::testJoinQueryBuilderUsing";d:0;s:42:"Pecee\Pixie\ConnectionTest::testConnection";d:0.051;s:47:"Pecee\Pixie\ConnectionTest::testMultiConnection";d:0.001;s:57:"Pecee\Pixie\CustomExceptionsTest::testConnectionException";d:0.005;s:60:"Pecee\Pixie\CustomExceptionsTest::testTableNotFoundException";d:0.053;s:61:"Pecee\Pixie\CustomExceptionsTest::testColumnNotFoundException";d:0.056;s:61:"Pecee\Pixie\CustomExceptionsTest::testDuplicateEntryException";d:0.051;s:75:"Pecee\Pixie\CustomExceptionsTest::testQueryAggregateColumnNotFoundException";d:0.048;s:57:"Pecee\Pixie\CustomExceptionsTest::testForeignKeyException";d:0.047;s:54:"Pecee\Pixie\CustomExceptionsTest::testNotNullException";d:0.04;s:45:"Pecee\Pixie\NoTableSubQueryTest::testRawQuery";d:0.001;s:53:"Pecee\Pixie\QueryBuilderAggregateTest::testQueryCount";d:0.037;s:59:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQueryCount";d:0.002;s:51:"Pecee\Pixie\QueryBuilderAggregateTest::testQuerySum";d:0.038;s:57:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQuerySum";d:0.002;s:55:"Pecee\Pixie\QueryBuilderAggregateTest::testQueryAverage";d:0.041;s:61:"Pecee\Pixie\QueryBuilderAggregateTest::testSqliteQueryAverage";d:0.001;s:44:"Pecee\Pixie\QueryBuilder::testFalseBoolWhere";d:0;s:59:"Pecee\Pixie\QueryBuilder::testInsertQueryReturnsIdForInsert";d:0.002;s:65:"Pecee\Pixie\QueryBuilder::testInsertQueryReturnsIdForInsertIgnore";d:0;s:68:"Pecee\Pixie\QueryBuilder::testInsertQueryReturnsNullForIgnoredInsert";d:0;s:38:"Pecee\Pixie\QueryBuilder::testRawQuery";d:0;s:43:"Pecee\Pixie\QueryBuilder::testNullableWhere";d:0;s:42:"Pecee\Pixie\QueryBuilder::testWhereBetween";d:0;s:35:"Pecee\Pixie\QueryBuilder::testUnion";d:0.001;s:43:"Pecee\Pixie\QueryBuilder::testUnionSubQuery";d:0;s:44:"Pecee\Pixie\QueryBuilder::testQueryOverwrite";d:0.001;s:40:"Pecee\Pixie\QueryBuilder::testGetColumns";d:0.001;s:42:"Pecee\Pixie\QueryBuilder::testQueryPartFor";d:0.001;s:41:"Pecee\Pixie\QueryBuilder::testRemoveQuery";d:0.001;s:50:"Pecee\Pixie\TransactionTest::testTransactionResult";d:0.043;s:51:"Pecee\Pixie\TransactionTest::testNestedTransactions";d:0.051;s:58:"Pecee\Pixie\TransactionTest::testTransactionMultipleInsert";d:0.046;s:42:"Pecee\Pixie\TransactionTest::testLastQuery";d:0.042;}}}

README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,16 +1105,16 @@ The event needs a custom callback function with a `EventArguments` object as par
11051105
**Examples:**
11061106

11071107
```php
1108-
$queryBuilder->registerEvent(EventHandler::EVENT_BEFORE_SELECT, 'users', function(EventArguments $arguments)
1108+
$queryBuilder->registerEvent(EventHandler::EVENT_BEFORE_SELECT, function(EventArguments $arguments)
11091109
{
11101110
$arguments
11111111
->getQueryBuilder()
11121112
->where('status', '!=', 'banned');
1113-
});
1113+
}, 'users');
11141114
```
11151115
Now every time a select query occurs on `users` table, it will add this where criteria, so banned users don't get access.
11161116

1117-
The syntax is `registerEvent('event type', 'table name', action in a closure)`.
1117+
The syntax is `registerEvent('event type', action in a closure, 'table name')`.
11181118

11191119
If you want the event to be performed when **any table is being queried**, provide `':any'` as table name.
11201120

@@ -1123,7 +1123,7 @@ If you want the event to be performed when **any table is being queried**, provi
11231123
After inserting data into `my_table`, details will be inserted into another table
11241124

11251125
```php
1126-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'my_table', function(EventArguments $arguments)
1126+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, function(EventArguments $arguments)
11271127
{
11281128
$arguments
11291129
->getQueryBuilder()
@@ -1132,13 +1132,13 @@ $queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'my_table', funct
11321132
'details' => 'Meh',
11331133
'age' => 5
11341134
));
1135-
});
1135+
}, 'my_table');
11361136
```
11371137

11381138
Whenever data is inserted into `person_details` table, set the timestamp field `created_at`, so we don't have to specify it everywhere:
11391139

11401140
```php
1141-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'person_details', function(EventArguments $arguments)
1141+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, function(EventArguments $arguments)
11421142
{
11431143
$arguments
11441144
->getQueryBuilder()
@@ -1147,13 +1147,13 @@ $queryBuilder->registerEvent(EventHandler::EVENT_AFTER_INSERT, 'person_details',
11471147
->update([
11481148
'created_at' => date('Y-m-d H:i:s')
11491149
]);
1150-
});
1150+
}, 'person_details');
11511151
```
11521152

11531153
After deleting from `my_table` delete the relations:
11541154

11551155
```php
1156-
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_DELETE, 'my_table', function(EventArguments $arguments)
1156+
$queryBuilder->registerEvent(EventHandler::EVENT_AFTER_DELETE, function(EventArguments $arguments)
11571157
{
11581158
$bindings = $arguments->getQuery()->getBindings();
11591159

@@ -1162,7 +1162,7 @@ $queryBuilder->registerEvent(EventHandler::EVENT_AFTER_DELETE, 'my_table', funct
11621162
->table('person_details')
11631163
->where('person_id', $binding[0])
11641164
->delete();
1165-
});
1165+
}, 'my_table');
11661166
```
11671167

11681168
Pixie passes the current instance of query builder as first parameter of your closure so you can build queries with this object, you can do anything like usual query builder (`QB`).

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"ext-pdo": "*"
3939
},
4040
"require-dev": {
41-
"phpunit/phpunit": "^7.0",
41+
"phpunit/phpunit": "^8.0",
4242
"mockery/mockery": "^1",
4343
"ext-pdo_sqlite": "*",
4444
"phpstan/phpstan": "^0",
@@ -60,4 +60,4 @@
6060
],
6161
"phpstan": "phpstan analyse"
6262
}
63-
}
63+
}

src/Pecee/Pixie/Connection.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,14 +201,14 @@ public function getLastQuery(): ?QueryObject
201201
* Register new event
202202
*
203203
* @param string $name
204-
* @param string|null $table
205204
* @param \Closure $action
205+
* @param string $table
206206
*
207207
* @return void
208208
*/
209-
public function registerEvent($name, $table = null, \Closure $action): void
209+
public function registerEvent(string $name, \Closure $action, string $table = EventHandler::TABLE_ANY): void
210210
{
211-
$this->getEventHandler()->registerEvent($name, $table, $action);
211+
$this->getEventHandler()->registerEvent($name, $action, $table);
212212
}
213213

214214
/**
@@ -225,4 +225,4 @@ public function __destruct()
225225
$this->close();
226226
}
227227

228-
}
228+
}

src/Pecee/Pixie/Event/EventHandler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,12 @@ public function getEvents(): array
177177

178178
/**
179179
* @param string $event
180-
* @param string|null $table
181180
* @param \Closure $action
181+
* @param string $table
182182
*
183183
* @return void
184184
*/
185-
public function registerEvent(string $event, ?string $table = null, \Closure $action): void
185+
public function registerEvent(string $event, \Closure $action, string $table = EventHandler::TABLE_ANY): void
186186
{
187187
$this->events[$table ?? static::TABLE_ANY][$event] = $action;
188188
}

src/Pecee/Pixie/QueryBuilder/Adapters/BaseAdapter.php

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,23 @@ abstract class BaseAdapter
6060
*/
6161
protected $connection;
6262

63+
/**
64+
* Join different part of queries with a space.
65+
*
66+
* @param array $pieces
67+
*
68+
* @return string
69+
*/
70+
protected function concatenateQuery(array $pieces): string
71+
{
72+
$str = '';
73+
foreach ($pieces as $piece) {
74+
$str = trim($str) . ' ' . trim($piece);
75+
}
76+
77+
return trim($str);
78+
}
79+
6380
/**
6481
* Alias prefix
6582
* @var string|null
@@ -306,23 +323,6 @@ protected function buildJoin(array $statements): string
306323
return $sql;
307324
}
308325

309-
/**
310-
* Join different part of queries with a space.
311-
*
312-
* @param array $pieces
313-
*
314-
* @return string
315-
*/
316-
protected function concatenateQuery(array $pieces): string
317-
{
318-
$str = '';
319-
foreach ($pieces as $piece) {
320-
$str = trim($str) . ' ' . trim($piece);
321-
}
322-
323-
return trim($str);
324-
}
325-
326326
/**
327327
* Return table name with alias
328328
* eg. foo as f
@@ -527,14 +527,13 @@ public function replace(array $statements, array $data): array
527527
}
528528

529529
/**
530-
* Build select query string and bindings
530+
* Sets select statements and returns status of distinct tables.
531531
*
532532
* @param array $statements
533-
*
534-
* @throws Exception
535-
* @return array
533+
* @param array $bindings
534+
* @return bool Returns true if distinct tables are found.
536535
*/
537-
public function select(array $statements): array
536+
protected function setSelectStatement(array &$statements, array &$bindings): bool
538537
{
539538
$hasDistincts = false;
540539

@@ -551,13 +550,36 @@ public function select(array $statements): array
551550
$statements['selects'] = ['*'];
552551
}
553552

553+
554+
foreach ((array)$statements['selects'] as $select) {
555+
if ($select instanceof Raw) {
556+
$bindings += $select->getBindings();
557+
}
558+
}
559+
560+
return $hasDistincts;
561+
}
562+
563+
/**
564+
* Build select query string and bindings
565+
*
566+
* @param array $statements
567+
*
568+
* @throws Exception
569+
* @return array
570+
*/
571+
public function select(array $statements): array
572+
{
573+
$bindings = [];
574+
575+
$hasDistincts = $this->setSelectStatement($statements, $bindings);
576+
554577
// From
555578
$fromEnabled = false;
556579
$tables = '';
557580

558581
if (isset($statements['tables']) === true) {
559582
$tablesFound = [];
560-
561583
foreach ((array)$statements['tables'] as $table) {
562584
if ($table instanceof Raw) {
563585
$t = $table;
@@ -596,6 +618,7 @@ public function select(array $statements): array
596618
$sql = $this->buildUnion($statements, $sql);
597619

598620
$bindings = array_merge(
621+
$bindings,
599622
$whereBindings,
600623
$havingBindings
601624
);

src/Pecee/Pixie/QueryBuilder/Adapters/Sqlserver.php

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,8 @@ protected function buildQueryPart(string $section, array $statements): string
5757
*/
5858
public function select(array $statements): array
5959
{
60-
$hasDistincts = false;
61-
62-
if (isset($statements['distincts']) === true && \count($statements['distincts']) > 0) {
63-
$hasDistincts = true;
64-
65-
if (isset($statements['selects']) === true && \count($statements['selects']) > 0) {
66-
$statements['selects'] = array_merge($statements['distincts'], $statements['selects']);
67-
} else {
68-
$statements['selects'] = $statements['distincts'];
69-
}
70-
71-
} else if (isset($statements['selects']) === false) {
72-
$statements['selects'] = ['*'];
73-
}
60+
$bindings = [];
61+
$hasDistincts = $this->setSelectStatement($statements, $bindings);
7462

7563
// From
7664
$fromEnabled = false;
@@ -123,6 +111,7 @@ public function select(array $statements): array
123111
$sql = $this->buildUnion($statements, $sql);
124112

125113
$bindings = array_merge(
114+
$bindings,
126115
$whereBindings,
127116
$havingBindings
128117
);

src/Pecee/Pixie/QueryBuilder/QueryBuilderHandler.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,14 +1516,14 @@ public function query(string $sql, array $bindings = []): self
15161516
* Register new event
15171517
*
15181518
* @param string $name
1519-
* @param string|null $table
15201519
* @param \Closure $action
1520+
* @param string $table
15211521
*
15221522
* @return void
15231523
*/
1524-
public function registerEvent(string $name, ?string $table = null, \Closure $action): void
1524+
public function registerEvent(string $name, \Closure $action, string $table = EventHandler::TABLE_ANY): void
15251525
{
1526-
$this->connection->getEventHandler()->registerEvent($name, $table, $action);
1526+
$this->connection->getEventHandler()->registerEvent($name, $action, $table);
15271527
}
15281528

15291529
/**

tests/Pecee/Pixie/ConnectionTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ConnectionTest extends TestCase
2626
*/
2727
protected $builder;
2828

29-
public function setUp()
29+
public function setUp(): void
3030
{
3131
parent::setUp();
3232

@@ -85,4 +85,4 @@ public function testMultiConnection()
8585
$this->assertEquals($adapterConfigOne['host'], $connectionOneHost);
8686
$this->assertEquals($adapterConfigTwo['host'], $connectionTwoHost);
8787
}
88-
}
88+
}

tests/Pecee/Pixie/QueryBuilderAggregateTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
class QueryBuilderAggregateTest extends TestCase
1111
{
1212

13-
public function setUp()
13+
public function setUp(): void
1414
{
15-
return parent::setUp();
15+
parent::setUp();
1616

17-
$this->builder->query('TRUNCATE `animal`');
17+
/*$this->builder->query('TRUNCATE `animal`');
1818
1919
$qb->from('animal')->insert([
2020
['name' => 'mouse', 'number_of_legs' => 28],
2121
['name' => 'horse', 'number_of_legs' => 4],
2222
['name' => 'cat', 'number_of_legs' => 8],
23-
]);
23+
]);*/
2424

2525
}
2626

@@ -80,4 +80,4 @@ public function testSqliteQueryAverage()
8080
$this->assertEquals(13.3333333333333, $count);
8181
}
8282

83-
}
83+
}

0 commit comments

Comments
 (0)