Allow nested condition groups

XML 쿼리에서 <conditions><group> 안에 <group> 태그를 또 쓸 수 있도록 허용함.
이제 WHERE (a AND (b OR (c AND d))) 이런 조건을 작성할 수 있음.
This commit is contained in:
Kijin Sung 2018-06-30 23:01:55 +09:00
parent 2cfb7585af
commit 3359431d08
3 changed files with 48 additions and 13 deletions

View file

@ -105,11 +105,24 @@ class ConditionGroup
{
$args = array();
foreach($this->conditions as $condition)
{
$arg = $condition->getArgument();
if($arg)
{
if($condition instanceof ConditionGroup)
{
foreach($condition->getArguments() as $arg)
{
if($arg)
{
$args[] = $arg;
}
}
}
else
{
$args[] = $arg;
$arg = $condition->getArgument();
if($arg)
{
$args[] = $arg;
}
}
}
return $args;

View file

@ -16,7 +16,7 @@ class ConditionGroupTag
* @var string|array value is ConditionTag object
*/
var $conditions;
/**
* pipe
* @var string
@ -29,7 +29,7 @@ class ConditionGroupTag
* @param string $pipe
* @return void
*/
function __construct($conditions, $pipe = "")
function __construct($conditions, $pipe = 'and')
{
$this->pipe = $pipe;
@ -37,11 +37,22 @@ class ConditionGroupTag
{
$conditions = array($conditions);
}
//var_dump($conditions);
foreach($conditions as $condition)
{
//if($condition->node_name === 'query') $this->conditions[] = new QueryTag($condition, true);
$this->conditions[] = new ConditionTag($condition);
if($condition->node_name === 'group')
{
$subconditions = $condition->condition;
$subgroups = $condition->group;
$subconditions = $subconditions ? (is_array($subconditions) ? $subconditions : [$subconditions]) : [];
$subgroups = $subgroups ? (is_array($subgroups) ? $subgroups : [$subgroups]) : [];
$this->conditions[] = new ConditionGroupTag(array_merge($subconditions, $subgroups), $condition->attrs->pipe);
}
else
{
$this->conditions[] = new ConditionTag($condition);
}
}
}
@ -58,8 +69,15 @@ class ConditionGroupTag
{
$conditions_string = 'array(' . PHP_EOL;
foreach($this->conditions as $condition)
{
$conditions_string .= $condition->getConditionString() . PHP_EOL . ',';
{
if($condition instanceof ConditionGroupTag)
{
$conditions_string .= $condition->getConditionGroupString() . PHP_EOL . ',';
}
else
{
$conditions_string .= $condition->getConditionString() . PHP_EOL . ',';
}
}
$conditions_string = substr($conditions_string, 0, -2); //remove ','
$conditions_string .= ')';

View file

@ -61,8 +61,12 @@ class ConditionsTag
$xml_groups = array($xml_groups);
}
foreach($xml_groups as $group)
{
$this->condition_groups[] = new ConditionGroupTag($group->condition, $group->attrs->pipe);
{
$subconditions = $group->condition;
$subgroups = $group->group;
$subconditions = $subconditions ? (is_array($subconditions) ? $subconditions : [$subconditions]) : [];
$subgroups = $subgroups ? (is_array($subgroups) ? $subgroups : [$subgroups]) : [];
$this->condition_groups[] = new ConditionGroupTag(array_merge($subconditions, $subgroups), $group->attrs->pipe);
}
}
}