Index: frontends/php/include/graphs.inc.php
===================================================================
--- frontends/php/include/graphs.inc.php (revision 38431)
+++ frontends/php/include/graphs.inc.php (revision 38500)
@@ -199,18 +199,19 @@
/**
* Return the time of the 1st appearance of item in trends.
*
- * @param array|int $itemids
+ * @param array $itemIds
*
* @return int (unixtime)
*/
-function get_min_itemclock_by_itemid($itemids) {
- zbx_value2array($itemids);
+function get_min_itemclock_by_itemid($itemIds) {
+ zbx_value2array($itemIds);
+
$min = null;
$result = time() - SEC_PER_YEAR;
- $items_by_type = array(
+ $itemTypes = array(
ITEM_VALUE_TYPE_FLOAT => array(),
- ITEM_VALUE_TYPE_STR => array(),
+ ITEM_VALUE_TYPE_STR => array(),
ITEM_VALUE_TYPE_LOG => array(),
ITEM_VALUE_TYPE_UINT64 => array(),
ITEM_VALUE_TYPE_TEXT => array()
@@ -219,64 +220,68 @@
$dbItems = DBselect(
'SELECT i.itemid,i.value_type'.
' FROM items i'.
- ' WHERE '.dbConditionInt('i.itemid', $itemids)
+ ' WHERE '.dbConditionInt('i.itemid', $itemIds)
);
while ($item = DBfetch($dbItems)) {
- $items_by_type[$item['value_type']][$item['itemid']] = $item['itemid'];
+ $itemTypes[$item['value_type']][$item['itemid']] = $item['itemid'];
}
// data for ITEM_VALUE_TYPE_FLOAT and ITEM_VALUE_TYPE_UINT64 can be stored in trends tables or history table
// get max trends and history values for such type items to find out in what tables to look for data
- $sql_from = 'history';
- $sql_from_num = '';
+ $sqlFrom = 'history';
+ $sqlFromNum = '';
- if (!empty($items_by_type[ITEM_VALUE_TYPE_FLOAT]) || !empty($items_by_type[ITEM_VALUE_TYPE_UINT64])) {
- $itemids_numeric = zbx_array_merge($items_by_type[ITEM_VALUE_TYPE_FLOAT], $items_by_type[ITEM_VALUE_TYPE_UINT64]);
+ if (!empty($itemTypes[ITEM_VALUE_TYPE_FLOAT]) || !empty($itemTypes[ITEM_VALUE_TYPE_UINT64])) {
+ $itemIdsNumeric = zbx_array_merge($itemTypes[ITEM_VALUE_TYPE_FLOAT], $itemTypes[ITEM_VALUE_TYPE_UINT64]);
$sql = 'SELECT MAX(i.history) AS history,MAX(i.trends) AS trends'.
' FROM items i'.
- ' WHERE '.dbConditionInt('i.itemid', $itemids_numeric);
- if ($table_for_numeric = DBfetch(DBselect($sql))) {
- $sql_from_num = ($table_for_numeric['history'] > $table_for_numeric['trends']) ? 'history' : 'trends';
- $result = time() - (SEC_PER_DAY * max($table_for_numeric['history'], $table_for_numeric['trends']));
+ ' WHERE '.dbConditionInt('i.itemid', $itemIdsNumeric);
+ if ($tableForNumeric = DBfetch(DBselect($sql))) {
+ $sqlFromNum = ($tableForNumeric['history'] > $tableForNumeric['trends']) ? 'history' : 'trends';
+ $result = time() - (SEC_PER_DAY * max($tableForNumeric['history'], $tableForNumeric['trends']));
}
}
- foreach ($items_by_type as $type => $items) {
+ foreach ($itemTypes as $type => $items) {
if (empty($items)) {
continue;
}
- switch($type) {
+ switch ($type) {
case ITEM_VALUE_TYPE_FLOAT:
- $sql_from = $sql_from_num;
+ $sqlFrom = $sqlFromNum;
break;
case ITEM_VALUE_TYPE_STR:
- $sql_from = 'history_str';
+ $sqlFrom = 'history_str';
break;
case ITEM_VALUE_TYPE_LOG:
- $sql_from = 'history_log';
+ $sqlFrom = 'history_log';
break;
case ITEM_VALUE_TYPE_UINT64:
- $sql_from = $sql_from_num.'_uint';
+ $sqlFrom = $sqlFromNum.'_uint';
break;
case ITEM_VALUE_TYPE_TEXT:
- $sql_from = 'history_text';
+ $sqlFrom = 'history_text';
break;
default:
- $sql_from = 'history';
+ $sqlFrom = 'history';
}
+ foreach ($itemIds as $itemId) {
+ $sqlUnions[] = 'SELECT MIN(ht.clock) AS c FROM '.$sqlFrom.' ht WHERE ht.itemid='.$itemId;
+ }
+
$dbMin = DBfetch(DBselect(
- 'SELECT MIN(ht.clock) AS min_clock'.
- ' FROM '.$sql_from.' ht'.
- ' WHERE '.dbConditionInt('ht.itemid', $itemids)
+ 'SELECT MIN(ht.c) AS min_clock'.
+ ' FROM ('.implode(' UNION ALL ', $sqlUnions).') ht'
));
- $min = empty($min) ? $dbMin['min_clock'] : min($min, $dbMin['min_clock']);
+
+ $min = $min ? min($min, $dbMin['min_clock']) : $dbMin['min_clock'];
}
- return empty($min) ? $result : $min;
+ return $min ? $min: $result;
}
function get_graph_by_graphid($graphid) {