Skip to content

Commit a6ee26e

Browse files
authored
Merge pull request #32 from CakeDC/3.next
3.next
2 parents 1555b25 + e3f30ea commit a6ee26e

File tree

17 files changed

+210
-153
lines changed

17 files changed

+210
-153
lines changed

.github/workflows/ci.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
- 3.next
8+
pull_request:
9+
branches:
10+
- '*'
11+
12+
permissions:
13+
contents: read
14+
15+
jobs:
16+
testsuite:
17+
uses: cakephp/.github/.github/workflows/testsuite-with-db.yml@5.x
18+
secrets: inherit
19+
20+
cs-stan:
21+
uses: cakephp/.github/.github/workflows/cs-stan.yml@5.x
22+
secrets: inherit

.phive/phars.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<phive xmlns="https://phar.io/phive">
3+
<phar name="phpstan" version="1.10.32" installed="1.10.32" location="./tools/phpstan" copy="false"/>
4+
<phar name="psalm" version="5.15.0" installed="5.15.0" location="./tools/psalm" copy="false"/>
5+
</phive>

README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@ CakePHP behavior plugin for easily generating some complicated queries like (bul
88
[![License](https://poser.pugx.org/itosho/easy-query/license)](https://packagist.org/packages/itosho/easy-query)
99

1010
## Requirements
11-
- PHP 7.2+
12-
- CakePHP 4.0+
13-
- MySQL 5.6+
14-
15-
:warning: For CakePHP3.x, use 1.x branch.
11+
- PHP 8.1+
12+
- CakePHP 5.0+
13+
- MySQL 8.0+ / MariaDB 10.4+
1614

1715
## Installation
1816
```bash

composer.json

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,14 @@
2626
"source": "https://github.com/itosho/easy-query"
2727
},
2828
"require": {
29-
"php": ">=7.2.0",
30-
"cakephp/orm": "^4.0"
29+
"php": ">=8.1",
30+
"cakephp/orm": "^5.0.0"
3131
},
3232
"require-dev": {
33-
"cakephp/cakephp": "^4.0",
34-
"phpunit/phpunit": "^8.5"
33+
"cakephp/cakephp": "^5.0.0",
34+
"phpunit/phpunit": "^10.1.0",
35+
"cakephp/cakephp-codesniffer": "^5.0",
36+
"vimeo/psalm": "^5.15"
3537
},
3638
"autoload": {
3739
"psr-4": {
@@ -42,5 +44,10 @@
4244
"psr-4": {
4345
"Itosho\\EasyQuery\\Test\\": "tests"
4446
}
47+
},
48+
"config": {
49+
"allow-plugins": {
50+
"dealerdirect/phpcodesniffer-composer-installer": true
51+
}
4552
}
4653
}

phpcs.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
<ruleset name="itosho/easy-query">
3+
<config name="installed_paths" value="../../cakephp/cakephp-codesniffer" />
4+
<rule ref="CakePHP" />
5+
</ruleset>

phpstan-baseline.neon

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
parameters:
2+
ignoreErrors: []

phpstan.neon

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
includes:
2+
- phpstan-baseline.neon
3+
14
parameters:
2-
checkMissingIterableValueType: false
3-
ignoreErrors: []
5+
level: 6
6+
checkGenericClassInNonGenericObjectType: false
7+
checkMissingIterableValueType: false
8+
paths:
9+
- src/

phpunit.xml.dist

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,23 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<phpunit
3-
colors="true"
4-
processIsolation="false"
5-
stopOnFailure="false"
6-
bootstrap="./tests/bootstrap.php"
7-
>
2+
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" colors="true" processIsolation="false" stopOnFailure="false" bootstrap="tests/bootstrap.php" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.2/phpunit.xsd" cacheDirectory=".phpunit.cache">
3+
<coverage/>
84
<php>
95
<ini name="memory_limit" value="-1"/>
106
<ini name="apc.enable_cli" value="1"/>
7+
<env name="FIXTURE_SCHEMA_METADATA" value="./tests/schema.php"/>
118
</php>
12-
139
<!-- Add any additional test suites you want to run here -->
1410
<testsuites>
1511
<testsuite name="EasyQuery Test Suite">
16-
<directory>./tests/TestCase</directory>
12+
<directory>tests/TestCase/</directory>
1713
</testsuite>
1814
</testsuites>
19-
20-
<!-- Setup a listener for fixtures -->
21-
<listeners>
22-
<listener
23-
class="\Cake\TestSuite\Fixture\FixtureInjector"
24-
file="./vendor/cakephp/cakephp/src/TestSuite/Fixture/FixtureInjector.php">
25-
<arguments>
26-
<object class="\Cake\TestSuite\Fixture\FixtureManager" />
27-
</arguments>
28-
</listener>
29-
</listeners>
30-
31-
<filter>
32-
<whitelist>
33-
<directory suffix=".php">./src/</directory>
34-
</whitelist>
35-
</filter>
36-
15+
<extensions>
16+
<bootstrap class="Cake\TestSuite\Fixture\Extension\PHPUnitExtension"/>
17+
</extensions>
18+
<source>
19+
<include>
20+
<directory suffix=".php">src/</directory>
21+
</include>
22+
</source>
3723
</phpunit>

psalm.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0"?>
2+
<psalm
3+
errorLevel="2"
4+
resolveFromConfigFile="true"
5+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6+
xmlns="https://getpsalm.org/schema/config"
7+
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
8+
>
9+
<projectFiles>
10+
<directory name="src" />
11+
<ignoreFiles>
12+
<directory name="vendor" />
13+
</ignoreFiles>
14+
</projectFiles>
15+
</psalm>

src/Model/Behavior/InsertBehavior.php

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,35 @@
55

66
use Cake\Database\Expression\QueryExpression;
77
use Cake\Database\StatementInterface;
8-
use Cake\I18n\FrozenTime;
8+
use Cake\Datasource\EntityInterface;
9+
use Cake\I18n\DateTime;
910
use Cake\ORM\Behavior;
10-
use Cake\ORM\Entity;
11-
use Cake\ORM\Query;
12-
use Cake\ORM\TableRegistry;
11+
use Cake\ORM\Locator\LocatorAwareTrait;
12+
use Cake\ORM\Query\SelectQuery;
1313
use LogicException;
1414

1515
/**
1616
* Insert Behavior
1717
*/
1818
class InsertBehavior extends Behavior
1919
{
20+
use LocatorAwareTrait;
21+
2022
/**
2123
* Default config
2224
*
23-
* @var array
25+
* @var array<string, mixed>
2426
*/
25-
protected $_defaultConfig = [
27+
protected array $_defaultConfig = [
2628
'event' => ['beforeSave' => true],
2729
];
2830

2931
/**
3032
* execute bulk insert query
3133
*
32-
* @param Entity[] $entities insert entities
33-
* @throws LogicException no save data
34-
* @return StatementInterface query result
34+
* @param array<\Cake\Datasource\EntityInterface> $entities insert entities
35+
* @throws \LogicException no save data
36+
* @return \Cake\Database\StatementInterface query result
3537
*/
3638
public function bulkInsert(array $entities): StatementInterface
3739
{
@@ -50,7 +52,7 @@ public function bulkInsert(array $entities): StatementInterface
5052
$fields = array_keys($saveData[0]);
5153

5254
$query = $this->_table
53-
->query()
55+
->insertQuery()
5456
->insert($fields);
5557
$query->clause('values')->setValues($saveData);
5658

@@ -60,31 +62,31 @@ public function bulkInsert(array $entities): StatementInterface
6062
/**
6163
* execute insert select query for saving a record just once
6264
*
63-
* @param Entity $entity insert entity
65+
* @param \Cake\Datasource\EntityInterface $entity insert entity
6466
* @param array|null $conditions search conditions
65-
* @return StatementInterface query result
67+
* @return \Cake\Database\StatementInterface query result
6668
*/
67-
public function insertOnce(Entity $entity, array $conditions = null): StatementInterface
69+
public function insertOnce(EntityInterface $entity, ?array $conditions = null): StatementInterface
6870
{
6971
if ($this->_config['event']['beforeSave']) {
7072
$this->_table->dispatchEvent('Model.beforeSave', compact('entity'));
7173
}
7274

7375
$entity->setVirtual([]);
7476
$insertData = $entity->toArray();
75-
if (isset($insertData['created']) && !is_null($insertData['created'])) {
76-
$insertData['created'] = FrozenTime::now()->toDateTimeString();
77+
if (isset($insertData['created'])) {
78+
$insertData['created'] = DateTime::now()->toDateTimeString();
7779
}
78-
if (isset($insertData['modified']) && !is_null($insertData['modified'])) {
79-
$insertData['modified'] = FrozenTime::now()->toDateTimeString();
80+
if (isset($insertData['modified'])) {
81+
$insertData['modified'] = DateTime::now()->toDateTimeString();
8082
}
8183

8284
$fields = array_keys($insertData);
8385
$existsConditions = $conditions;
8486
if (is_null($existsConditions)) {
8587
$existsConditions = $this->getExistsConditions($insertData);
8688
}
87-
$query = $this->_table->query()->insert($fields);
89+
$query = $this->_table->insertQuery()->insert($fields);
8890
$subQuery = $this
8991
->buildTmpTableSelectQuery($insertData)
9092
->where(function (QueryExpression $exp) use ($existsConditions) {
@@ -95,7 +97,7 @@ public function insertOnce(Entity $entity, array $conditions = null): StatementI
9597
return $exp->notExists($query);
9698
})
9799
->limit(1);
98-
/* @phpstan-ignore-next-line */
100+
99101
$query = $query->epilog($subQuery);
100102

101103
return $query->execute();
@@ -105,10 +107,10 @@ public function insertOnce(Entity $entity, array $conditions = null): StatementI
105107
* build tmp table's select query for insert select query
106108
*
107109
* @param array $insertData insert data
108-
* @throws LogicException select query is invalid
109-
* @return Query tmp table's select query
110+
* @return \Cake\ORM\Query\SelectQuery tmp table's select query
111+
* @throws \LogicException select query is invalid
110112
*/
111-
private function buildTmpTableSelectQuery($insertData): Query
113+
private function buildTmpTableSelectQuery(array $insertData): SelectQuery
112114
{
113115
$driver = $this->_table
114116
->getConnection()
@@ -118,15 +120,15 @@ private function buildTmpTableSelectQuery($insertData): Query
118120
foreach ($insertData as $key => $value) {
119121
$col = $driver->quoteIdentifier($key);
120122
if (is_null($value)) {
121-
$schema[] = "NULL AS {$col}";
123+
$schema[] = "NULL AS $col";
122124
} else {
123125
$bindKey = ':' . strtolower($key);
124126
$binds[$bindKey] = $value;
125-
$schema[] = "{$bindKey} AS {$col}";
127+
$schema[] = "$bindKey AS $col";
126128
}
127129
}
128130

129-
$tmpTable = TableRegistry::getTableLocator()->get('tmp', [
131+
$tmpTable = $this->fetchTable('tmp', [
130132
'schema' => $this->_table->getSchema(),
131133
]);
132134
$query = $tmpTable

0 commit comments

Comments
 (0)