Изменения

Общий вид статистики

4531 байт добавлено, 22:37, 14 сентября 2011
м
Нет описания правки
Маленький настраиваемый OLAP’ик на PHP+MySQL, на самом деле также поддерживает любые источники данных, если напишете функцию, которая эти данные по запросу предоставит. Брать [{{SVN|vitalif/trunk/olap}} здесь]. Общий вид любой, по сути дела, статистики. Есть, условно говоря, «события» (в OLAP — «факты»), у каждого есть показатели. То есть, обычный OLAP-куб, который берётся из SQL-БДили генерируется функцией. По этим событиям интересно получать какие-то отчёты.
Типы показателей:
* Для поля в ячейках — за все ячейки, но только за их части, соответствующие данному значению.
* Если по вертикали не одно, а два поля, то для первого («внешнего») это будет А(Ф(П)) за все строки, соответствующие его значению, а для второго («внутреннего») — А(Ф(П)) за все строки, соответствующие значениям ''обоих'' полей. То есть «внутреннее» поле и будет сортироваться как бы «внутри» каждого значения внешнего.
 
Также умеет строить «псевдографики», состоящие из горизонтальных полос шириной, пропорциональной значению. Но — не умеет их смешивать с другими типами группировок, если выбираете хотя бы один график, графиками становится всё.
 
Конфигурация OLAP пишется в файле olap-config.php, кладётся рядом с olap.php, и включает в себя:
<source lang="php">
OLAP::$sources = array(
'строковой_ID_источника' => array(
'name' => 'читаемое имя источника',
'tables' => $SQL_таблицы,
'where' => $SQL_условия_накладываемые_всегда,
'use_pgm' => (true, если группировку и подсчёт нужно вычислять в PHP),
'generator' => $функция_генератор_данных,
'sql_filter' => $фильтр_SQL_строк,
'sql_options' => $SQL_опции (используются только если use_pgm==true),
'fielddescs' => array(
'имя_поля' => array(
'sql' => 'SQL-код поля (необязателен, по умолчанию равен имени)',
'name' => 'читаемое имя поля',
'comment' => 'необязательный комментарий (показывается после полей ввода)',
'options' => array(array('значение', 'читаемое имя')), // опции для выпадающего списка (необязательно)
'autofilter' => (true, если можно загрузить опции для выпадающего списка из таблицы автоматически),
'le_ge' => (true, если к полю применимы фильтры >= и <=),
'is_time' => (true, если поле содержит дату/время),
'format' => (для полей с датой/временем формат - константа TS_DB (YYYY-MM-DD HH:MM:SS) или TS_UNIX (время UNIX)),
'mandatory' => (true, если данные поля нужно запрашивать всегда),
// используется только в use_pgm, на случай, если фильтру нужны эти значения
),
...
),
),
...
);
 
// Функция-генератор данных принимает параметры через хеш:
function generator($params = array(
'where' => array(array('поле', 'оператор (le/ge/eq)', 'значение'), ...)
'where_sql' => (условия where, транслированные в SQL),
'fields' => array('поле', 'поле', ...),
'fields_sql' => (поля, транслированные в SQL)
))
{
// Должна вернуть объект, функция fetch() которого будет возвращать данные
// в виде ассоциативных массивов и NULL, когда данные кончатся.
return new Result();
}
 
// Функция-фильтр применяется, если вам ещё нужно что-то сделать
// с данными в коде перед их скармливанием OLAP'у. Принимает один
// параметр - строчку данных (ассоциативный массив):
function filter($row)
{
// Должна вернуть массив строчек, возможно пустой.
// В конце обработки фильтру передаётся $row = NULL, на случай,
// если он зажал какие-то строки и должен отдать в конце
return array($row);
}
</source>
 
За описанием параметров <tt>tables, where, sql_options</tt> обращайтесь к описанию подобного MediaWikовскому SelectBuilder’а: [[MySQL_Select_Builder]], или в его код — {{SVN|vitaphoto/php/mysql.php|markup}} (функция <tt>mysql_select_builder</tt>).