Изменения

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

7593 байта добавлено, 10:12, 21 сентября 2017
м
Нет описания правки
Маленький настраиваемый OLAP’ик на PHP+/MySQL, на самом деле также поддерживает любые источники данных, если напишете функцию, которая эти данные по запросу предоставит. Брать [{{SVN|vitalif/trunk/olap}} здесь]. Общий вид любой, по сути дела, статистики. Есть, условно говоря, «события» (в OLAP — «факты»), у каждого есть показатели. То есть, обычный OLAP-куб, который берётся из SQL-БДили генерируется функцией. По этим событиям интересно получать какие-то отчёты.
Типы показателей:
#* По горизонтали — аналогично, но по горизонтальной оси.
#* В ячейке — список значений данного поля будет выведен внутри ячейки таблицы вместе с соответствующими значениями показателя.
#* График — по значениям поля строится JavaScript-график. Не комбинируется с другими типами.
# Само поле: любой П или Ф(П).
# Порядок сортировки — по убыванию или по возрастанию.
* Для поля в ячейках — за все ячейки, но только за их части, соответствующие данному значению.
* Если по вертикали не одно, а два поля, то для первого («внешнего») это будет А(Ф(П)) за все строки, соответствующие его значению, а для второго («внутреннего») — А(Ф(П)) за все строки, соответствующие значениям ''обоих'' полей. То есть «внутреннее» поле и будет сортироваться как бы «внутри» каждого значения внешнего.
 
Графики строятся с помощью JavaScript-библиотеки [http://www.jqplot.com/ jQplot]. На график «умещаются» максимум две группировки — одна по горизонтали, вторая — несколько линий на одном графике. Остальные группировки помещаются на отдельные графики. Тип группировки «график» не комбинируется с табличными способами — если хотя бы одна группировка — график, графиками становятся и остальные.
 
Поддерживается переключаемый логарифмический масштаб показателя (по вертикали). Графики сглаживаются. Числа и даты отображаются на линейной оси, строковые показатели — с равными интервалами между значениями.
 
[[File:olap-jqplot.png|frame|center|Старый скриншот (сглаживания и пропорциональной оси дат нет)]]
 
{{----}}
В коде также есть временно отключённая возможность строить «псевдографики», состоящие из горизонтальных полос шириной, пропорциональной значению.
 
== Конфигурация ==
 
Конфигурация OLAP пишется в файле olap-config.php, кладётся рядом с olap.php, и включает в себя:
 
<source lang="php">
OLAP::$sources = array(
'строковой ID источника' => array(
'name' => 'читаемое имя источника',
'db' => array('имя БД', 'хост БД', 'пользователь БД', 'пароль пользователя'),
'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('значение', 'читаемое имя')), // опции для выпадающего списка (необязательно)
// 'options' может быть callback'ом, вызываемым с одним параметром $olap (= объекту-построителю)
// и возвращающим опции в том же формате
'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/DatabaseMysql.php|markup}} (функция <tt>DatabaseMysql::select_builder</tt>).
 
Да, кстати, под E_STRICT вся эта хрень выплюнет тучу Notice’ов, плюньте на них и скажите <tt>error_reporting(E_ALL & ~E_STRICT)</tt>.
 
== Пример генерации: Wayback Machine ==
 
Любопытным примером генерации данных функцией является такая весёлая вещь — построение отчётов с учётом истории изменений, хранящихся в виде undo-логов, то есть, когда в базе хранится актуальное состояние объектов плюс история изменений (какое поле, с чего, на что и когда было изменено), а аналитику хочется делать развёрнуто по времени. Так, например, хранится история изменений багов в Bugzilla.
 
Без функции-генератора тут не обойтись, и она должна загружать актуальное состояние и нужные изменения, а потом просто последовательно применять их, восстанавливая состояния объектов на более старые даты.
 
[[Category:Техактивы]]