From 4c7b94070549dfea78b8d3baa7eab5847fa609a4 Mon Sep 17 00:00:00 2001 From: Thomas Gelf Date: Sun, 20 Aug 2017 15:04:06 +0200 Subject: [PATCH] PriorityColumn: add new object extension, use... ...it for SyncProperty --- application/forms/SyncPropertyForm.php | 10 +---- .../Objects/Extension/PriorityColumn.php | 40 +++++++++++++++++++ library/Director/Objects/SyncProperty.php | 19 ++++++++- library/Director/Objects/SyncRule.php | 16 -------- 4 files changed, 59 insertions(+), 26 deletions(-) create mode 100644 library/Director/Objects/Extension/PriorityColumn.php diff --git a/application/forms/SyncPropertyForm.php b/application/forms/SyncPropertyForm.php index 49b4d1b0..6d0b9108 100644 --- a/application/forms/SyncPropertyForm.php +++ b/application/forms/SyncPropertyForm.php @@ -4,6 +4,7 @@ namespace Icinga\Module\Director\Forms; use Exception; use Icinga\Module\Director\Hook\ImportSourceHook; +use Icinga\Module\Director\Objects\SyncProperty; use Icinga\Module\Director\Objects\SyncRule; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Objects\ImportSource; @@ -355,6 +356,7 @@ class SyncPropertyForm extends DirectorObjectForm public function onSuccess() { + /** @var SyncProperty $object */ $object = $this->getObject(); $object->set('rule_id', $this->rule->get('id')); // ?! @@ -363,7 +365,6 @@ class SyncPropertyForm extends DirectorObjectForm } $sourceColumn = $this->getValue('source_column'); - unset($this->source_column); $this->removeElement('source_column'); if ($sourceColumn !== self::EXPRESSION) { @@ -376,13 +377,6 @@ class SyncPropertyForm extends DirectorObjectForm $object->destination_field = 'vars.' . $destination; } - if ($object->hasBeenModified()) { - if (! $object->hasBeenLoadedFromDb()) { - $object->priority = $this->rule->getPriorityForNextProperty(); - } - } - - return parent::onSuccess(); } diff --git a/library/Director/Objects/Extension/PriorityColumn.php b/library/Director/Objects/Extension/PriorityColumn.php new file mode 100644 index 00000000..638bdc6c --- /dev/null +++ b/library/Director/Objects/Extension/PriorityColumn.php @@ -0,0 +1,40 @@ +getDb(); + $prioValue = '(CASE WHEN MAX(priosub.priority) IS NULL THEN 1' + . ' ELSE MAX(priosub.priority) + 1 END)'; + $query = $db->select() + ->from( + ['priosub' => $this->getTableName()], + "$prioValue" + ); + + if ($prioSetColumn !== null) { + $query->where("priosub.$prioSetColumn = ?", $this->get($prioSetColumn)); + } + + $this->set($prioColumn, new Expr('(' . $query . ')')); + + return $this; + } + + protected function refreshPriortyProperty($prioColumn = 'priority') + { + /** @var \Zend_Db_Adapter_Abstract $db */ + $db = $this->getDb(); + $idCol = $this->getAutoincKeyName(); + $query = $db->select() + ->from($this->getTableName(), $prioColumn) + ->where("$idCol = ?", $this->get($idCol)); + $this->reallySet($prioColumn, $db->fetchOne($query)); + } +} diff --git a/library/Director/Objects/SyncProperty.php b/library/Director/Objects/SyncProperty.php index 567719d5..c65bcc24 100644 --- a/library/Director/Objects/SyncProperty.php +++ b/library/Director/Objects/SyncProperty.php @@ -3,16 +3,19 @@ namespace Icinga\Module\Director\Objects; use Icinga\Module\Director\Data\Db\DbObject; +use Icinga\Module\Director\Objects\Extension\PriorityColumn; class SyncProperty extends DbObject { + use PriorityColumn; + protected $table = 'sync_property'; protected $keyName = 'id'; protected $autoincKeyName = 'id'; - protected $defaultProperties = array( + protected $defaultProperties = [ 'id' => null, 'rule_id' => null, 'source_id' => null, @@ -21,5 +24,17 @@ class SyncProperty extends DbObject 'priority' => null, 'filter_expression' => null, 'merge_policy' => null - ); + ]; + + protected function beforeStore() + { + if (! $this->hasBeenLoadedFromDb()) { + $this->setNextPriority('rule_id'); + } + } + + protected function onInsert() + { + $this->refreshPriortyProperty(); + } } diff --git a/library/Director/Objects/SyncRule.php b/library/Director/Objects/SyncRule.php index a9e006bb..cf4c0e60 100644 --- a/library/Director/Objects/SyncRule.php +++ b/library/Director/Objects/SyncRule.php @@ -111,22 +111,6 @@ class SyncRule extends DbObject return $db->fetchOne($query); } - public function getPriorityForNextProperty() - { - if (! $this->hasBeenLoadedFromDb()) { - return 1; - } - - $db = $this->getDb(); - return $db->fetchOne( - $db->select() - ->from( - array('p' => 'sync_property'), - array('priority' => '(CASE WHEN MAX(p.priority) IS NULL THEN 1 ELSE MAX(p.priority) + 1 END)') - )->where('p.rule_id = ?', $this->get('id')) - ); - } - public function matches($row) { if ($this->get('filter_expression') === null) {