From 3359431d0864b12910b21e8fca3b1758758f04e7 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Sat, 30 Jun 2018 23:01:55 +0900 Subject: [PATCH] Allow nested condition groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XML 쿼리에서 안에 태그를 또 쓸 수 있도록 허용함. 이제 WHERE (a AND (b OR (c AND d))) 이런 조건을 작성할 수 있음. --- .../condition/ConditionGroup.class.php | 21 +++++++++--- .../condition/ConditionGroupTag.class.php | 32 +++++++++++++++---- .../tags/condition/ConditionsTag.class.php | 8 +++-- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/classes/db/queryparts/condition/ConditionGroup.class.php b/classes/db/queryparts/condition/ConditionGroup.class.php index e2b46520b..2b6057ed8 100644 --- a/classes/db/queryparts/condition/ConditionGroup.class.php +++ b/classes/db/queryparts/condition/ConditionGroup.class.php @@ -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; diff --git a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php index 807ff3a1e..194e9eee9 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionGroupTag.class.php @@ -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 .= ')'; diff --git a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php index 0042505ff..66a172297 100644 --- a/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php +++ b/classes/xml/xmlquery/tags/condition/ConditionsTag.class.php @@ -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); } } }