Fix graph grouping bug
parent
b8eef8a695
commit
144ffdea57
60
olap.php
60
olap.php
|
@ -108,13 +108,16 @@ class OLAP
|
|||
if (empty($s['where']))
|
||||
$s['where'] = array();
|
||||
}
|
||||
unset($s);
|
||||
$i = 0;
|
||||
foreach (self::$group_types as $k => $v)
|
||||
self::$group_types[$k] = array('id' => $k, 'num' => $i++, 'name' => $v);
|
||||
foreach (self::$functions as $k => &$v)
|
||||
$v['id'] = $k;
|
||||
unset($v);
|
||||
foreach (self::$aggregates as $k => &$v)
|
||||
$v['id'] = $k;
|
||||
unset($v);
|
||||
self::$initialised = true;
|
||||
}
|
||||
|
||||
|
@ -200,9 +203,12 @@ class OLAP
|
|||
$v = VMXTemplate::timestamp($v, $this->current_src['fielddescs'][$f]['format']);
|
||||
$this->where_nosql[] = array($f, $t, $v);
|
||||
if ($fd['options'])
|
||||
{
|
||||
foreach ($fd['options'] as &$o)
|
||||
if ("$o[id]" === $v)
|
||||
$o['selected'] = true;
|
||||
unset($o);
|
||||
}
|
||||
// NoSQL-поля будет фильтровать sql_filter-функция
|
||||
if (empty($fd['nosql']))
|
||||
{
|
||||
|
@ -325,6 +331,7 @@ class OLAP
|
|||
if ($v['type'] == 'tables' || $v['type'] == 'td')
|
||||
$tdk_group[] = $v;
|
||||
}
|
||||
unset($v);
|
||||
$this->load($this->cell['field'], $this->cell['func'], $this->cell['aggr'], $output);
|
||||
|
||||
// читаем значения, по которым следует сортировать значения полей группировки
|
||||
|
@ -349,6 +356,7 @@ class OLAP
|
|||
if (count($v_group) <= 1)
|
||||
self::do_sort($v['keys'], $v['sort'], $v['sort_dir']);
|
||||
}
|
||||
unset($v);
|
||||
|
||||
$vars = array('build' => 1);
|
||||
if ($this->group_fields && $this->group_fields[0]['type'] == 'graph')
|
||||
|
@ -404,6 +412,7 @@ class OLAP
|
|||
$fields[] = $v['sql'].' f'.$i;
|
||||
$group_by[] = $v['sql'];
|
||||
}
|
||||
unset($v);
|
||||
|
||||
$sql = $this->sql_trans_field($field, $func, $tables);
|
||||
$fields[] = str_replace('$', $sql, self::$aggregates[$aggr]['sql']).' c';
|
||||
|
@ -498,6 +507,7 @@ class OLAP
|
|||
$a = $this->current_src['fielddescs'][$f];
|
||||
$v = $a['sql'] ? $a['sql'] . ' ' . $f : $f;
|
||||
}
|
||||
unset($v);
|
||||
$fields = array_values($fields);
|
||||
|
||||
if ($gen = $this->current_src['generator'])
|
||||
|
@ -537,6 +547,7 @@ class OLAP
|
|||
foreach ($fields as &$v)
|
||||
if ($v['sort'])
|
||||
$v['orig_sort'] = &$v['sort'];
|
||||
unset($v);
|
||||
foreach ($keys as $k)
|
||||
{
|
||||
if (array_key_exists($k, $data))
|
||||
|
@ -544,6 +555,7 @@ class OLAP
|
|||
foreach ($fields as &$v)
|
||||
if (!empty($v['orig_sort']))
|
||||
$v['sort'] = &$v['orig_sort'][$k];
|
||||
unset($v);
|
||||
$gr = $this->build_graphs($fields, $data[$k], $tdkeys);
|
||||
// Допишем своё значение поля в начало описаний "дочерних" графиков
|
||||
$my_desc = array(
|
||||
|
@ -556,6 +568,7 @@ class OLAP
|
|||
array_unshift($g['desc'], $my_desc);
|
||||
$graphs[] = $g;
|
||||
}
|
||||
unset($g);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -625,6 +638,7 @@ class OLAP
|
|||
foreach ($gr['data'] as &$d)
|
||||
$d[2] = intval($d[2]/$gr['max']*$this->graph_scale);
|
||||
}
|
||||
unset($d);
|
||||
}
|
||||
$graphs[] = $gr;
|
||||
}
|
||||
|
@ -1069,20 +1083,24 @@ class OLAP
|
|||
$aggr = count($aggr);
|
||||
}
|
||||
|
||||
// Упрощение вывода JS-графиков - разбивает их на группы
|
||||
// Идея: Оставить последнюю группировку несколькими линиями на одном графике
|
||||
// А остальные вытащить в список "групп"
|
||||
function tpl_jsgraphs($graphs)
|
||||
{
|
||||
$groups = array();
|
||||
$group = false;
|
||||
foreach ($graphs as $i => $graph)
|
||||
{
|
||||
$min_ne = count($graph['desc']);
|
||||
foreach ($graph['desc'] as $j => $d)
|
||||
$min_ne = count($graph['desc'])-1;
|
||||
if ($i > 0)
|
||||
{
|
||||
if ($i == 0 || $d['value'] != $graphs[$i-1]['desc'][$j]['value'])
|
||||
foreach ($graph['desc'] as $j => $d)
|
||||
{
|
||||
$min_ne = $j;
|
||||
break;
|
||||
if ($d['value'] != $graphs[$i-1]['desc'][$j]['value'])
|
||||
{
|
||||
$min_ne = $j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
$a = $b = array();
|
||||
|
@ -1097,26 +1115,20 @@ class OLAP
|
|||
}
|
||||
$graph['last_desc'] = array_pop($a);
|
||||
array_pop($b);
|
||||
if ($min_ne >= count($graph['desc'])-1 || !$group)
|
||||
if ($min_ne < count($graph['desc'])-1)
|
||||
{
|
||||
if (!$group)
|
||||
{
|
||||
$group = array(
|
||||
'desc' => array_slice($graph['desc'], 0, -1),
|
||||
'full_desc' => $a,
|
||||
'changed_desc' => $b,
|
||||
'graphs' => array(),
|
||||
'numeric' => true,
|
||||
);
|
||||
}
|
||||
$group['graphs'][] = $graph;
|
||||
$group['numeric'] = $group['numeric'] && $graph['numeric'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$groups[] = $group;
|
||||
$group = false;
|
||||
if ($group)
|
||||
$groups[] = $group;
|
||||
$group = array(
|
||||
'desc' => array_slice($graph['desc'], 0, -1),
|
||||
'full_desc' => $a,
|
||||
'changed_desc' => $b,
|
||||
'graphs' => array(),
|
||||
'numeric' => true,
|
||||
);
|
||||
}
|
||||
$group['graphs'][] = $graph;
|
||||
$group['numeric'] = $group['numeric'] && $graph['numeric'];
|
||||
}
|
||||
if ($group)
|
||||
$groups[] = $group;
|
||||
|
|
Loading…
Reference in New Issue