IcingaObjectFilterHelper: external filter helpers
This commit is contained in:
parent
28f0a2cb05
commit
61e8621716
|
@ -0,0 +1,130 @@
|
|||
<?php
|
||||
|
||||
namespace Icinga\Module\Director\Db;
|
||||
|
||||
use Icinga\Exception\ProgrammingError;
|
||||
use Icinga\Module\Director\Objects\IcingaObject;
|
||||
use Icinga\Module\Director\Resolver\TemplateTree;
|
||||
use Zend_Db_Select as ZfSelect;
|
||||
|
||||
class IcingaObjectFilterHelper
|
||||
{
|
||||
const INHERIT_DIRECT = 'direct';
|
||||
const INHERIT_INDIRECT = 'indirect';
|
||||
const INHERIT_DIRECT_OR_INDIRECT = 'total';
|
||||
|
||||
/**
|
||||
* @param IcingaObject|int|string $id
|
||||
* @return int
|
||||
* @throws ProgrammingError
|
||||
*/
|
||||
public static function wantId($id)
|
||||
{
|
||||
if (is_int($id)) {
|
||||
return $id;
|
||||
} elseif ($id instanceof IcingaObject) {
|
||||
return (int) $id->get('id');
|
||||
} elseif (is_string($id) && ctype_digit($id)) {
|
||||
return (int) $id;
|
||||
} else {
|
||||
throw new ProgrammingError(
|
||||
'Numeric ID or IcingaObject expected, got %s',
|
||||
// TODO: just type/class info?
|
||||
var_export($id, 1)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ZfSelect $query
|
||||
* @param IcingaObject|int|string $template
|
||||
* @param string $tableAlias
|
||||
* @param string $inheritanceType
|
||||
* @return ZfSelect
|
||||
* @throws ProgrammingError
|
||||
*/
|
||||
public static function filterByTemplate(
|
||||
ZfSelect $query,
|
||||
$template,
|
||||
$tableAlias = 'o',
|
||||
$inheritanceType = self::INHERIT_DIRECT
|
||||
) {
|
||||
$i = $tableAlias . 'i';
|
||||
$o = $tableAlias;
|
||||
$type = $template->getShortTableName();
|
||||
$db = $template->getDb();
|
||||
$id = static::wantId($template);
|
||||
$sub = $db->select()->from(
|
||||
array($i => "icinga_${type}_inheritance"),
|
||||
array('e' => '(1)')
|
||||
)->where("$i.${type}_id = $o.id");
|
||||
|
||||
if ($inheritanceType === self::INHERIT_DIRECT) {
|
||||
$sub->where("$i.parent_${type}_id = ?", $id);
|
||||
} elseif ($inheritanceType === self::INHERIT_INDIRECT
|
||||
|| $inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT
|
||||
) {
|
||||
$tree = new TemplateTree($type, $template->getConnection());
|
||||
$ids = $tree->listDescendantIdsFor($template);
|
||||
if ($inheritanceType === self::INHERIT_DIRECT_OR_INDIRECT) {
|
||||
$ids[] = $template->getAutoincId();
|
||||
}
|
||||
|
||||
$sub->where("$i.parent_${type}_id IN (?)", $ids);
|
||||
} else {
|
||||
throw new ProgrammingError(
|
||||
'Unable to understand "%s" inheritance',
|
||||
$inheritanceType
|
||||
);
|
||||
}
|
||||
|
||||
return $query->where('EXISTS ?', $sub);
|
||||
}
|
||||
|
||||
public static function filterByHostgroups(
|
||||
ZfSelect $query,
|
||||
$type,
|
||||
$groups,
|
||||
$tableAlias = 'o'
|
||||
) {
|
||||
if (empty($groups)) {
|
||||
// Asked for an empty set of groups? Give no result
|
||||
$query->where('(1 = 0)');
|
||||
} else {
|
||||
$sub = $query->getAdapter()->select()->from(
|
||||
array('go' => "icinga_${type}group_${type}"),
|
||||
array('e' => '(1)')
|
||||
)->join(
|
||||
array('g' => "icinga_${type}group"),
|
||||
"go.${type}group_id = g.id"
|
||||
)->where("go.${type}_id = ${tableAlias}.id")
|
||||
->where('g.object_name IN (?)', $groups);
|
||||
|
||||
$query->where('EXISTS ?', $sub);
|
||||
}
|
||||
}
|
||||
|
||||
public static function filterByResolvedHostgroups(
|
||||
ZfSelect $query,
|
||||
$type,
|
||||
$groups,
|
||||
$tableAlias = 'o'
|
||||
) {
|
||||
if (empty($groups)) {
|
||||
// Asked for an empty set of groups? Give no result
|
||||
$query->where('(1 = 0)');
|
||||
} else {
|
||||
$sub = $query->getAdapter()->select()->from(
|
||||
array('go' => "icinga_${type}group_${type}_resolved"),
|
||||
array('e' => '(1)')
|
||||
)->join(
|
||||
array('g' => "icinga_${type}group"),
|
||||
"go.${type}group_id = g.id",
|
||||
[]
|
||||
)->where("go.${type}_id = ${tableAlias}.id")
|
||||
->where('g.object_name IN (?)', $groups);
|
||||
|
||||
$query->where('EXISTS ?', $sub);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue