Fix graph grouping bug

master
Vitaliy Filippov 2017-12-07 19:37:33 +03:00
parent b8eef8a695
commit 144ffdea57
1 changed files with 36 additions and 24 deletions

View File

@ -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;