From 51762315decc9889b0c8f813b2b0c437c9f4159c Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Mon, 1 Sep 2025 00:31:20 +0900 Subject: [PATCH] Support "if" in inside #2595 --- common/framework/parsers/DBQueryParser.php | 3 ++- common/framework/parsers/dbquery/Query.php | 8 ++++++++ tests/_data/dbquery/selectJoinTest1.xml | 1 + tests/unit/framework/parsers/DBQueryParserTest.php | 9 ++++++++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/common/framework/parsers/DBQueryParser.php b/common/framework/parsers/DBQueryParser.php index ecbf7d958..898e90a41 100644 --- a/common/framework/parsers/DBQueryParser.php +++ b/common/framework/parsers/DBQueryParser.php @@ -175,9 +175,10 @@ class DBQueryParser extends BaseParser foreach ($xml->groups->children() as $tag) { $name = $tag->getName(); + $ifvar = trim($tag['if'] ?? '') ?: null; if ($name === 'group') { - $query->groupby->columns[] = trim($tag['column'] ?? ''); + $query->groupby->columns[] = [trim($tag['column'] ?? ''), $ifvar]; } elseif ($name === 'having') { diff --git a/common/framework/parsers/dbquery/Query.php b/common/framework/parsers/dbquery/Query.php index 6a0a71170..34e680bef 100644 --- a/common/framework/parsers/dbquery/Query.php +++ b/common/framework/parsers/dbquery/Query.php @@ -222,6 +222,14 @@ class Query extends VariableBase $columns = array(); foreach ($this->groupby->columns as $column_name) { + if (is_array($column_name)) + { + list($column_name, $ifvar) = $column_name; + if ($ifvar && empty($this->_args[$ifvar])) + { + continue; + } + } if (self::isValidColumnName($column_name)) { $columns[] = self::quoteName($column_name); diff --git a/tests/_data/dbquery/selectJoinTest1.xml b/tests/_data/dbquery/selectJoinTest1.xml index 29296c688..4efedd9c8 100644 --- a/tests/_data/dbquery/selectJoinTest1.xml +++ b/tests/_data/dbquery/selectJoinTest1.xml @@ -15,6 +15,7 @@ + diff --git a/tests/unit/framework/parsers/DBQueryParserTest.php b/tests/unit/framework/parsers/DBQueryParserTest.php index d08f8ab25..f46e99c22 100644 --- a/tests/unit/framework/parsers/DBQueryParserTest.php +++ b/tests/unit/framework/parsers/DBQueryParserTest.php @@ -178,7 +178,8 @@ class DBQueryParserTest extends \Codeception\Test\Unit $this->assertEquals('AND', $query->conditions[1]->pipe); $this->assertTrue($query->groupby instanceof Rhymix\Framework\Parsers\DBQuery\GroupBy); - $this->assertEquals('member.member_srl', $query->groupby->columns[0]); + $this->assertEquals(['member.member_srl', null], $query->groupby->columns[0]); + $this->assertEquals(['member.nick_name', 'if_groupby_nick_name'], $query->groupby->columns[1]); $this->assertEquals(1, count($query->groupby->having)); $this->assertTrue($query->groupby->having[0] instanceof Rhymix\Framework\Parsers\DBQuery\Condition); $this->assertEquals('member.member_srl', $query->groupby->having[0]->column); @@ -196,6 +197,12 @@ class DBQueryParserTest extends \Codeception\Test\Unit 'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl` HAVING `member`.`member_srl` != ?', $sql); $this->assertEquals(['12', '34', '56', '4'], $params); + $args['if_groupby_nick_name'] = true; + $sql = $query->getQueryString('rx_', $args); + $this->assertEquals('SELECT `member`.`member_srl`, COUNT(*) AS `count` FROM `rx_documents` AS `documents`, `rx_member` AS `member` ' . + 'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`member_srl` = `member`.`member_srl` ' . + 'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl`, `member`.`nick_name` HAVING `member`.`member_srl` != ?', $sql); + $args = array( 'document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4, 'exclude_document_srl_list' => '78,90', 'if_table' => true, 'if_column' => true, 'if_condition2' => true,