Учебник по угловой приборной панели с Cube.js
Практически на любом сайте есть встроенная аналитика. Вы можете найти графики использования для каждого общедоступного репозитория GitHub или любой социальной сети сегодня. Cube.js призван помочь разработчикам создавать такие аналитические приложения. Он решает множество различных проблем, которые необходимо решить каждому готовому к работе аналитическому приложению: создание аналитического SQL, кэширование результатов запросов и их оркестровка, предварительная агрегация данных, безопасность и API для извлечения результатов запросов.
Недавно мы рассказали о том, как создать аналитическую информационную панель с помощью Cube.js и React, но как насчет Angular? Начиная с версии 0.8.4, клиент Cube.js поставляется с модулем Angular для легкой интеграции. Сегодня я покажу вам, как создать аналитическую информационную панель с помощью диаграмм Angular , Cube.js и ng2 .
Вы можете найти окончательную панель инструментов здесь и CodeSandbox с исходным кодом ниже.
Настройка бэкэнда Cube.js
Мы рассмотрели эту тему в других руководствах, поэтому, если у вас уже настроен и запущен бэкэнд Cube.js, вы можете пропустить этот раздел.
Вы можете установить CLI Cube.js, который используется для различных рабочих процессов Cube.js, через NPM или Yarn.
npm install -g cubejs-cli
Давайте подготовим бэкэнд Cube.js для обслуживания данных для создаваемой нами панели. Cube.js поддерживает множество баз данных и опций развертывания. Вы можете узнать больше об этом в документации . Для этого урока мы будем использовать базу данных Postgres и развернем Cube.js в Heroku. Давайте создадим новое приложение Cube.js, используя только что установленный CLI.
cubejs new ng-demo -d postgres cd ng-demo
Если у вас еще нет базы данных для панели инструментов, вы можете загрузить наш демонстрационный набор данных электронной коммерции для Postgres.
curl http://cube.dev/downloads/ecom-dump.sql > ecom-dump.sql createdb ecom psql --dbname ecom -f ecom-dump.sql
Следующим шагом является определение модели данных. В производственном приложении вы, скорее всего, будете иметь несколько файлов схемы, но для нашего демонстрационного приложения у нас будет только один куб. Если вы не знакомы со схемой данных Cube.js, есть углубленное учебник здесь .
cube(`Users`, sql: `SELECT * FROM users`, measures: count: sql: `id`, type: `count` > >, dimensions: city: sql: `city`, type: `string` >, signedUp: sql: `created_at`, type: `time` >, companyName: sql: `company_name`, type: `string` > > >);
Cube.js использует схему данных для генерации и выполнения SQL в подключенной базе данных. Мы можем проверить это, отправив пример запроса в конечную точку REST API Cube.js.
curl \ -H "Authorization: EXAMPLE-API-TOKEN" \ -G \ --data-urlencode 'query=' \ http://localhost:4000/cubejs-api/v1/load
Вы можете узнать больше о формате Cube.js Query здесь .
Наконец, давайте развернем наш бэкэнд в Heroku:
git init git add -A git commit -am "Initial commit" heroku create cubejs-ngx-demo git push heroku master
Вы можете найти полное руководство по развертыванию в документации .
Щиток приборов
Теперь, когда у нас запущен функциональный бэкэнд, мы можем перейти к следующей части — построению панели инструментов. Cube.js имеет угловую привязку, которая не предоставляет никакой визуализации, но предназначена для работы с любой библиотекой диаграмм. Таким образом, он обеспечивает большую гибкость для разработчиков для создания уникальных и пользовательских пользовательских интерфейсов
Сначала установите ng-cli, если у вас его еще нет:
npm install -g angular/cli
Давайте создадим новое приложение Angular, используя шаблоны SCSS:
ng new ng-demo-dashboard -s scss
Для рисования диаграмм мы будем использовать библиотеку ng2-charts, которая является оболочкой Angular для Chart.js. Cube.js Angular Client будет использоваться для загрузки данных из серверной части, и, наконец, Bootstrap предоставит нам несколько приятных стилей. Давайте добавим эти зависимости:
npm install -s ng2-charts @cubejs-client/core @cubejs-client/ngx moment # or yarn add ng2-charts @cubejs-client/core @cubejs-client/ngx moment
Затем добавьте необходимые модули в файл app.module.ts:
const cubejsOptions = token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.K9PiJkjegbhnw4Ca5pPlkTmZihoOm42w8bja9Qs2qJg", options: apiUrl: "https://react-query-builder.herokuapp.com/cubejs-api/v1" > >; @NgModule( declarations: [AppComponent], imports: [ BrowserModule, ChartsModule, CubejsClientModule.forRoot(cubejsOptions) ], providers: [], bootstrap: [AppComponent] >)
Теперь мы закончили с настройкой нашего приложения. Давайте создадим компонент диаграммы:
ng generate component chart
Добавьте стиль и элемент для ng2-диаграмм:
> Loading. >
Давайте получим данные для нашего графика. Нам нужно определить входные данные, которые мы передадим компоненту ngx-chart для настройки:
@Input() chartType; @Input() query; @Input() title; public chartData; public chartLabels; public chartOptions: any = ; public chartColors;
Чтобы собрать данные, мы добавим входные данные для запроса и используем API наблюдения Cube.js Angular :
constructor(private cubejs: CubejsClient) <> ngOnInit() console.log("HTTP Error", err)); this.querySubject.next(this.query); >
Это позволит нам получать и отображать новые данные при каждом изменении запроса. Теперь давайте создадим простую панель мониторинга в нашем app.component:
И это сделано! Вы можете найти полученную панель инструментов здесь и демонстрацию CodeSandbox здесь .
Cube Dev

Cube Dev — разработчик модульной платформы Cube.js, предназначенной для создания аналитических приложений. Cube.js создавалась для перевода и отправки запросов на естественном языке к любым источникам данных напрямую из Slack. Cube Dev помогает разработчикам ПО создавать новые инструменты бизнес-аналитики или добавлять аналитику в существующие приложения для клиентов.
Компания основана в 2016 году российскими программистами Артемом Кейдуновым и Павлом Тиуновым. Офис стартапа располагается в Сан-Франциско.
История
2021: Привлечение $15,5 млн инвестиций
19 июля 2021 года Cube Dev сообщила о привлечении $15,5 млн инвестиций. В раунде финансирования Series A в стартап вложились венчурный фонд Decibel, а также Bain Capital Ventures, Betaworks и Eniac Ventures. Детали сделки её участники раскрывать не стали.
Полученные средства Cube Dev намерена потратить на платформу Cube Cloud, представляющую собой проводник между базой данных и приложением. Обычно разработчик приложения создает это связующее звено самостоятельно. Однако основатели Cube Dev считают, что их технология сэкономит 95% времени на разработку. Оставшиеся 5% времени придется потратить на кастомизацию и настройку платформы.
![]()
Российский стартап, сделавший из чат-бота аналитическую платформу, привлек $15,5 млн
Cube Dev не раскрывает свои финансовые показатели. Директор инвестфонда Fort Ross Ventures Денис Ефремов сообщил Forbes, что с учётом объема финансирования и возможных оценок компания должна иметь выручку не менее $3-4 млн в год.
Изначально стартап запустили чат-бот Statsbot, собирающий по запросу небольших интернет-магазинов аналитику по продажам. Он создавался для перевода и отправки запросов на естественном языке к любым источникам данных из Slack. Затем был создан конструктор для анализа Cube.js для узкой аудитории коллег-программистов. Пользователи Cube.js создают заточенные под свои задачи приложения, которые агрегируют данные из разных источников и графически визуализируют их.
По прогнозам аналитиков MarketsandMarkets, мировой рынок облачных баз данных вырастет с $12 млрд в 2020 году до $24,8 млрд к 2025 году, средний годовой прирост составит 15,7%. [1]
2020: Привлечение $6,2 млн инвестиций
В конце сентября 2020 года Cube Dev сообщила о привлечении $6,2 млн инвестиций. Главным источником этого раунда финансирования выступил фонд Bain Capital Ventures. Также в сделке участвовали Eniac Ventures, Betaworks, Innovation Endeavors и Slack Fund, которые ранее уже инвестировали в стартап, и новые инвесторы в лице Uncorrelated Ventures и Overtime.vc. Сколько каждый из них вложил в Cube Dev, не уточняется.
Полученные денежные средства Cube Dev намерена потратить на увеличение штата специалистов (прежде всего, разработчиков со знаниями в области баз данных, программировании на Rust и Node.js), разработку новых открытых продуктов и вывод решений на коммерческий рынок.
![]()
Основанный россиянами разработчик платформы для создания аналитических приложений привлек $6,2 млн

По словам Коэна, Bain Capital Ventures инвестировал в Cube Dev, так как ее команда создала «широкодоступный инструмент Cube.js, который быстро завоевал популярность среди разработчиков по всему миру». Российский рынок мобильных приложений для бизнеса и госсектора: крупнейшие игроки, тенденции и перспективы. Обзор TAdviser
Зарабатывать на Cube.js компания планирует при помощи облачного сервиса Cube Cloud, который к концу сентября 2020 года находится в статусе закрытой беты. [2]
Примечания
- ↑Основанный россиянами IT-стартап Cube Dev привлек $15,5 млн инвестиций
- ↑The Crunchbase News Briefing: Tue., Sept. 29
Россияне, сделавшие из чат-бота аналитическую платформу, привлекли миллионы долларов от инвестора Linkedin и Redis
Калифорнийский стартап Cube Dev, основанный россиянами Артемом Кейдуновым и Павлом Тиуновым и занимающийся развитием бесплатного фреймворка Cube.js, привлек $6,2 млн инвестиций. Поначалу инструмент обеспечивал работу предыдущего проекта Кейдунова и Тиунова – популярного корпоративного бота Statsbot с функциями бизнес-аналитики, однако позднее перерос в самостоятельный продукт.
Инвестиции в Cube Dev
Как стало известно CNews, компания Cube Dev с российскими корнями, разработчик популярного бесплатного фреймворка для создания аналитических приложений Cube.js, привлекла $6,2 млн в рамках инвестиционного раунда. Возглавил раунд американский венчурный фонд Bain Capital Ventures, известный, в частности, инвестициями в социальную сеть Linkedin, разработчика популярной NoSQL-СУБД Redis и сервис для создания опросов и анкет Surveymonkey.
Помимо Bain Capital, в раунде приняли участие Slack Fund, Betaworks, Eniac Ventures, Innovation Endeavors, ранее уже инвестировавшие в проект. К ним также присоединились Uncorrelated Ventures и Overtime.vc. Суммарно Cube Dev привлекла инвестиции на сумму $8,1 млн.
Инвестиции планируется направить на расширение команды, разработку продуктов с открытым исходным кодом и коммерческое внедрение, рассказали CNews в Cube Dev. Компания намерена усилиться высококвалифицированными инженерами, разбирающимися в базах данных, программировании на Rust и Node.js и других смежных технологиях.
Что такое Cube.js
Cube.js – это модульная платформа с открытым исходным кодом для разработки аналитических веб-приложений. Как правило, используется компаниями для создания внутренних инструментов бизнес-аналитики.

Разработчики фреймворка для создания веб-приложений с функциями бизнес-аналитики Cube.js привлекли $6,2 млн инвестиций
Cube.js позволяет командам разработчиков создавать масштабируемые аналитические приложения без необходимости постоянно перестраивать внутреннюю инфраструктуру. Фреймворк дает разработчикам API для доступа к исходным данным из любой базы данных, сохраняя возможности для гибкой настройки фронтенда.
Крупный поставщик ПО для управления бизнесом, компания Jobber, например, использовала Cube.js для создания информационных панелей (дэшбордов) с аналитикой по всем бизнес-процессам.
«Мы должны были создать дэшборды с актуальными бизнес показателями наших клиентов, но это означало огромное количество запросов к нашей базе данных. Для того, чтобы удержать время загрузки страницы в пределах нескольких секунд, нам пришлось бы потратить много усилий на кэширование, оптимизацию запросов и настройку базы данных, — комментирует проект Джастин Вайнрих (Justin Weinrich), системный архитектор Jobber. – Мы решили использовать Cube.js как альтернативу создания полноценного пайплайна и достигли поставленной цели по производительности, избежав затрат на обслуживание пользовательской системы. Мы планируем и дальше использовать Cube.js для предоставления аналитики нашим клиентам».
Истоки проекта
Американская компания Cube Dev со штаб-квартирой в Сан-Франциско была основана россиянами Артемом Кейдуновым и Павлом Тиуновым в 2016 г. Стартап занимается разработкой Cube.js – популярного инструментария с открытым исходным кодом, который предназначен для построения внутренних инструментов бизнес-аналитики.
Основы Cube.js были заложены в процессе работы над предыдущим проектом россиян – аналитическим ботом Statsbot, работающим внутри корпоративного мессенджера Slack и обеспечивающим доступ к данным по запросу на естественном языке. Cube.js как раз и создавался для перевода и отправки таких запросов к любым источникам данных напрямую из Slack.
Марина Громова, Security Vision: Партнерский статус должен зависеть не от оборота, а от экспертизы интегратора
безопасность

В итоге, как объяснили CNews в Cube Dev, сторонние разработчики стали проявлять интерес к фреймворку как инструменту внедрения аналитической функциональности в своих собственных продуктах. Поэтому в 2019 г. команда Statsbot опубликовала исходный код инструментария на Github. По данным компании, с момента релиза Cube.js был запущен на более чем 70 тыс. серверов в компаниях по всему миру. Аналитическим ботом Statsbot на сегодняшний день, по данным сайта проекта, пользуется свыше 40 тыс. команд.
В апреле 2020 г. Кейдунов и Тиунов приняли решение сменить направление и сконцентрироваться на разработке и коммерциализации Cube.js.
Планы по коммерциализации
Зарабатывать на Cube.js компания планирует при помощи облачного сервиса Cube Cloud, который в настоящее время находится в статусе закрытой беты.
«За время существования Cube.js мы помогли десяткам компаний правильно развернуть и настроить инфраструктуру для Cube.js, – рассказывают в Cube Dev. – Даже несмотря на то, что мы живем в облачную эпоху, есть очень много сложных моментов, касающихся правильного управления кластерами Cube.js. И на этом мы хотим сфокусировать наш коммерческий продукт – помочь решить эти проблемы для разработчиков».
В то же время, как пояснили CNews в компании, фреймворк Cube.js останется бесплатным, а его код не будет закрыт.
Как построить систему аналитики на open-source — туториал по cube.js
Сube (до недавнего времени cube.js) относительно молодой проект (первый релиз март 2019) — реализация концепции OLAP-куб. Несмотря на отличную документацию, в интернете пока что мало информации на русском языке. Если вы выбираете систему аналитики, приверженец open-source или просто хотите узнать об альтернативах Power BI и Tableau, то это статья для вас. Обзор платформы и применение на реальном примере.
Кратко об OLAP-кубах
OLAP (Оперативный анализ данных) — технология хранения и обработки многомерных данных, позволяющая получать сложные аналитические отчёты в реальном времени.
В основе технологии лежит представление данных в виде многомерных кубов.
Осями многомерной системы координат служат основные атрибуты анализируемого бизнес-процесса — измерения (dimensions).
На пересечении осей, в ячейках внутри куба находятся данные, количественно характеризующие процесс — меры (measures).
В качестве одного из измерений используется время (time dimension).
На рисунке представлен пример 3-мерного куба, содержащего измерения «Товар», «Месяц» и «Город».

Автором идеи OLAP является Эдгар Кодд, который сформулировал 12 правил, определивших эту технологию:
- Многомерный концептуальный взгляд на данные (Multidimensional conceptual view)
- Прозрачность для пользователя (Transparency)
- Доступность разнородных источников данных (Accessibility)
- Постоянство характеристик производительности при увеличении числа измерений (Consistent reporting performance)
- Клиент-серверная архитектура (Client server architecture)
- Общность измерений по структуре и возможностям обработки (Generic Dimensionality)
- Обработка разреженных матриц (Dynamic sparse matrix handling)
- Наличие многопользовательской среды (Multi-user support)
- Операции с любым числом измерениями (Unrestricted cross-dimensional operations)
- Интуитивное манипулирование данными (Intuitive data manipulation)
- Гибкое формирование отчётности (Flexible reporting)
- Неограниченное число измерений и уровней агрегирования данных (Unlimited Dimensions and aggregation levels)
Представление данных в виде куба обеспечивает возможность реализации концептуально простых операций для поддержки процесса анализа — срез и фрагментацию, детализацию, свертывание и вращение:
- Срез (slice) — извлечение из куба подмножества ячеек, связанных с каким-либо значением одного из его измерений. Например, срез по значению «Февраль» измерения «Месяц» (см. рис. выше) позволяет получить данные по продажам всех товаров во всех городах. Фактически, срез можно рассматривать как одномерный куб, который можно представить в виде обычной плоской таблицы. Использование срезов позволяет выполнить декомпозицию задачи анализа сложных многомерных структур на несколько более простых одномерных задач.
- Фрагментация (dice) — извлечение из куба некоторого подкуба, содержащего только те значения измерений, которые нужны для анализа. Например, фрагмент куба может содержать данные только за определенный интервал дат или о продажах по заданным городам.
- Детализация (Drill Down/Up) — позволяет аналитику изменять уровень представления данных в кубе от более общего к более детальному (down) или наоборот (up).
- Свертывание (RollUp) — агрегирование данных по одному или нескольким измерениям. Производится в том случае, если нужны сводные, а не полные данные.
- Вращение (pivot) — позволяет менять пространственную ориентацию осей измерений куба, выбирая наиболее удобное для аналитика представление.
Платформа Cube
Cube — headless (отделенная от отображения) платформа бизнес аналитики. Она помогает получать данные из разных источников данных, организовать в твердые определения и доставлять в любое приложение. С помощью неё можно построить собственный интерфейс для отображения графиков на любой библиотеке (например rechart.js для React). Или получать данные с помощью REST, GraphQL и SQL API.
Поддерживаемые источники данных:
- Postgres
- MySQL
- SQLite
- MongoDb
- ClickHouse
- Google BigQuery
- . и другие (также поддерживает написание собственных драйверов)
Почему Сube
Не буду копировать преимущества из документации, опишу собственный опыт.
Задача: выбрать систему аналитики для самописной ERP системы.
Варианты: Power BI или другие подобные решения, написанием запросов на чистом SQL и Cube.
Преимущества
- Бесплатно Стоимость пользователя в Power BI 10$
- Быстро Так как Power BI работает не напрямую с источником данных, а создает “набор данных” для кеширования и оптимизации запросов это работает дольше даже на небольших наборах данных. Cube выполняет запросы напрямую в SQL, в связке с кешированием и преагрегацией это дает высокую скорость
- Простая интеграция Интеграция в уже существующий фронтенд Power BI оказалась тяжелой задачей из-за отдельных окон (iframe) для каждого отчёта и отдельного контроля доступа. Наличие REST API и GraphQL API значительно облегчают эту задачу.
- Кривая обучения Для использования достаточно иметь базовые знания по SQL и базам данным
Проблемы
- Работа с несколькими источниками данных Есть трудности с объединением, например данных из MongoDb и MySQL, для этого требуется написать сложные преагрегации.
- Пока что нет поддержки REST API Например у внешней CRM системы нет прямого доступа к базе данных. Поэтому для анализа потребуется выгрузка в один из поддерживаемых источников данных.
- Поддержка Несмотря на организацию SQL кода, при изменении структуры данных аналитика сломается. Для этого нужен поставленный процесс разработки или умный CI, чтобы изменения в структуре данных не заливались в прод, пока не поправится схема в Cube. Также не хватает инструментов проверки корректности запросов на тестовых данных, чтобы интегрировать это в CI.
Архитектура
CUBE выступает как слой доступа к данным, переводит запросы в SQL, управляет кешированием, очередью и подключением к базе данных.

- Файлы схемы данных. Обычные JS файлы, на основании которых генерируется SQL
- Сервер на NodeJS. Генерирует и выполняет SQL запросы по схеме, отвечает за кеширование и контроль доступа.
- Клиентская библиотека. Выполнение запросов и преобразование данных для отрисовки
Практическая задача
У нас есть данные о звонках, которые совершают сотрудники. Схема данных выглядит следующим образом

CallInfo (Информация о звонке)
- type — income, outcome
- status — ‘success’, ‘missed’, ‘busy’, ‘not_available’, ‘not_allowed’
- incomePhone в формате +799999999
Требуется построить минимальный анализ, сразу напишем SQL запросы
Получить количество пропущенных звонков по сотрудникам
SELECT CONCAT(e.name, e.second_name, e.patronymic) as initials, count(*) FROM calls c LEFT JOIN phone_number pn ON pn.phone = c.income_phone LEFT JOIN employee e ON e.id = pn.employee_id WHERE status = ‘missed’ AND start_date ≥= ‘2022-01-01’ AND start_date ≤= ‘2022-02-01’ GROUP BY initials
Среднюю длительность разговора по сотрудникам
SELECT CONCAT(e.name, e.second_name, e.patronymic) as initials, avg(duration) FROM calls c LEFT JOIN phone_number pn ON pn.phone = c.income_phone LEFT JOIN employee e ON e.id = pn.employee_id WHERE start_date ≥= ‘2022-01-01’ AND start_date ≤= ‘2022-01-01’ GROUP BY initals
Песочница
В Cube есть песочница, с возможностью создания схемы на основании таблиц БД, конструировании и выполнение запросов, визуализацией и генерацией шаблонов фронтенд приложений.
Для тех, кто хочет самостоятельно изучить возможности и посмотреть как это выглядит на практике, я создал репозиторий с данными, схемой и интср.
Схема
Каждый куб определяется в отдельном файле. Отдельный куб отражает определенный набор данных, в SQL это можно достичь с помощью представлений. Внутри каждого куба объявляются измерения (dimensions) и меры (measures)
Определим Куб Информации о звонках
cube(`CallInfo`, < // основной SQL запрос sql: `SELECT * FROM calls`, //меры measures: < count: < type: `count`, >, countMissed: < type: `count`, filters: [ < sql: `status = 'missed'` >] >, avgDuration: < type: `avg`, sql: `duration` >>, // измерения dimensions: < type: < sql: `call_type`, type: `string` >, incomePhone: < sql: `income_phone`, type: `string` >, outcomePhone: < sql: `outcome_phone`, type: `string` >, status: < sql: `status`, type: `string` >, duration: < sql: `duration`, type: `number` >, startDate: < sql: `start_date`, type: `time` >> >)
Воспользуемся песочницей, чтобы сконструировать запрос

- Measures — доступные меры
- Dimensions — доступные измерения
- Segment — доступные сегменты (статические фильтры)
- Time — доступные временные измерения. Добавление фильтрации по временному периоду
- Filters — доступные фильтры. Добавление фильтрации для данных
Возможность выбрать тип графика
- Line — Линейная
- Area — с областями
- Bar — Столбчатая
- Pie — Круговая
- Table — таблица (с ним мы и будем работать)
- Number — число
Остальные возможности в этом туториале нам не потребуются.

Соединения (joins)
Так как мы анализируем звонки в разрезе сотрудников, нам понадобятся ещё два куба “Сотрудники” и “Номера”
Почему мы не сделали один куб, где запрашивались бы сразу все необходимые данные?
Да, можно было бы написать один куб и ограничится на этом, все зависит от задач.
Мотивация в разделении на отдельные кубы состоит в том, что можно анализировать как отдельные простые сущности, так и строить сложный анализ, где участвуют множество измерений из разных процессов.
В рамках нашей задачи это может выглядеть так
Звонки
- Динамика количества входящих звонков по месяцам
- Среднее количество пропущенных звонков по месяцам
Сотрудники
- Динамика среднего количества уволенных сотрудников по месяцам (при наличии даты найма и статуса в компании в таблице сотрудников)
Номера
- Количество телефонных номеров в организации
Комлпексные с измерениями и мерами из нескольких сущностей
- Динамика коэффициента соотношения пропущенных звонков к входящим в разрезе сотрудника
- Количество звонков на неизвестные номера (запись есть в CallInfo, но нет номера привязанного к сотруднику)
Для того, чтобы соблюдать принцип DRY (Dont Repeat Yourself) мы выносим кусочки SQL кода в отдельные логические единицы (кубы) привязанные к процессу или сущности — это может быть одна таблица, несколько таблиц с JOIN либо сложный UNION.
Типы соединений в CUBE соответствуют типам отношений в SQL
- hasMany — один ко многим
- belongsTo — много к одному
- hasOne — один к одному
Для нашей задачи нам требуется соединение CallInfo → PhoneNumber → Employees
Cube автоматически находит связь между кубами с помощью алгоритма Дейкстры, поэтому не нам не требуется определять связи в каждом кубе.
Определим Куб Сотрудников
cube(`Employee`, < sql: `SELECT * FROM employee`, joins: < PhoneNumber: < // указываем условие соединения, это подставится после ключевого слова ON sql: `$.id = $.employee_id`, // 1 сотрудник может иметь несколько номеров relationship: `hasMany` > >, dimensions: < name: < sql: `name`, type: `string` >, secondName: < sql: `second_name`, type: `string` >, patronymic: < sql: `patronymic`, type: `string` >, position: < sql: `position`, type: `string` >, initials: < sql: ` CONCAT($, ' ', LEFT($, 1), '.', LEFT($,1) )`, // соединяем Фамилию и первые буквы имени и отчества // CUBE - ссылка на текущий куб (таблицу) type: `string` > > >)

Определим Куб Номеров
cube(`PhoneNumber`, < sql: `SELECT * FROM phone_number`, joins: < // т.к номер телефона является связующим между звонком и сотрудником, определяем связи с другими кубами CallInfo: < sql: `$.phone = $.income_phone`, relationship: `hasMany` > >, dimensions: < phone: < sql: `phone`, type: `string` >> >)
Теперь мы можем выполнить запросы из задачи

Сгенерированный SQL
SELECT CONCAT( `employee`.second_name, ' ', LEFT(`employee`.name, 1), '.', LEFT(`employee`.patronymic, 1) ) `employee__initials`, count( CASE WHEN (status = 'missed') THEN `call_info`.id END ) `call_info__count_missed` FROM employee AS `employee` LEFT JOIN phone_number AS `phone_number` ON `employee`.id = `phone_number`.employee_id LEFT JOIN call_info AS `call_info` ON `phone_number`.phone = `call_info`.income_phone WHERE ( `call_info`.start_date >= TIMESTAMP(convert_tz(?, '+00:00', @ @session.time_zone)) AND `call_info`.start_date

Сгенерированный SQL
SELECT CONCAT( `employee`.second_name, ' ', LEFT(`employee`.name, 1), '.', LEFT(`employee`.patronymic, 1) ) `employee__initials`, avg(`call_info`.duration) `call_info__avg_duration` FROM employee AS `employee` LEFT JOIN phone_number AS `phone_number` ON `employee`.id = `phone_number`.employee_id LEFT JOIN call_info AS `call_info` ON `phone_number`.phone = `call_info`.income_phone WHERE ( `call_info`.start_date >= TIMESTAMP(convert_tz(?, '+00:00', @ @session.time_zone)) AND `call_info`.start_date
Итог: как применять в продакшне
Мы определили схему и можем получать данные не только на фронтенде, но и в любом другом сервисе.
Пример запроса к REST API
< "measures": ["CallInfo.avgDuration"], "dimensions": ["Employees.initials"], "filters": [< "member": "Employees.id", "operator": "equals", "values": ["1"] >], "timeDimensions": [< "dimension": "CallInfo.startDate", "dateRange": ['2022-01-01', '2022-01-02'] >], >
< . запрос "data":[ < "CallInfo.avgDuration": 5, "Employees.initials": "Иванов" >, < "CallInfo.avgDuration": 4, "Employees.initials": "Петрова" >] . метаданные >
Из личного опыта
На момент написания статьи в ERP системе в схеме данных более 150 таблиц и более 100 кубов для анализа. Написан редактор рабочих столов. Данные используются в разных частях приложения.
Примеры комплексного анализа

- Зависимость успешности продажи от количества дней обработки заявки
- Процент участия сотрудника в прибыли
- Сумма прибыли на вложенный рубль рекламы
Источники