trigger 구성을 올바르게 수정

This commit is contained in:
2018-10-01 02:52:27 +09:00
parent 89ecbe34ed
commit 935473823a
7 changed files with 140 additions and 52 deletions
+88 -10
View File
@@ -7,15 +7,19 @@ abstract class TriggerCaller{
abstract function checkValidTrigger(iObjectTrigger $trigger):bool;
function isEmpty():bool{
return !$this->triggerListByPriority;
}
function __construct(?array $triggerList=null)
{
if(!$triggerList){
return;
}
$this->merge($triggerList);
}
function merge(array $triggerList){
$sorted = true;
$minPriority = iObjectTrigger::PRIORITY_MAX;
foreach($triggerList as $trigger){
if(!checkValidTrigger($trigger)){
throw new \InvalidArgumentException('Invalid Trigger Type');
@@ -23,18 +27,92 @@ abstract class TriggerCaller{
/** @var iObjectTrigger $trigger */
$priority = $trigger->getPriority();
$uniqueID = $trigger->getUniqueID();
if(!key_exists($priority, $this->triggerListByPriority)){
$this->triggerListByPriority[$priority] = [];
if($sorted){
if($minPriority > $priority){
$minPriority = $priority;
}
else if($minPriority < $priority){
$sorted = false;
}
}
$subTriggerList = &$this->triggerListByPriority[$priority];
if(key_exists($uniqueID, $subTriggerList)){
if(!key_exists($priority, $this->triggerListByPriority)){
$this->triggerListByPriority[$priority] = [$uniqueID=>$trigger];
continue;
}
$subTriggerList[$uniqueID] = $trigger;
$this->triggerListByPriority[$priority][$uniqueID] = $trigger;
}
$this->sorted = false;
if(!$sorted){
krsort($this->triggerListByPriority);
}
}
function append(iObjectTrigger $trigger){
if(!checkValidTrigger($trigger)){
throw new \InvalidArgumentException('Invalid Trigger Type');
}
$priority = $trigger->getPriority();
$uniqueID = $trigger->getUniqueID();
if(!$this->triggerListByPriority){
$this->triggerListByPriority[$priority] = [$uniqueID=>$trigger];
return;
}
$lastKey = Util::array_last_key($this->triggerListByPriority);
if($lastKey > $priority){
$this->triggerListByPriority[$priority] = [$uniqueID=>$trigger];
return;
}
if(key_exists($priority, $this->triggerListByPriority)){
$this->triggerListByPriority[$priority][$uniqueID] = $trigger;
}
$this->triggerListByPriority[$priority] = [$uniqueID=>$trigger];
krsort($this->triggerListByPriority);
}
function merge(?TriggerCaller $other){
if($other === null){
return;
}
$newTriggerList = [];
$iterLhs = new \ArrayIterator($this->triggerListByPriority);
$iterRhs = new \ArrayIterator($other->triggerListByPriority);
while($iterLhs->valid() && $iterRhs->valid()){
if($iterLhs->key() > $iterRhs->key()){
$newTriggerList[$iterLhs->key()] = $iterLhs->current();
$iterLhs->next();
continue;
}
if($iterRhs->key() > $iterLhs->key()){
$newTriggerList[$iterRhs->key()] = $iterRhs->current();
$iterRhs->next();
continue;
}
$newTriggerList[$iterLhs->key()] = $iterLhs->current() + $iterRhs->current();
$iterLhs->next();
$iterRhs->next();
}
while($iterLhs->valid()){
$newTriggerList[$iterLhs->key()] = $iterLhs->current();
$iterLhs->next();
}
while($iterRhs->valid()){
$newTriggerList[$iterRhs->key()] = $iterRhs->current();
$iterRhs->next();
}
$this->triggerListByPriority = $newTriggerList;
}
function fire(?array $env = null, $arg = null):?array{