ORM: Join sub-query (#2757)

* orm join sub-query

* tests
This commit is contained in:
Yuri Kuznetsov
2023-05-31 17:01:43 +03:00
committed by GitHub
parent 260a5c89ef
commit d4aa9745ca
5 changed files with 276 additions and 68 deletions

View File

@@ -52,6 +52,7 @@ use Espo\ORM\Query\Part\Condition;
use Espo\ORM\Query\Select;
use Espo\ORM\Query\Update;
use LogicException;
use RuntimeException;
require_once 'tests/unit/testData/DB/Entities.php';
@@ -986,6 +987,89 @@ class MysqlQueryComposerTest extends \PHPUnit\Framework\TestCase
);
}
public function testJoinSubQuery1(): void
{
$sql =
"SELECT post.id AS `id` FROM `post` " .
"JOIN (SELECT post.id AS `id` FROM `post` WHERE post.deleted = 0) AS `a` ON a.id = post.id " .
"WHERE post.deleted = 0";
$select = SelectBuilder::create()
->select('id')
->from('Post')
->join(
Join
::createWithSubQuery(
SelectBuilder::create()
->select('id')
->from('Post')
->build(),
'a'
)
->withConditions(
WhereClause::create(
Condition::equal(
Expression::column('a.id'),
Expression::column('post.id')
)
)
)
)
->build();
$this->assertEquals(
$sql,
$this->query->composeSelect($select)
);
}
public function testJoinSubQuery2(): void
{
$sql =
"SELECT post.id AS `id` FROM `post` " .
"JOIN (SELECT post.id AS `id` FROM `post` WHERE post.deleted = 0) AS `a` ON a.id = post.id " .
"WHERE post.deleted = 0";
$select = SelectBuilder::create()
->select('id')
->from('Post')
->join(
SelectBuilder::create()
->select('id')
->from('Post')
->build(),
'a',
Condition::equal(
Expression::column('a.id'),
Expression::column('post.id')
)
)
->build();
$this->assertEquals(
$sql,
$this->query->composeSelect($select)
);
}
public function testJoinSubQueryException1(): void
{
$this->expectException(LogicException::class);
$select = SelectBuilder::create()
->select('id')
->from('Post')
->join(
SelectBuilder::create()
->select('id')
->from('Post')
->build(),
)
->build();
$this->query->composeSelect($select);
}
public function testWhereNotValue1()
{
$sql = $this->query->compose(Select::fromRaw([

View File

@@ -29,8 +29,10 @@
namespace tests\unit\Espo\ORM\Query\Part;
use Espo\ORM\Query\Part\Expression;
use Espo\ORM\Query\Part\Join;
use Espo\ORM\Query\Part\Expression as Expr;
use Espo\ORM\Query\SelectBuilder;
class JoinTest extends \PHPUnit\Framework\TestCase
{
@@ -50,6 +52,8 @@ class JoinTest extends \PHPUnit\Framework\TestCase
$this->assertTrue($join->isRelation());
$this->assertFalse($join->isTable());
$this->assertEquals(Join::TYPE_RELATION, $join->getType());
}
public function testCreate2(): void
@@ -68,6 +72,8 @@ class JoinTest extends \PHPUnit\Framework\TestCase
$this->assertTrue($join->isTable());
$this->assertFalse($join->isRelation());
$this->assertEquals(Join::TYPE_TABLE, $join->getType());
}
public function testCreate3(): void
@@ -77,4 +83,18 @@ class JoinTest extends \PHPUnit\Framework\TestCase
$this->assertEquals('Test', $join->getTarget());
$this->assertEquals('testAlias', $join->getAlias());
}
public function testCreate4(): void
{
$join = Join::createWithSubQuery(
SelectBuilder::create()
->select(Expression::value(true))
->build()
,
'a'
);
$this->assertTrue($join->isSubQuery());
$this->assertEquals(Join::TYPE_SUB_QUERY, $join->getType());
}
}