Add notnull property to <group> tag in conditions

This commit is contained in:
Kijin Sung 2025-05-29 23:08:05 +09:00
parent fda92b368d
commit 6e325526c8
5 changed files with 43 additions and 6 deletions

View file

@ -286,6 +286,7 @@ class DBQueryParser extends BaseParser
$group->conditions = self::_parseConditions($tag);
$group->pipe = strtoupper($attribs['pipe'] ?? '') ?: 'AND';
$group->ifvar = $attribs['if'] ?? null;
$group->not_null = ($attribs['notnull'] ?? false) ? true : false;
$result[] = $group;
}
elseif ($name === 'query')

View file

@ -10,4 +10,5 @@ class ConditionGroup
public $conditions = array();
public $pipe = 'AND';
public $ifvar;
public $not_null;
}

View file

@ -580,6 +580,10 @@ class Query extends VariableBase
{
$result .= ($result === '' ? '' : (' ' . $condition->pipe . ' ')) . '(' . $condition_string . ')';
}
elseif ($condition->not_null)
{
throw new \Rhymix\Framework\Exceptions\QueryError('Condition group marked as NOT NULL must contain at least one valid condition');
}
}
// Simple condition

View file

@ -8,5 +8,9 @@
</columns>
<conditions>
<condition operation="equal" column="document_srl" var="document_srl" />
<group notnull="notnull">
<condition operation="equal" column="module_srl" var="module_srl" />
<condition operation="equal" column="member_srl" var="member_srl" pipe="or" />
</group>
</conditions>
</query>

View file

@ -512,32 +512,59 @@ class DBQueryParserTest extends \Codeception\Test\Unit
'user_name' => null,
'nick_name' => 'TEST',
'document_srl' => 1234,
'module_srl' => 5678,
));
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = ? WHERE `document_srl` = ?', $sql);
$this->assertEquals(['TEST', 1234], $query->getQueryParams());
$this->assertEquals('UPDATE `rx_documents` SET `nick_name` = ? WHERE `document_srl` = ? AND (`module_srl` = ?)', $sql);
$this->assertEquals(['TEST', 1234, 5678], $query->getQueryParams());
$sql = $query->getQueryString('rx_', array(
'user_name' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'nick_name' => 'TEST',
'document_srl' => 1234,
'module_srl' => 5678,
'member_srl' => 9000,
));
$this->assertEquals('UPDATE `rx_documents` SET `user_name` = NULL, `nick_name` = ? WHERE `document_srl` = ?', $sql);
$this->assertEquals(['TEST', 1234], $query->getQueryParams());
$this->assertEquals('UPDATE `rx_documents` SET `user_name` = NULL, `nick_name` = ? WHERE `document_srl` = ? AND (`module_srl` = ? OR `member_srl` = ?)', $sql);
$this->assertEquals(['TEST', 1234, 5678, 9000], $query->getQueryParams());
$this->tester->expectThrowable('Exception', function() use($query) {
$this->tester->expectThrowable('Rhymix\Framework\Exceptions\QueryError', function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => 'TEST',
'document_srl' => 1234,
));
});
$this->tester->expectThrowable('Rhymix\Framework\Exceptions\QueryError', function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => 'TEST',
'document_srl' => 1234,
));
});
$this->tester->expectThrowable('Rhymix\Framework\Exceptions\QueryError', function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'document_srl' => 1234,
'module_srl' => 5678,
));
});
$this->tester->expectThrowable('Exception', function() use($query) {
$this->tester->expectThrowable('Rhymix\Framework\Exceptions\QueryError', function() use($query) {
$query->getQueryString('rx_', array(
'nick_name' => null,
'document_srl' => 1234,
'member_srl' => 5678,
));
});
// No exception
$query->getQueryString('rx_', array(
'nick_name' => 'TEST',
'document_srl' => 1234,
'module_srl' => new \Rhymix\Framework\Parsers\DBQuery\NullValue,
'member_srl' => null,
));
$query = Rhymix\Framework\Parsers\DBQueryParser::loadXML(\RX_BASEDIR . 'tests/_data/dbquery/nullValueTest2.xml');
$sql = $query->getQueryString('rx_', array(