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,6 +105,18 @@ class ConditionGroup
{
$args = array();
foreach($this->conditions as $condition)
{
if($condition instanceof ConditionGroup)
{
foreach($condition->getArguments() as $arg)
{
if($arg)
{
$args[] = $arg;
}
}
}
else
{
$arg = $condition->getArgument();
if($arg)
@ -112,6 +124,7 @@ class ConditionGroup
$args[] = $arg;
}
}
}
return $args;
}

View file

@ -29,7 +29,7 @@ class ConditionGroupTag
* @param string $pipe
* @return void
*/
function __construct($conditions, $pipe = "")
function __construct($conditions, $pipe = 'and')
{
$this->pipe = $pipe;
@ -38,12 +38,23 @@ class ConditionGroupTag
$conditions = array($conditions);
}
//var_dump($conditions);
foreach($conditions as $condition)
{
//if($condition->node_name === 'query') $this->conditions[] = new QueryTag($condition, true);
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);
}
}
}
function getConditions()
{
@ -58,9 +69,16 @@ class ConditionGroupTag
{
$conditions_string = 'array(' . PHP_EOL;
foreach($this->conditions as $condition)
{
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

@ -62,7 +62,11 @@ class ConditionsTag
}
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);
}
}
}