{"id":35559592,"url":"https://github.com/akardapolov/dimension-db","last_synced_at":"2026-04-12T08:03:09.647Z","repository":{"id":305133808,"uuid":"1013115316","full_name":"akardapolov/dimension-db","owner":"akardapolov","description":" Hybrid time-series and block-column storage database engine written in Java","archived":false,"fork":false,"pushed_at":"2026-01-17T09:27:37.000Z","size":3628,"stargazers_count":5,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-17T20:34:11.335Z","etag":null,"topics":["big-data-processing","column-store","dbms","java","sql","time-series"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akardapolov.png","metadata":{"files":{"readme":"README-RU.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-03T11:34:53.000Z","updated_at":"2026-01-17T09:16:38.000Z","dependencies_parsed_at":"2025-07-18T14:27:23.949Z","dependency_job_id":"b1941fad-404b-4a0c-9bf8-53b011ffbbfa","html_url":"https://github.com/akardapolov/dimension-db","commit_stats":null,"previous_names":["akardapolov/dimension-db"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/akardapolov/dimension-db","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akardapolov%2Fdimension-db","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akardapolov%2Fdimension-db/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akardapolov%2Fdimension-db/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akardapolov%2Fdimension-db/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akardapolov","download_url":"https://codeload.github.com/akardapolov/dimension-db/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akardapolov%2Fdimension-db/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28526574,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["big-data-processing","column-store","dbms","java","sql","time-series"],"created_at":"2026-01-04T10:14:42.782Z","updated_at":"2026-04-12T08:03:09.638Z","avatar_url":"https://github.com/akardapolov.png","language":"Java","readme":"# Dimension DB\n\n![Dimension DB logo](media/dimension-db.png)\n\nГибридная БД блочно-колоночного типа для хранения данных временных рядов на Java\n\n## Оглавление\n\n- [Описание программы](#описание-программы)\n  - [Общие сведения](#общие-сведения)\n  - [Направления прикладного использования](#направления-прикладного-использования)\n  - [Минимальные технические требования](#Минимальные-технические-требования)\n  - [Начало работы с проектом](#начало-работы-с-проектом)\n    - [Сборка проекта](#сборка-проекта)\n    - [Использование проекта](#использование-проекта)\n    - [Подготовка окружения для запуска модульных тестов](#подготовка-окружения-для-запуска-модульных-тестов)\n    - [Подготовка окружения для запуска интеграционных тестов](#подготовка-окружения-для-запуска-интеграционных-тестов)\n      - [PostgreSQL](#postgresql)\n      - [Oracle](#oracle)\n      - [MS SQL](#ms-sql)\n      - [Clickhouse](#clickhouse)\n      - [Загрузка тестовых данных в Clickhouse](#загрузка-тестовых-данных-в-clickhouse)\n  - [Описание логической структуры](#описание-логической-структуры)\n    - [Архитектура БД](#архитектура-БД)\n      - [Формат хранения данных](#формат-хранения-данных)\n    - [Алгоритмы](#алгоритмы)\n      - [Алгоритм инициализации БД](#алгоритм-инициализации-бд)\n    - [API программы](#api-программы)\n      - [Диаграмма последовательности API](#диаграмма-последовательности-api)\n      - [Используемые методы](#используемые-методы)\n        - [Интерфейс DStore](#интерфейс-dstore)\n        - [Класс Dimension DB](#класс-dimension-db)\n        - [Параметры](#параметры)\n          - [Тип таблицы - enum TType](#тип-таблицы---enum-ttype)\n          - [Тип индексирования таблицы - enum IType](#тип-индексирования-таблицы---enum-itype)\n          - [Тип способа анализа данных по таблице - enum AType](#тип-способа-анализа-данных-по-таблице---enum-atype)\n          - [Тип backend таблицы - enum BType](#тип-backend-таблицы---enum-btype)\n          - [Тип функции группировки данных - enum GroupFunction](#тип-функции-группировки-данных---enum-groupfunction)\n          - [Параметры хранения столбца таблицы - класс CSType](#параметры-хранения-столбца-таблицы---класс-cstype)\n            - [Тип хранения данных - enum SType](#тип-хранения-данных---enum-stype)\n            - [Тип хранения данных Java - enum CType](#тип-хранения-данных-java---enum-ctype)\n            - [Тип хранения данных JDBC - enum DataType](#тип-хранения-данных-jdbc---enum-datatype)\n        - [Входные параметры](#входные-параметры)\n          - [Настройки БД - класс Dimension DBConfig](#настройки-бд---класс-dimension-dbconfig)\n          - [Настройки таблицы SProfile](#настройки-таблицы-sprofile)\n        - [Выходные параметры](#выходные-параметры)\n          - [Настройки таблицы - класс TProfile](#настройки-таблицы---класс-tprofile)\n          - [Настройки столбца таблицы - класс CProfile](#настройки-столбца-таблицы---класс-cprofile)\n          - [Объект для получения агрегатов данных из stacked API - класс StackedColumn](#объект-для-получения-агрегатов-данных-из-stacked-api---класс-stackedcolumn)\n          - [Объект для получения агрегатов данных из gantt API - классы GanttColumnCount и GanttColumnSum](#объект-для-получения-агрегатов-данных-из-gantt-api---классы-ganttcolumncount-и-ganttcolumnsum)\n    - [Варианты использования кода](#варианты-использования-кода)\n    - [Производительность](#производительность)\n- [Загрузка](#загрузка)\n- [Разработка](#разработка)\n- [Документация](#документация)\n- [Лицензия](#лицензия)\n- [Контакты](#контакты)\n\n## Описание программы\n\n### Общие сведения\nDimension DB - гибридная колоночная база данных для хранения данных временных рядов. Написана на языке программирования Java.\n\nКлючевые особенности:\n- Колоночный формат хранения данных;\n- Хранение данных временных рядов;\n- Формат хранения с встроенной поддержкой дедупликации данных и сжатия;\n- Установка формата хранения на уровне таблицы и блока;\n- Автоматический выбор алгоритма дедупликации на основе собираемых данных;\n- Использование для локального хранения в качестве backend базы данных Berkley DB;\n- Поддержка основных типов данных JDBC для БД PostgreSQL, Oracle, MS SQL и ClickHouse;\n- В режиме «только для чтения» автоматическое формирование SQL запросов к таблицам с данными временных рядов;\n\n[Вернуться в Оглавление](#Оглавление)\n\n### Направления прикладного использования\nБиблиотека может использоваться в качестве легковесной аналитической базы данных для backend систем обработки данных на платформе Java для решения следующих прикладных задач;\n- хранения собранных данных и аналитической обработки небольших и среднего объема данных для различных встроенных приложений на Java;\n- хранение и обработка данных \"Интернета вещей\" (англ. Internet of Things, IoT) на самих устройствах в качестве временного хранилища, кэша и других задач, связанных с локальной обработкой данных;\n- хранилище метаданных для выполнения запросов во внешних источниках данных с помощью автоматической генерации SQL по модели данных для аналитических приложений.\n[Вернуться в Оглавление](#Оглавление)\n\n## Минимальные технические требования\n**Dimension DB** совместим с Java 25+ и поставляется с небольшим набором зависимостей.\n\n### Требования к аппаратному обеспечению\n\nТаблица 1. Требования к аппаратному обеспечению\n\n| Параметр        | Описание                                                                                                        |\n|:----------------|:----------------------------------------------------------------------------------------------------------------|\n| CPU и ОЗУ       | Процессор частотой не ниже 500 МHz и объем памяти не ниже 250 Мб, в зависимости от объема обрабатываемых данных |\n| Архитектура CPU | Intel 64-bit (x86_64), AMD 64-bit (x86_64), Arm 64-bit (aarch64)                                                |\n| Диск            | Размер диска в зависимости от объема обрабатываемых данных                                                      |\n\n### Требования к программному обеспечению\n\nТаблица 2. Требования к программному обеспечению\n\n| ПО    | Требования                  |\n|:------|:----------------------------|\n| Java  | Версия Java 25+             |\n| Maven | Не ниже 3 версии            |\n| Git   | Последняя актуальная версия |\n\n### Требования к операционному обеспечению\n\nТаблица 3. Требования к операционному обеспечению\n\n| ПО                   | Требования                  |\n|:---------------------|:----------------------------|\n| Операционная система | Windows, Linux, MacOS       |\n\n[Вернуться в Оглавление](#Оглавление)\n\n### Начало работы с проектом\n\n**Предварительные требования:** Java 25+, Maven 3.9+ и последняя версия Git.\n\n```shell\njava -version\nmvn -version\ngit --version\n```\n\n### Получение исходного кода\n\n```shell\ngit clone https://github.com/akardapolov/dimension-db.git\ncd dimension-db\n```\n\n### Сборка проекта\n\nКомпиляция исходного кода проекта:\n\n```shell\nmvn clean compile\n```\n\nЗапуск модульных тестов:\n\n```shell\nmvn clean test\n```\n\nСборка проекта в jar-файл **Dimension DB**:\n\n```shell\nmvn clean package\n```\n\nСборка и установка jar-файла **Dimension DB** в локальный репозиторий Maven:\n\n```shell\nmvn clean install\n```\n\nСборка с явным указанием версии (переопределение `${revision}` для данной сборки):\n\n```shell\nmvn clean install -Drevision=26.2.3\n```\n\n\u003e **Примечания по выполнению тестов:**\n\u003e - Сборка проекта может включать запуск модульных тестов из **DimensionDBRunnerTest** и **DBaseRunnerUseCasesTest**, выполнение которых занимает приблизительно 25 минут.\n\u003e - Большая часть этого времени приходится на класс **DimensionDBRunnerTest**, который запускает 45 тестов с различными конфигурациями.\n\u003e - Оба класса — **DimensionDBRunnerTest** и **DBaseRunnerUseCasesTest** — по умолчанию отключены с помощью аннотации **@Disabled**.\n\u003e - Класс **DimensionDBRunnerTest** содержит тесты с различными уровнями перестановок, подробности приведены ниже:\n\u003e\n\u003e | Название теста         | PermutationState | Количество конфигураций  | Всего тестов | Время выполнения |\n\u003e |------------------------|------------------|--------------------------|--------------|------------------|\n\u003e | testPermutationNone    | NONE             | 108                      | 4 860        | ~ 9 секунд       |\n\u003e | testPermutationPartial | PARTIAL          | 1 944                    | 87 480       | ~ 2 минуты       |\n\u003e | testPermutationAll     | ALL              | 26 244                   | 1 180 980    | ~ 25 минут       |\n\u003e\n\u003e Чтобы сократить время сборки, пропустив эти тесты, используйте следующие команды Maven:\n\u003e ```shell\n\u003e mvn clean test -Dtest=!DimensionDBRunnerTest\n\u003e mvn clean package -Dtest=!DimensionDBRunnerTest\n\u003e mvn clean install -Dtest=!DimensionDBRunnerTest\n\u003e ```\n\n### Релиз через Git-тег\n\nИспользуйте этот процесс, когда публикация/развёртывание выполняется CI-конвейером при отправке тега. CI автоматически выполнит сборку, тестирование и публикацию в GitHub Releases.\n\n**Linux / macOS (Bash)**\n\n```bash\nexport RELEASE_VERSION=26.2.3\ngit tag -a v\"$RELEASE_VERSION\" -m \"Release $RELEASE_VERSION\"\ngit push origin v\"$RELEASE_VERSION\"\n```\n\n**Windows (PowerShell)**\n\n```powershell\n$env:RELEASE_VERSION=\"26.2.3\"\ngit tag -a v\"$env:RELEASE_VERSION\" -m \"Release $env:RELEASE_VERSION\"\ngit push origin v\"$env:RELEASE_VERSION\"\n```\n\n**Windows (CMD)**\n\n```cmd\nset RELEASE_VERSION=26.2.3\ngit tag -a v%RELEASE_VERSION% -m \"Release %RELEASE_VERSION%\"\ngit push origin v%RELEASE_VERSION%\n```\n\n### Ручная публикация (Maven Central)\n\nЕсли необходимо выполнить публикацию вручную с вашей машины (требуется настроенный `settings.xml` с учётными данными и подпись GPG):\n\n```bash\nmvn deploy -Pcentral -DperformRelease=true -Drevision=26.2.3\n```\n\n[Вернуться в Оглавление](#Оглавление)\n\n#### Использование проекта\nДля использования БД **Dimension DB** в Java приложении необходим добавить jar-файл в качестве зависимости в файл настроек Maven pom.xml\n\nДобавьте jar-файл **Dimension DB** в качестве зависимости в файл настроек pom.xml вашего проекта:\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cproject\u003e\n  \u003cproperties\u003e\n    \u003cdimension-db-version\u003e25.7.1\u003c/dimension-db-version\u003e\n  \u003c/properties\u003e\n  \u003c!--.....--\u003e\n  \u003c!--.....--\u003e\n  \u003c!--.....--\u003e\n  \u003cdependencies\u003e\n    \u003cdependency\u003e\n      \u003cgroupId\u003eru.dimension\u003c/groupId\u003e\n      \u003cartifactId\u003eDimension DB\u003c/artifactId\u003e\n      \u003cversion\u003e{Dimension DB-version}\u003c/version\u003e\n    \u003c/dependency\u003e\n  \u003c/dependencies\u003e\n\u003c/project\u003e\n```\n\nПримечания:\n- Для сборки и установки последней актуальной версии библиотеки **Dimension DB** в локальный репозиторий Maven скачайте исходные коды приложения и выполните:\n  ```shell\n    mvn clean install\n  ```\nПодробности по сборке и установке проекта описаны в разделе [Сборка проекта](#сборка-проекта)\n- Полный список вариантов использования Dimension DB в вашем приложении вы можете найти в разделе [Варианты использования кода](#Варианты-использования-кода).\n\n[Вернуться в Оглавление](#Оглавление)\n\n#### Подготовка окружения для запуска модульных тестов\nДля запуска модульных тестов необходимо выполнить шаги по сборке проекта из раздела [Сборка проекта](#сборка-проекта)\n\n[Вернуться в Оглавление](#Оглавление)\n\n#### Подготовка окружения для запуска интеграционных тестов\nПодготовка окружения для запуска интеграционных тестов требует локальной установки баз данных с помощью Docker Desktop\n\nИнструкция по установке Docker Desktop для [Windows](https://docs.docker.com/desktop/install/windows-install/) и [Linux](https://docs.docker.com/desktop/install/linux/)\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### PostgreSQL\nУстановить и запустить контейнер с БД PostgreSQL\n\n  ```shell\n    docker run -d --name db \\\n    -e 'POSTGRES_PASSWORD=postgres' \\\n    -p 5432:5432 \\\n    -v pgdata:/var/lib/postgresql/data \\\n    postgres \\\n    postgres -c 'max_connections=200'\n  ```\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Oracle\n- Установить локально [репозиторий](https://github.com/oracle/docker-images) скриптов для установки БД Oracle\n- Скачать дистрибутив БД с сайта [Oracle](https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html). Для платформы Linux x86 и версии БД 19.3 файл LINUX.X64_193000_db_home.zip скопировать в локальную директорию репозитория скриптов OracleDatabase/SingleInstance/dockerfiles/19.3.0\n- Запустить скрипт buildContainerImage.sh из репозитория скриптов и указать параметры (пример для версии БД 19.3.0)\n```shell\n    OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh -v 19.3.0 -e -i\n  ```\n- Установить и запустить контейнер с инстансом БД Oracle из командной строки (пример запуска команды Docker run для версии БД 19.3.0)\n```shell\n    docker run --name database19ee  \\\n    -p 1523:1521 -p 5522:5500 -e  \\\n    ORACLE_SID=orcl -e ORACLE_PDB=pdb_orcl -e ORACLE_PWD=sys  \\\n    -e ORACLE_CHARACTERSET=AL32UTF8  \\\n    -v /opt/oracle/oradata oracle/database:19.3.0-ee\n  ```\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### MS SQL\nУстановить и запустить контейнер с БД MS SQL\n  ```shell\n    docker run -e 'ACCEPT_EULA=Y' \\\n    -e 'SA_PASSWORD=QOEfSsa51234!' \\\n    -p 1433:1433 \\\n    -v |(pwd)/drive:/var/opt/mssql/data \\\n    --name mssql \\\n    mcr.microsoft.com/mssql/server\n  ```\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Clickhouse\nУстановить и запустить контейнер с БД Clickhouse\n  ```shell\n    docker run -d --name clickhouse-server \\\n    -e CLICKHOUSE_USER=admin -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=admin \\\n    -p 8123:8123 -p 9000:9000 \\\n    -v C:\\clickhouse:/var/lib/clickhouse clickhouse/clickhouse-server\n  ```\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Загрузка тестовых данных в Clickhouse\n- Установить [Clickhouse](#clickhouse) локально и проверить подключение к ClickHouse на локальном ПК по URL **\"jdbc:clickhouse://localhost:8123\"** или использовать другую строку подключения и внести изменения в тесты;\n- Загрузить тестовые данные [Заказы такси Нью-Йорка](https://clickhouse.com/docs/en/getting-started/example-datasets/nyc-taxi#download-of-prepared-partitions) в локальный экземпляр ClickHouse (используется формат предварительно подготовленных разделов, загруженных в схему datasets);\n- Проверить что данные загрузились `clickhouse-client --query \"select count(*) from datasets.trips_mergetree\"`;\n- Создать директорию для локального хранения данных **Dimension DB** (пример для Windows) **\"C:\\\\Users\\\\.temp\"**;\n- Загрузить тестовые данные в локальную БД **Dimension DB**, используя любой из методов в **Dimension DBCHLoadDataTest**, помеченный аннотацией @Test;\n– Запустить интеграционные тесты в **Dimension DBCHQueryGanttTest**, **Dimension DBCHQueryStackedTest** или **Dimension DBCHQueryRawTest** которые помечены аннотацией @Test;\n\nПримечания:\n- В интеграционных тестах используется аннотация **@Disabled** для отключения их при запуске модульных тестов Dimension DB, при необходимости ее следует удалить для корректной загрузки данных и тестирования.\n- Тестовые данные таблицы trips_mergetree загружаются в схему datasets\n  ```\n    CREATE DATABASE datasets;\n  ```\n- Определение таблицы trips_mergetree\n\n\u003cdetails\u003e\n  \u003csummary\u003eCREATE TABLE trips_mergetree\u003c/summary\u003e\n\n```\n    CREATE TABLE trips_mergetree (\n      trip_id UInt32,\n      vendor_id Enum8('1' = 1, '2' = 2, 'CMT' = 3, 'VTS' = 4, 'DDS' = 5, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14),\n      pickup_date Date,\n      pickup_datetime DateTime,\n      dropoff_date Date,\n      dropoff_datetime DateTime,\n      store_and_fwd_flag UInt8,\n      rate_code_id UInt8,\n      pickup_longitude Float64,\n      pickup_latitude Float64,\n      dropoff_longitude Float64,\n      dropoff_latitude Float64,\n      passenger_count UInt8,\n      trip_distance Float64,\n      fare_amount Float32,\n      extra Float32,\n      mta_tax Float32,\n      tip_amount Float32,\n      tolls_amount Float32,\n      ehail_fee Float32,\n      improvement_surcharge Float32,\n      total_amount Float32,\n      payment_type_ Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4),\n      trip_type UInt8,\n      pickup FixedString(25),\n      dropoff FixedString(25),\n      cab_type Enum8('yellow' = 1, 'green' = 2, 'uber' = 3),\n      pickup_nyct2010_gid UInt8,\n      pickup_ctlabel Float32,\n      pickup_borocode UInt8,\n      pickup_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5),\n      pickup_ct2010 FixedString(6),\n      pickup_boroct2010 FixedString(7),\n      pickup_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2),\n      pickup_ntacode FixedString(4),\n      pickup_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195),\n      pickup_puma UInt16,\n      dropoff_nyct2010_gid UInt8,\n      dropoff_ctlabel Float32,\n      dropoff_borocode UInt8,\n      dropoff_boroname Enum8('' = 0, 'Manhattan' = 1, 'Bronx' = 2, 'Brooklyn' = 3, 'Queens' = 4, 'Staten Island' = 5),\n      dropoff_ct2010 FixedString(6),\n      dropoff_boroct2010 FixedString(7),\n      dropoff_cdeligibil Enum8(' ' = 0, 'E' = 1, 'I' = 2),\n      dropoff_ntacode FixedString(4),\n      dropoff_ntaname Enum16('' = 0, 'Airport' = 1, 'Allerton-Pelham Gardens' = 2, 'Annadale-Huguenot-Prince\\'s Bay-Eltingville' = 3, 'Arden Heights' = 4, 'Astoria' = 5, 'Auburndale' = 6, 'Baisley Park' = 7, 'Bath Beach' = 8, 'Battery Park City-Lower Manhattan' = 9, 'Bay Ridge' = 10, 'Bayside-Bayside Hills' = 11, 'Bedford' = 12, 'Bedford Park-Fordham North' = 13, 'Bellerose' = 14, 'Belmont' = 15, 'Bensonhurst East' = 16, 'Bensonhurst West' = 17, 'Borough Park' = 18, 'Breezy Point-Belle Harbor-Rockaway Park-Broad Channel' = 19, 'Briarwood-Jamaica Hills' = 20, 'Brighton Beach' = 21, 'Bronxdale' = 22, 'Brooklyn Heights-Cobble Hill' = 23, 'Brownsville' = 24, 'Bushwick North' = 25, 'Bushwick South' = 26, 'Cambria Heights' = 27, 'Canarsie' = 28, 'Carroll Gardens-Columbia Street-Red Hook' = 29, 'Central Harlem North-Polo Grounds' = 30, 'Central Harlem South' = 31, 'Charleston-Richmond Valley-Tottenville' = 32, 'Chinatown' = 33, 'Claremont-Bathgate' = 34, 'Clinton' = 35, 'Clinton Hill' = 36, 'Co-op City' = 37, 'College Point' = 38, 'Corona' = 39, 'Crotona Park East' = 40, 'Crown Heights North' = 41, 'Crown Heights South' = 42, 'Cypress Hills-City Line' = 43, 'DUMBO-Vinegar Hill-Downtown Brooklyn-Boerum Hill' = 44, 'Douglas Manor-Douglaston-Little Neck' = 45, 'Dyker Heights' = 46, 'East Concourse-Concourse Village' = 47, 'East Elmhurst' = 48, 'East Flatbush-Farragut' = 49, 'East Flushing' = 50, 'East Harlem North' = 51, 'East Harlem South' = 52, 'East New York' = 53, 'East New York (Pennsylvania Ave)' = 54, 'East Tremont' = 55, 'East Village' = 56, 'East Williamsburg' = 57, 'Eastchester-Edenwald-Baychester' = 58, 'Elmhurst' = 59, 'Elmhurst-Maspeth' = 60, 'Erasmus' = 61, 'Far Rockaway-Bayswater' = 62, 'Flatbush' = 63, 'Flatlands' = 64, 'Flushing' = 65, 'Fordham South' = 66, 'Forest Hills' = 67, 'Fort Greene' = 68, 'Fresh Meadows-Utopia' = 69, 'Ft. Totten-Bay Terrace-Clearview' = 70, 'Georgetown-Marine Park-Bergen Beach-Mill Basin' = 71, 'Glen Oaks-Floral Park-New Hyde Park' = 72, 'Glendale' = 73, 'Gramercy' = 74, 'Grasmere-Arrochar-Ft. Wadsworth' = 75, 'Gravesend' = 76, 'Great Kills' = 77, 'Greenpoint' = 78, 'Grymes Hill-Clifton-Fox Hills' = 79, 'Hamilton Heights' = 80, 'Hammels-Arverne-Edgemere' = 81, 'Highbridge' = 82, 'Hollis' = 83, 'Homecrest' = 84, 'Hudson Yards-Chelsea-Flatiron-Union Square' = 85, 'Hunters Point-Sunnyside-West Maspeth' = 86, 'Hunts Point' = 87, 'Jackson Heights' = 88, 'Jamaica' = 89, 'Jamaica Estates-Holliswood' = 90, 'Kensington-Ocean Parkway' = 91, 'Kew Gardens' = 92, 'Kew Gardens Hills' = 93, 'Kingsbridge Heights' = 94, 'Laurelton' = 95, 'Lenox Hill-Roosevelt Island' = 96, 'Lincoln Square' = 97, 'Lindenwood-Howard Beach' = 98, 'Longwood' = 99, 'Lower East Side' = 100, 'Madison' = 101, 'Manhattanville' = 102, 'Marble Hill-Inwood' = 103, 'Mariner\\'s Harbor-Arlington-Port Ivory-Graniteville' = 104, 'Maspeth' = 105, 'Melrose South-Mott Haven North' = 106, 'Middle Village' = 107, 'Midtown-Midtown South' = 108, 'Midwood' = 109, 'Morningside Heights' = 110, 'Morrisania-Melrose' = 111, 'Mott Haven-Port Morris' = 112, 'Mount Hope' = 113, 'Murray Hill' = 114, 'Murray Hill-Kips Bay' = 115, 'New Brighton-Silver Lake' = 116, 'New Dorp-Midland Beach' = 117, 'New Springville-Bloomfield-Travis' = 118, 'North Corona' = 119, 'North Riverdale-Fieldston-Riverdale' = 120, 'North Side-South Side' = 121, 'Norwood' = 122, 'Oakland Gardens' = 123, 'Oakwood-Oakwood Beach' = 124, 'Ocean Hill' = 125, 'Ocean Parkway South' = 126, 'Old Astoria' = 127, 'Old Town-Dongan Hills-South Beach' = 128, 'Ozone Park' = 129, 'Park Slope-Gowanus' = 130, 'Parkchester' = 131, 'Pelham Bay-Country Club-City Island' = 132, 'Pelham Parkway' = 133, 'Pomonok-Flushing Heights-Hillcrest' = 134, 'Port Richmond' = 135, 'Prospect Heights' = 136, 'Prospect Lefferts Gardens-Wingate' = 137, 'Queens Village' = 138, 'Queensboro Hill' = 139, 'Queensbridge-Ravenswood-Long Island City' = 140, 'Rego Park' = 141, 'Richmond Hill' = 142, 'Ridgewood' = 143, 'Rikers Island' = 144, 'Rosedale' = 145, 'Rossville-Woodrow' = 146, 'Rugby-Remsen Village' = 147, 'Schuylerville-Throgs Neck-Edgewater Park' = 148, 'Seagate-Coney Island' = 149, 'Sheepshead Bay-Gerritsen Beach-Manhattan Beach' = 150, 'SoHo-TriBeCa-Civic Center-Little Italy' = 151, 'Soundview-Bruckner' = 152, 'Soundview-Castle Hill-Clason Point-Harding Park' = 153, 'South Jamaica' = 154, 'South Ozone Park' = 155, 'Springfield Gardens North' = 156, 'Springfield Gardens South-Brookville' = 157, 'Spuyten Duyvil-Kingsbridge' = 158, 'St. Albans' = 159, 'Stapleton-Rosebank' = 160, 'Starrett City' = 161, 'Steinway' = 162, 'Stuyvesant Heights' = 163, 'Stuyvesant Town-Cooper Village' = 164, 'Sunset Park East' = 165, 'Sunset Park West' = 166, 'Todt Hill-Emerson Hill-Heartland Village-Lighthouse Hill' = 167, 'Turtle Bay-East Midtown' = 168, 'University Heights-Morris Heights' = 169, 'Upper East Side-Carnegie Hill' = 170, 'Upper West Side' = 171, 'Van Cortlandt Village' = 172, 'Van Nest-Morris Park-Westchester Square' = 173, 'Washington Heights North' = 174, 'Washington Heights South' = 175, 'West Brighton' = 176, 'West Concourse' = 177, 'West Farms-Bronx River' = 178, 'West New Brighton-New Brighton-St. George' = 179, 'West Village' = 180, 'Westchester-Unionport' = 181, 'Westerleigh' = 182, 'Whitestone' = 183, 'Williamsbridge-Olinville' = 184, 'Williamsburg' = 185, 'Windsor Terrace' = 186, 'Woodhaven' = 187, 'Woodlawn-Wakefield' = 188, 'Woodside' = 189, 'Yorkville' = 190, 'park-cemetery-etc-Bronx' = 191, 'park-cemetery-etc-Brooklyn' = 192, 'park-cemetery-etc-Manhattan' = 193, 'park-cemetery-etc-Queens' = 194, 'park-cemetery-etc-Staten Island' = 195),\n      dropoff_puma UInt16\n    ) ENGINE = MergeTree() ORDER BY (pickup_date, pickup_datetime);\n```\n\u003c/details\u003e\n\n[Вернуться в Оглавление](#Оглавление)\n\n### Описание логической структуры\n\n#### Архитектура БД\n![Архитектура](media/ru/architecture_ru.png)\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid flow chart\u003c/summary\u003e\n\n```mermaid\nflowchart TD\n  Клиент{Клиенты}\n  Клиент --\u003e|Запрос записи| DStore_Write_Interface[API записи]\n  Клиент --\u003e|Запрос чтения| DStore_Read_Interface[API чтения]\n  Клиент --\u003e|Запрос метаданных| MetadataAPI[API метаданных]\n  \n  DStore_Write_Interface --\u003e |Прямая вставка| LocalBerkleyDB[(Локальная база данных Berkley DB)]\n  DStore_Write_Interface --\u003e |Извлечение данных| ExternalDB_Write[(Внешние базы данных JDBC)]\n  ExternalDB_Write --\u003e LocalBerkleyDB\n  \n  DStore_Read_Interface --\u003e |Локальное чтение| LocalBerkleyDB\n  DStore_Read_Interface --\u003e |Внешнее чтение| ExternalDB_Read[(Внешние БД JDBC)]\n  \n  MetadataAPI --\u003e MetadataStore[Файл метаданных]\n```\n\u003c/details\u003e\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Формат хранения данных\n![Формат хранения данных](media/data_format.png)\n\nПоддерживаются три формата хранения данных:\n- **RAW** — когда данные хранятся в виде ключа Java-типа **int** для строковых данных и подходящий Java-тип для остальных (числовые, специальные и проч.);\n- **ENUM** — когда данные хранятся в виде ключа Java-типа **byte** значения;\n- **HISTOGRAM** — когда сохраняются начальный и конечный индекс повторяющихся данных из диапазона и само значение.\n\nМетаданные формата хранения, типа индексации и сжатия хранятся в заголовке блока.\n\n[Вернуться в Оглавление](#Оглавление)\n\n#### Алгоритмы\nОсновные методы Java API БД Dimension DB размещены в интерфейсе **DStore**. \nДоступ к **DStore** необходимо получить после инициализации БД Dimension DB через вызов конструктора класса **Dimension DB**, примеры представлены в разделе [Алгоритм инициализации БД](#алгоритм-инициализации-бд).\n\nПолный список методов основных классов и интерфейсов с входными и выходными параметрами размещен в разделе [Используемые методы](#используемые-методы).\n\n##### Алгоритм инициализации БД\n1. Определить локальную директорию для хранения настроек БД Dimension DB;\n2. Создать конфигурацию БД Dimension DB **Dimension DBConfig**;\n3. Выполнить инициализацию backend БД; \n4. Выполнить инициализацию БД Dimension DB через вызов конструктора из класса **Dimension DB**;\n5. Получить ссылку на интерфейс **DStore** из класса **Dimension DB** для доступа к Java API БД Dimension DB.\n\nПример инициализации БД для backend Berkley DB\n```\n@TempDir\nstatic File databaseDir;\n...\nDimension DBConfig Dimension DBConfig = new Dimension DBConfig().setConfigDirectory(databaseDir.getAbsolutePath());\nBerkleyDB berkleyDB = new BerkleyDB(databaseDir.getAbsolutePath(), true);\nDimension DB Dimension DB = new Dimension DB(Dimension DBConfig, berkleyDB.getStore());\nDStore fStore = Dimension DB.getDStore();\n```\n\nПример инициализации БД для SQL backend ClickHouse\n```\n@TempDir\nstatic File databaseDir;\n...\nBType bType = BType.CLICKHOUSE;\nString driverClassName = \"com.clickhouse.jdbc.ClickHouseDriver\";\nString dbUrl = \"jdbc:clickhouse://localhost:8123\";\n\nSqlDB sqlDB = new SqlDB(bType, driverClassName, dbUrl, \"admin\", \"admin\");\nBasicDataSource basicDataSource = sqlDB.getDatasource();\nDimension DBConfig Dimension DBConfig = new Dimension DBConfig().setConfigDirectory(databaseDir.getAbsolutePath());\n\nDimension DB Dimension DB = new Dimension DB(Dimension DBConfig, bType, basicDataSource);\nDStore fStore = Dimension DB.getDStore();\n```\n\nПримечания:\n- Временная директория **databaseDir** создается автоматически с использованием аннотации **@TempDir** библиотеки JUnit;\n- Для примера с backend Berkley DB настройки Dimension DB и данные backend располагаются в одной временной директории **databaseDir**;\n- Примеры кода взяты из модульных и интеграционных тестов.\n\n[Вернуться в Оглавление](#Оглавление)\n\n#### API программы\n\n**Dimension DB** предлагает расширенные возможности для взаимодействия с базой данных через набор методов, способных выполнять различные задачи сохранения и извлечения данных. Эти API специально разработаны для обеспечения гибкости и оптимальной работы с временными рядами данных в Java-среде как для локально сохраненных данных, так и для внешних систем хранения данных с SQL интерфейсом.\n\n- **Основные API**. Основные функции для работы с данными встроены в интерфейс **DStore**, который предлагает стандартизированный доступ к методам записи и чтения. **DStore** является ключевым элементом архитектуры **Dimension DB**, обеспечивающим интерфейсную точку для взаимодействия с базой данных для клиентских приложений.\n\n- **Запись данных**. Для записи информации в базу данных Dimension DB поддерживается несколько подходов:\n\n  - **Direct** — вставка данных в локальную БД с использованием промежуточной Java структуры данных табличного вида.\n  - **JDBC** — вставка данных в локальную БД с использованием данных, получаемых из внешнего источника данных по JDBC, что позволяет осуществлять интеграцию с другими системами, способными работать с JDBC.\n  - **JDBC Batch** — пакетная загрузка в локальную БД с использованием данных, получаемых из внешнего источника данных по JDBC, минимизирующая количество транзакций для масштабной вставки.\n\n- **Чтение данных**. В процессе извлечения данных из **Dimension DB** используются API, каждый из которых оптимизирован для соответствующих типов запросов:\n\n  - **Stacked** — получение данных на основе функций агрегации, таких как COUNT SUM и AVG, получая информацию по распределению данных по выбранным атрибутам и параметрам.\n  - **Gantt** — сложный расчёт распределения с использованием агрегации COUNT по двум уровням, что полезно для анализа зависимостей и связей между разными показателями.\n  - **Raw** — извлечение исходных данных в табличном формате, для просмотра детальной информации по всему массиву собранных данных.\n  - **BatchResultSet** — извлечение исходных данных в табличном формате с построчным доступом, для получения только части строк из результирующего набора в БД.\n\n- **Загрузка метаданных**. Для работы с внешними источниками данных требуется выполнять запросы к источникам по JDBC или табличным Java структурам. Для хранения информации по таблицам и типам данных, используемых для локального хранения и обращения к внешним источникам данных по JDBC используется API для загрузки и просмотра этой информации в локальный файл хранилища метаданных Dimension DB. \n\nAPI для записи данных работают только с локальным хранилищем данных типа \"ключ-значение\" Berkley DB. Методы API для чтения данных могут работать как с локальным хранилищем Berkley DB, так и с внешними источниками данных по JDBC с использованием автоматической генерации SQL запросов.\n\nТаблица 5. Поддерживаемые БД для работы с API в Dimension DB\n\n| № | Поддержка API Dimension DB | База данных          | Тип СУБД      |\n|---|----------------------------|----------------------|---------------|\n| 1 | Read/Write                 | Berkeley DB          | key-value     |\n| 2 | Read                       | ClickHouse           | аналитическая |\n| 3 | Read                       | Oracle               | реляционная   |\n| 4 | Read                       | PostgreSQL           | реляционная   |\n| 5 | Read                       | Microsoft SQL Server | реляционная   |\n| 6 | Read                       | MySQL                | реляционная   |\n| 7 | Read                       | DuckDB               | аналитическая |\n| 8 | Read                       | Firebird             | реляционная   |\n| 9 | Read                       | SQLite               | реляционная   |\n\nПеред тем, как приступить к записи данных, необходимо установить параметры хранения и метаданные для таблиц и столбцов в объекте **SProfile**.\n\nКонфигурация таблицы базы данных позволяет переключаться между глобальной и локальной индексацией, включать и отключать сжатие данных «на лету». Это достигается за счет размещения метаданных типа хранилища в заголовке блока для обоих типов индексации и флага для включения или отключения сжатия.\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Диаграмма последовательности API\n\n![Диаграмма последовательности вызовов API Dimension DB](media/ru/sequence_diagram_ru.png)\n\n\u003cdetails\u003e\n  \u003csummary\u003eMermaid sequence diagram\u003c/summary\u003e\n\n```mermaid\nsequenceDiagram\n  participant Client as Клиент\n  participant DStore_Write as API записи\n  participant DStore_Read as API чтения\n  participant MetadataAPI as API метаданных\n  participant LocalDB as Локальное хранилище Berkley DB\n  participant ExternalDB as Внешние базы данных через JDBC\n\n  Client-\u003e\u003eDStore_Write: Запрос на запись\n  DStore_Write-\u003e\u003eMetadataAPI: Получение метаданных\n  MetadataAPI-\u003e\u003eDStore_Write: Возврат метаданных\n\n  rect rgba(200, 200, 255, 0.1)\n    DStore_Write-\u003e\u003eLocalDB: Прямая вставка\n    DStore_Write-\u003e\u003eExternalDB: Получение данных\n    ExternalDB-\u003e\u003eDStore_Write: Возврат данных\n    DStore_Write-\u003e\u003eLocalDB: Вставка из ExternalDB\n  end\n\n  Client-\u003e\u003eDStore_Read: Запрос на чтение\n  DStore_Read-\u003e\u003eMetadataAPI: Получение метаданных\n  MetadataAPI-\u003e\u003eDStore_Read: Возврат метаданных\n\n  rect rgba(200, 255, 200, 0.1)\n    DStore_Read-\u003e\u003eLocalDB: Локальное чтение\n    DStore_Read-\u003e\u003eExternalDB: Получение данных\n    ExternalDB-\u003e\u003eDStore_Read: Возврат данных\n  end\n\n  Client-\u003e\u003eMetadataAPI: Запрос на чтение метаданных\n  MetadataAPI-\u003e\u003eClient: Возврат метаданных\n```\n\u003c/details\u003e\n\n[Вернуться в Оглавление](#Оглавление)\n\n##### Используемые методы\n- В интерфейсе **DStore** находятся основные контракты и сигнатуры методов для взаимодействия БД **Dimension DB** с клиентскими приложениями;\n- Инициализация объектов БД проходит при вызове конструктора класса **Dimension DB**;\n- Ссылка на интерфейс **DStore** для доступа к API приложения вызывается из объекта класса **Dimension DB**.\n\n###### Интерфейс DStore\n\nТаблица 6. Список API для работы с базой данных Dimension DB интерфейса DStore\n\n| #  | Название метода         | Тип API    | Описание                                          | Входные параметры                                                                                                                 | Выходные параметры                    |\n|----|-------------------------|------------|---------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|---------------------------------------|\n| 1  | getTProfile             | Метаданные | Получить метаданные таблицы по имени              | String tableName                                                                                                                  | TProfile                              |\n| 2  | loadDirectTableMetadata | Метаданные | Загрузить метаданные из SProfile                  | SProfile sProfile                                                                                                                 | TProfile                              |\n| 3  | loadJdbcTableMetadata   | Метаданные | Загрузить метаданные через JDBC с запросом        | Connection connection, String query, SProfile sProfile                                                                            | TProfile                              |\n| 4  | loadJdbcTableMetadata   | Метаданные | Загрузить метаданные через JDBC (схема и таблица) | Connection connection, String sqlSchemaName, String sqlTableName, SProfile sProfile                                               | TProfile                              |\n| 5  | setTimestampColumn      | Метаданные | Установить столбец с метками времени              | String tableName, String timestampColumnName                                                                                      | void                                  |\n| 6  | putDataDirect           | Запись     | Сохранить данные с использованием Java-структуры  | String tableName, List\u003cList\u003cObject\u003e\u003e data                                                                                         | void                                  |\n| 7  | putDataJdbc             | Запись     | Сохранить данные из JDBC ResultSet                | String tableName, ResultSet resultSet                                                                                             | long (метка времени последней строки) |\n| 8  | putDataJdbcBatch        | Запись     | Пакетное сохранение из JDBC ResultSet             | String tableName, ResultSet resultSet, Integer batchSize                                                                          | void                                  |\n| 9  | getBlockKeyTailList     | Чтение     | Получить блоки с ключами и диапазонами            | String tableName, long begin, long end                                                                                            | List\u003cBlockKeyTail\u003e                    |\n| 10 | getStacked              | Чтение     | Получить агрегированные данные                    | String tableName, CProfile cProfile, GroupFunction groupFunction, CompositeFilter compositeFilter, long begin, long end           | List\u003cStackedColumn\u003e                   |\n| 11 | getGanttCount           | Чтение     | Двухуровневая группировка COUNT                   | String tableName, CProfile firstGrpBy, CProfile secondGrpBy, CompositeFilter compositeFilter, long begin, long end                | List\u003cGanttColumnCount\u003e                |\n| 12 | getGanttCount           | Чтение     | Двухуровневая группировка COUNT (многопоточная)   | String tableName, CProfile firstGrpBy, CProfile secondGrpBy, CompositeFilter compositeFilter, int batchSize, long begin, long end | List\u003cGanttColumnCount\u003e                |\n| 13 | getGanttSum             | Чтение     | Двухуровневая группировка SUM                     | String tableName, CProfile firstGrpBy, CProfile secondGrpBy, CompositeFilter compositeFilter, long begin, long end                | List\u003cGanttColumnSum\u003e                  |\n| 14 | getDistinct             | Чтение     | Получить уникальные значения                      | String tableName, CProfile cProfile, OrderBy orderBy, CompositeFilter compositeFilter, int limit, long begin, long end            | List\u003cString\u003e                          |\n| 15 | getRawDataAll           | Чтение     | Получить сырые данные (все столбцы, без фильтра)  | String tableName, long begin, long end                                                                                            | List\u003cList\u003cObject\u003e\u003e                    |\n| 16 | getRawDataAll           | Чтение     | Получить сырые данные (все столбцы, с фильтром)   | String tableName, CProfile cProfileFilter, String filter, long begin, long end                                                    | List\u003cList\u003cObject\u003e\u003e                    |\n| 17 | getRawDataByColumn      | Чтение     | Получить сырые данные для конкретного столбца     | String tableName, CProfile cProfile, long begin, long end                                                                         | List\u003cList\u003cObject\u003e\u003e                    |\n| 18 | getBatchResultSet       | Чтение     | Пакетное чтение (обычные таблицы)                 | String tableName, int fetchSize                                                                                                   | BatchResultSet                        |\n| 19 | getBatchResultSet       | Чтение     | Пакетное чтение (time-series таблицы)             | String tableName, long begin, long end, int fetchSize                                                                             | BatchResultSet                        |\n| 20 | getFirst                | Метаданные | Получить первую метку времени                     | String tableName, long begin, long end                                                                                            | long                                  |\n| 21 | getLast                 | Метаданные | Получить последнюю метку времени                  | String tableName, long begin, long end                                                                                            | long                                  |\n| 22 | syncBackendDb           | Бэкенд     | Синхронизировать Berkley DB с диском              | -                                                                                                                                 | void                                  |\n| 23 | closeBackendDb          | Бэкенд     | Закрыть Berkley DB                                | -                                                                                                                                 | void                                  |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Класс Dimension DB\n\nТаблица 7. Класс Dimension DB, в котором проходит инициализация объектов БД\n\n| № п.п | Название конструктора |    Тип API    | Описание                                                        | Входные параметры                                                                                                                                                                                                        | Выходные параметры |\n|:-----:|:----------------------|:-------------:|:----------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-------------------|\n|   1   | Dimension DB          | Чтение/Запись | Создать хранилище Dimension DB для backend Berkley DB           | Dimension DBConfig Dimension DBConfig - конфигурация локального хранения Dimension DB,\u003cbr\u003e EntityStore - хранилище данных Berkley DB                                                                                     | Конструктор        |\n|   2   | Dimension DB          |    Чтение     | Создать хранилище Dimension DB для определенного типа backend-а | Dimension DBConfig Dimension DBConfig - конфигурация локального хранения Dimension DB,\u003cbr\u003e BType backendType - тип backend-а для чтения,\u003cbr\u003e BasicDataSource basicDataSource - объект пула подключений JDBC Apache DBCP2 | Конструктор        |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Параметры\n\n###### Тип таблицы - enum TType\n\nТаблица 8. Enum TType для хранения поддерживаемых типов таблиц\n\n| Имя свойства | Тип   | Описание                                    |\n|--------------|-------|---------------------------------------------|\n| REGULAR      | TType | Таблица для хранения обычных таблиц         |\n| TIME_SERIES  | TType | Таблица для хранения данных временных рядов |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип индексирования таблицы - enum IType\n\nТаблица 9. Enum IType для хранения типа индексирования таблицы\n\n| Имя свойства | Тип   | Описание                                                                                                                                          |\n|--------------|-------|---------------------------------------------------------------------------------------------------------------------------------------------------|\n| GLOBAL       | IType | Тип используемого индекса (RAW, HISTOGRAM, ENUM), определяется пользователем на уровне таблицы для каждого столбца во входных параметрах SProfile |\n| LOCAL        | IType | Тип используемого индекса (RAW, HISTOGRAM, ENUM), определяется автоматически системой на уровне блока данных для каждого столбца таблицы          |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип способа анализа данных по таблице - enum AType\n\nТаблица 10. Enum AType для хранения способа анализа данных для локального индексирования\n\n| Имя свойства   | Тип   | Описание                                                                                                                                                                                                      |\n|----------------|-------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| ON_LOAD        | AType | Данные анализируются при первом получении данных, и на их основе определяется тип индексирования по каждому столбцу таблицы                                                                                   |\n| FULL_PASS_ONCE | AType | Данные анализируются при первом получении данных, затем при следующих запусках последовательно анализируется каждый столбец таблицы один раз\u003cbr/\u003e и на основе этой информации определяется тип индексирования |\n| FULL_PASS_EACH | AType | Тоже же самое что и FULL_PASS_ONCE, только анализируется каждый столбец таблицы при каждом вызове API записи данных. \u003cbr/\u003eКаждый вызов API - анализируется один столбец и так по кругу                        |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип backend таблицы - enum BType\n\nТаблица 11. Enum BType для хранения поддерживаемых типов БД, используемых в качестве backend для API чтения и записи данных\n\n| Имя свойства | Тип   | Описание             |\n|--------------|-------|----------------------|\n| BERKLEYDB    | BType | BerkleyDB            |\n| CLICKHOUSE   | BType | ClickHouse           |\n| ORACLE       | BType | Oracle               |\n| POSTGRES     | BType | PostgreSQL           |\n| MSSQL        | BType | Microsoft SQL Server |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип функции группировки данных - enum GroupFunction\n\nТаблица 12. Enum GroupFunction для передачи функции группировки при вызове Stacked API\n\n| Имя свойства | Тип           | Описание                                                                        |\n|--------------|---------------|---------------------------------------------------------------------------------|\n| COUNT        | GroupFunction | Расчет количества вхождений уникальных показателей в данных по столбцу cProfile |\n| SUM          | GroupFunction | Расчет суммы в данных по столбцу cProfile                                       |\n| AVG          | GroupFunction | Расчет среднего значения в данных по столбцу cProfile                           |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Параметры хранения столбца таблицы - класс CSType\n\nТаблица 13. Класс CSType для хранения параметров хранения и типов данных столбцов таблицы\n\n| Имя свойства | Тип      | Значение по умолчанию | Описание                                                                                                               |\n|--------------|----------|-----------------------|------------------------------------------------------------------------------------------------------------------------|\n| isTimeStamp  | boolean  | false                 | Флаг, обозначающий столбец, который хранит временную метку                                                             |\n| sType        | SType    | null                  | Тип хранения данных в таблице (RAW, HISTOGRAM, ENUM)                                                                   |\n| cType        | CType    | null                  | Тип данных Java, используемый для хранения данных в БД Berkley DB (Int, Long, Double, String ... etc.)                 |\n| dType        | DataType | null                  | Тип данных JDBC, используемый для конвертации данных в тип Java Berkley DB (INTEGER, DATE, DATETIME, VARCHAR ... etc.) |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип хранения данных - enum SType\n\nТаблица 14. Класс SType для хранения используемого в столбце или блоке типа хранения данных таблицы\n\n| Имя свойства | Тип   | Значение по умолчанию | Описание                                                    |\n|--------------|-------|-----------------------|-------------------------------------------------------------|\n| RAW          | SType | 1                     | Данные как есть или в виде ключа для строковых типов данных |\n| HISTOGRAM    | SType | 2                     | Данные в виде гистограммы                                   |\n| ENUM         | SType | 3                     | Данные в виде списка констант                               |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип хранения данных Java - enum CType\n\nТаблица 15. Класс CType для хранения типа данных Java используемого для хранения данных в БД Berkley DB столбца таблицы\n\n| Имя свойства | Тип | Значение по умолчанию | Описание                                                        |\n|--------------|-----|-----------------------|-----------------------------------------------------------------|\n| BYTE         | int | 1                     | Представляет байт                                               |\n| INT          | int | 2                     | Представляет целое число                                        |\n| LONG         | int | 3                     | Представляет длинное целое число                                |\n| FLOAT        | int | 4                     | Представляет число с плавающей точкой (float)                   |\n| DOUBLE       | int | 5                     | Представляет число с плавающей точкой двойной точности (double) |\n| STRING       | int | 6                     | Представляет строку                                             |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Тип хранения данных JDBC - enum DataType\n\nТаблица 16. Класс DataType для хранения типов данных JDBC, который используется для конвертации данных в формат хранения Java в БД Berkley DB столбца таблицы БД Dimension DB\n\n| Имя свойства | Тип  | Значение по умолчанию | Описание                      |\n|--------------|------|-----------------------|-------------------------------|\n| BIT          | byte | 0                     | Postgres: битовый тип данных  |\n| ...          | ...  | ...                   | ...                           |\n| RAW          | byte | 23                    | Oracle: необработанные данные |\n| ...          | ...  | ...                   | ...                           |\n| INT          | byte | 31                    | MS SQL: целое число           |\n| ...          | ...  | ...                   | ...                           |\n| DEC          | byte | 47                    | ClickHouse: десятичные числа  |\n\n[Полный список свойств](src/main/java/ru/dimension/db/metadata/DataType.java)\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Входные параметры\n\n###### Настройки БД - класс Dimension DBConfig\n\nТаблица 17. Класс Dimension DBConfig для хранения настроек\n\n| Имя свойства    | Тип    | Значение по умолчанию | Описание                                                                                |\n|-----------------|--------|-----------------------|-----------------------------------------------------------------------------------------|\n| configDirectory | String |                       | Абсолютный путь к директории для хранения файла конфигурации с метаданными Dimension DB |\n| configFileName  | String | \"metamodel.obj\"       | Имя файла конфигурации с метаданными Dimension DB                                       |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Настройки таблицы SProfile\n\nТаблица 18. Класс SProfile для хранения настроек таблицы/столбцов в БД Dimension DB (используется во входных параметрах)\n\n| Имя свойства | Тип                 | Значение по умолчанию | Описание                                                            |\n|--------------|---------------------|-----------------------|---------------------------------------------------------------------|\n| tableName    | String              | null                  | Имя таблицы                                                         |\n| tableType    | TType               | TIME_SERIES           | Тип таблицы                                                         |\n| indexType    | IType               | GLOBAL                | Тип индекса                                                         |\n| backendType  | BType               | BERKLEYDB             | Тип backend для хранения данных                                     |\n| compression  | Boolean             | FALSE                 | Использовать ли сжатие данных в таблице или нет                     |\n| csTypeMap    | Map\u003cString, CSType\u003e | null                  | Структура ключ-значение, связывающая имена столбцов с типами CSType |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Выходные параметры\n\n###### Настройки таблицы - класс TProfile\n\nТаблица 19. Класс TProfile для получения настроек таблицы/столбцов из метаданных (используется в выходных параметрах)\n\n| Имя свойства | Тип            | Значение по умолчанию  | Описание                         |\n|--------------|----------------|------------------------|----------------------------------|\n| tableName    | String         | null                   | Имя таблицы                      |\n| tableType    | TType          | null                   | Тип таблицы                      |\n| indexType    | IType          | null                   | Тип индекса                      |\n| backendType  | BType          | null                   | Тип backend                      |\n| compression  | Boolean        | false                  | Включено ли сжатие данных        |\n| cProfiles    | List\u003cCProfile\u003e | null или пустой список | Список настроек столбцов таблицы |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Настройки столбца таблицы - класс CProfile\n\nТаблица 20. Класс CProfile для хранения параметров столбцов таблицы\n\n| Имя свойства   | Тип    | Значение по умолчанию | Описание                                                   |\n|----------------|--------|-----------------------|------------------------------------------------------------|\n| colId          | int    | 0                     | Уникальный идентификатор                                   |\n| colIdSql       | int    | 0                     | Идентификатор столбца в SQL                                |\n| colName        | String | null                  | Название столбца                                           |\n| colDbTypeName  | String | null                  | Название типа данных в БД                                  |\n| colSizeDisplay | int    | 0                     | Размер для отображения                                     |\n| colSizeSqlType | int    | 0                     | Размер типа SQL                                            |\n| csType         | CSType | null                  | Тип CSType хранит параметры хранения и типы данных столбца |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Объект для получения агрегатов данных из stacked API - класс StackedColumn\n\nМетки времени хранят дату в миллисекундах, которые прошли с 1 января 1970 года - [Unix-time](https://ru.wikipedia.org/wiki/Unix-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F)\n\nТаблица 21. Класс StackedColumn для получения агрегатов данных из stacked API\n\n| Имя свойства | Тип                  | Значение по умолчанию | Описание                                                                                                                                                                           |\n|--------------|----------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| key          | long                 | N/A                   | Идентификатор объекта - метка времени начала диапазона, по которому рассчитаны значения агрегатов в keyCount, keySum, keyAvg                                                       |\n| tail         | long                 | 0                     | Метка времени окончания диапазона, по которому рассчитаны значения агрегатов в keyCount, keySum, keyAvg                                                                            |\n| keyCount     | Map\u003cString, Integer\u003e | Пустая карта          | Структура ключ-значение, для хранения количества вхождений по каждому показателю в данных столбца таблицы cProfile при вызове Stacked API (для числовых и символьных типов данных) |\n| keySum       | Map\u003cString, Double\u003e  | Пустая карта          | Структура ключ-значение, для хранения суммы значений по каждому ключу (только для числовых типов данных)                                                                           |\n| keyAvg       | Map\u003cString, Double\u003e  | Пустая карта          | Структура ключ-значение, для хранения среднего значения по каждому ключу (только для числовых типов данных)                                                                        |\n\n[Вернуться в Оглавление](#Оглавление)\n\n###### Объект для получения агрегатов данных из gantt API - классы GanttColumnCount и GanttColumnSum\n\nТаблица 22a. Класс GanttColumnCount для результатов двухуровневой агрегации COUNT\n\n| Имя свойства | Тип                  | Значение по умолчанию | Описание                                                                                                                                                                 |\n|--------------|----------------------|-----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| key          | String               | N/A                   | Ключ, хранит уникальное значение метрики из столбца firstGrpBy таблицы при вызове Gantt API                                                                              |\n| gantt        | Map\u003cString, Integer\u003e | Пустая карта          | Структура \"ключ-значение\" для хранения количества вхождений каждого уникального значения из secondGrpBy с фильтрацией по ключу из данных firstGrpBy при вызове Gantt API |\n\n\nТаблица 22b. Класс GanttColumnSum для результатов двухуровневой агрегации SUM\n\n| Имя свойства | Тип    | Значение по умолчанию | Описание                                                                   |\n|--------------|--------|-----------------------|----------------------------------------------------------------------------|\n| key          | String | N/A                   | Уникальное значение из столбца первого уровня группировки                  |\n| value        | Double | 0                     | Общая сумма всех значений из второго (числового) столбца для данной группы |\n\n[Вернуться в Оглавление](#Оглавление)\n\n### Варианты использования кода\n- Все варианты использования кода выполняют вызовы API **Dimension DB** через интерфейс **DStore**;\n- Подробное описание контрактов и сигнатур методов интерфейса **DStore** представлены в разделе [Используемые методы](#используемые-методы);\n- Перед каждым вызовом метода интерфейса **DStore** выполняется его инициализация по инструкции из раздела [Алгоритм инициализации БД](#алгоритм-инициализации-бд);\n- Для каждого варианта использования разработан тестовый пример в [Dimension DBUseCasesCodeTest](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java).\n\nТаблица 23. Варианты использования кода\n\n| № п.п | Название метода/функции           | Тип API    | Описание                                                    | Тестовые сценарии                                                                            |\n|-------|-----------------------------------|------------|-------------------------------------------------------------|----------------------------------------------------------------------------------------------|\n| 1     | `getTProfile`                     | Метаданные | Получить метаданные по имени таблицы                        | [getTProfile](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                      |\n| 2     | `loadDirectTableMetadata`         | Метаданные | Загрузить метаданные напрямую из `SProfile`                 | [loadDirectTableMetadata](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)          |\n| 3     | `loadJdbcTableMetadata`           | Метаданные | Загрузить метаданные из JDBC-соединения (запрос)            | [loadJdbcTableMetadata](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)            |\n| 4     | `loadJdbcTableMetadata`           | Метаданные | Загрузить метаданные из JDBC (схема + таблица, Oracle)      |                                                                                              |\n| 5     | `setTimestampColumn`              | Метаданные | Установить столбец с временной меткой                       | [setTimestampColumn](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)               |\n| 6     | `putDataDirect`                   | Запись     | Сохранить данные из Java-структуры (`List\u003cList\u003cObject\u003e\u003e`)   | [putDataDirect](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                    |\n| 7     | `putDataJdbc`                     | Запись     | Сохранить данные из `ResultSet` (JDBC)                      | [putDataJdbc](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                      |\n| 8     | `putDataJdbcBatch`                | Запись     | Пакетная загрузка из `ResultSet`                            | [putDataJdbcBatch](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                 |\n| 9     | `getBlockKeyTailList`             | Чтение     | Получить список блоков с ключами и диапазонами              | [getBlockKeyTailList](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)              |\n| 10    | `getStacked`                      | Чтение     | Получить агрегированные данные (COUNT/SUM/AVG) по столбцу   | [getStacked](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                       |\n| 11    | `getStacked` (с фильтром)         | Чтение     | Агрегация с фильтром по другому столбцу                     | [getStackedCountFilter](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)            |\n| 12    | `getGantt`                        | Чтение     | Двухуровневая группировка (COUNT)                           | [getGantt](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                         |\n| 13    | `getGantt` (многопоточный)        | Чтение     | Двухуровневая группировка с пакетной обработкой             | [getGantt](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                         |\n| 14    | `getGantt` (с фильтром)           | Чтение     | Двухуровневая группировка с фильтром                        | [getGanttFilter](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                   |\n| 15    | `getGanttSum`                     | Чтение     | Двухуровневая группировка с суммированием числовых значений | [getGanttSum](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                      |\n| 16    | `getGanttSum` (с фильтром)        | Чтение     | Группировка с суммированием и фильтром                      | [getGanttSumFiltered](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)              |\n| 17    | `getDistinct`                     | Чтение     | Уникальные значения столбца                                 | [getDistinct](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                      |\n| 18    | `getDistinct` (с фильтром)        | Чтение     | Уникальные значения с фильтрацией                           | [getDistinctWithFilter](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)            |\n| 19    | `getRawDataAll`                   | Чтение     | Сырые данные по всем столбцам                               | [getRawDataAll](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                    |\n| 20    | `getRawDataAll` (с фильтром)      | Чтение     | Сырые данные с фильтром по столбцу                          | [getRawDataAllFilter](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)              |\n| 21    | `getRawDataByColumn`              | Чтение     | Сырые данные по одному столбцу                              | [getRawDataByColumn](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)               |\n| 22    | `getBatchResultSet`               | Чтение     | Постраничное чтение (обычные таблицы)                       | [getBatchResultSetRegularTable](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)    |\n| 23    | `getBatchResultSet` (time-series) | Чтение     | Постраничное чтение с временным диапазоном                  | [getBatchResultSetTimeSeriesTable](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java) |\n| 24    | `getFirst`                        | Метаданные | Первая временная метка в диапазоне                          | [getFirst](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                         |\n| 25    | `getLast`                         | Метаданные | Последняя временная метка в диапазоне                       | [getLast](src/test/java/ru/dimension/db/DBaseUseCasesCodeTest.java)                          |\n| 26    | `syncBackendDb`                   | Backend    | Синхронизация Berkley DB с диском                           |                                                                                              |\n| 27    | `closeBackendDb`                  | Backend    | Закрытие Berkley DB                                         |                                                                                              |\n\n[Вернуться в Оглавление](#Оглавление)\n\n### Производительность\n\nTable 24. Тестовое окружение\n\n| Раздел        | Описание                                                                                                                         |\n|---------------|----------------------------------------------------------------------------------------------------------------------------------|\n| **Processor** | AMD Ryzen 5 5600H with Radeon Graphics, 3301 Mhz, 6 Core(s), 12 Logical Processor(s)                                             |\n| **RAM**       | 16.0 GB                                                                                                                          |\n| **Disk**      | Generic Flash Disk USB Device\u003cbr\u003e- SAMSUNG MZVL2512HCJQ-00B00 (476.94 GB)                                                        |\n| **OS**        | Microsoft Windows 11                                                                                                             |\n| **Test data** | [New York taxi orders](https://clickhouse.com/docs/en/getting-started/example-datasets/nyc-taxi#download-of-prepared-partitions) |\n\n\u003cdetails\u003e\n  \u003csummary\u003eSQL запрос для получения статистики за 2016 год\u003c/summary\u003e\n\n```sql\nWITH \n2016_parts AS (\n    SELECT sum(bytes) AS bytes\n    FROM system.parts\n    WHERE table = 'trips_mergetree'\n      AND database = 'datasets'\n      AND active\n      AND partition LIKE '2016%'\n)\nSELECT\n    (SELECT count() FROM datasets.trips_mergetree WHERE toYear(pickup_datetime) = 2016) AS exact_row_count,\n    formatReadableSize((SELECT bytes FROM 2016_parts)) AS total_size,\n    formatReadableSize((SELECT bytes FROM 2016_parts) / exact_row_count) AS avg_row_size;\n```\n\n\u003c/details\u003e \n\nTable 25. Данные за 2016 год\n\n| exact_row_count | total_size | avg_row_size |\n|-----------------|------------|--------------|\n| 78325655        | 6.88 GiB   | 94.37 B      |\n\nTable 26. Профили загрузки\n\n| Value\\Profile | № 1          | № 2           | № 3            | № 4            |\n|---------------|--------------|---------------|----------------|----------------|\n| TType         | TIME_SERIES  | TIME_SERIES   | TIME_SERIES    | TIME_SERIES    |\n| IType         | GLOBAL       | LOCAL         | LOCAL          | LOCAL          |\n| AType         | ON_LOAD      | ON_LOAD       | FULL_PASS_ONCE | FULL_PASS_EACH |\n| Compression   | true         | true          | true           | true           |\n| Load (min)    | 31 min 9 sec | 23 min 28 sec | 23 min 36 sec  | 23 min 31 sec  |\n| Size (GB)     | 9,015        | 11,993        | 11,331         | 12,382         |\n| Avg Rows/Sec  | 41 891       | 55 620        | 55 314         | 55 499         |\n| Avg MB/Sec    | 5,28         | 7,02          | 6,98           | 7,00           |\n\nTable 27. Тесты производительности gantt API (count)\n\n| № | Test name        | № 1        | № 2         | № 3         | № 4         |\n|---|------------------|------------|-------------|-------------|-------------|\n| 1 | getGanttRawRaw   | 13,5 / 9,0 | 13,7 / 9,0  | 14,3 / 9,3  | 13,4 / 8,9  |\n| 2 | getGanttEnumEnum | 8,5 / 4,3  | 11,3 / 6,9  | 11,2 / 7,0  | 11,0 / 7,0  |\n| 3 | getGanttHistHist | 7,5 / 3,9  | 13,5 / 8,5  | 13,3 / 8,6  | 13,1 / 8,5  |\n| 4 | getGanttHistRaw  | 9,6 / 6,2  | 11,3 / 7,9  | 11,0 / 7,7  | 10,9 / 7,9  |\n| 5 | getGanttHistEnum | 6,9 / 3,7  | 12,7 / 8,5  | 12,4 / 8,5  | 12,3 / 8,6  |\n| 6 | getGanttEnumRaw  | 9,8 / 6,6  | 13,8 / 9,8  | 14,0 / 9,8  | 13,7 / 9,7  |\n| 7 | getGanttEnumHist | 6,8 / 4,1  | 17,0 / 10,9 | 15,0 / 10,5 | 15,0 / 10,4 |\n| 8 | getGanttRawHist  | 9,8 / 6,4  | 14,4 / 9,8  | 14,2 / 10,0 | 13,9 / 9,8  |\n| 9 | getGanttRawEnum  | 9,9 / 6,1  | 14,3 / 9,3  | 14,0 / 9,4  | 14,2 / 9,4  |\n\nTable 28. Тесты производительности gantt API (sum)\n\n| № | Test name                    | № 1 | № 2  | № 3  | № 4  |\n|---|------------------------------|-----|------|------|------|\n| 1 | getGanttSumHistRaw           | 5,5 | 7,4  | 7,2  | 7,2  |\n| 2 | getGanttSumEnumRaw           | 6,5 | 11,2 | 10,8 | 11,2 |\n| 3 | getGanttSumRawRaw            | 9,3 | 10,0 | 9,8  | 10,1 |\n| 4 | getGanttSumHistHist          | 4,8 | 6,8  | 6,6  | 6,6  |\n| 5 | getGanttSumEnumEnum          | 5,1 | 10,0 | 9,9  | 10,1 |\n| 6 | getGanttSumRawEnum           | 8,4 | 8,7  | 8,6  | 8,9  |\n| 7 | getGanttSumHistRawWithFilter | 6,9 | 9,6  | 9,6  | 9,7  |\n\nTable 29. Тесты производительности stacked API\n\n| № | Test name       | № 1 | № 2  | № 3 | № 4 |\n|---|-----------------|-----|------|-----|-----|\n| 1 | stackedHist     | 5,4 | 6,1  | 8,8 | 6,1 |\n| 2 | stackedHistDate | 0,1 | 0,1  | 0,1 | 0,1 |\n| 3 | stackedEnum     | 5,0 | 10,3 | 8,9 | 8,9 |\n| 4 | stackedEnumDate | 0,1 | 0,1  | 0,1 | 0,1 |\n| 5 | stackedRaw      | 7,8 | 7,8  | 7,9 | 8,0 |\n| 6 | stackedRawDate  | 0,1 | 0,1  | 0,1 | 0,1 |\n\nTable 30. Таблица запросов\n\n| №  | Test name             | SQL query                                                                                                                                                                       |\n|----|-----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n|    | **Gantt API (Count)** |                                                                                                                                                                                 |\n| 1  | getGanttRawRaw        | `SELECT pickup_cdeligibil, vendor_id, COUNT(vendor_id) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY pickup_cdeligibil, vendor_id;`                   |\n| 2  | getGanttHistRaw       | `SELECT trip_type, vendor_id, COUNT(vendor_id) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type, vendor_id;`                                   |\n| 3  | getGanttRawEnum       | `SELECT pickup_cdeligibil, cab_type, COUNT(cab_type) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY pickup_cdeligibil, cab_type;`                      |\n| 4  | getGanttRawHist       | `SELECT pickup_cdeligibil, pickup_boroname, COUNT(pickup_boroname) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY pickup_cdeligibil, pickup_boroname;` |\n| 5  | getGanttEnumEnum      | `SELECT dropoff_puma, dropoff_borocode, COUNT(dropoff_borocode) FROM datasets.trips_mergetree where toYear(pickup_date) = 2016 group by dropoff_puma, dropoff_borocode;`        |\n| 6  | getGanttEnumHist      | `SELECT dropoff_boroname, pickup_boroname, COUNT(pickup_boroname) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY dropoff_boroname, pickup_boroname;`   |\n| 7  | getGanttEnumRaw       | `SELECT dropoff_boroname, vendor_id, COUNT(vendor_id) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY dropoff_boroname, vendor_id;`                     |\n| 8  | getGanttHistEnum      | `SELECT trip_type, dropoff_boroname, COUNT(dropoff_boroname) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type, dropoff_boroname;`              |\n| 9  | getGanttHistHist      | `SELECT trip_type, pickup_boroname, COUNT(pickup_boroname) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type, pickup_boroname;`                 |\n|    | **Gantt API (Sum)**   |                                                                                                                                                                                 |\n| 10 | getGanttSumHistRaw    | `SELECT trip_type, SUM(fare_amount) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type;`                                                         |\n| 11 | getGanttSumEnumRaw    | `SELECT pickup_boroname, SUM(trip_distance) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY pickup_boroname;`                                           |\n| 12 | getGanttSumRawRaw     | `SELECT vendor_id, SUM(total_amount) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY vendor_id;`                                                        |\n| 13 | getGanttSumHistHist   | `SELECT trip_type, SUM(passenger_count) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type;`                                                     |\n| 14 | getGanttSumEnumEnum   | `SELECT dropoff_boroname, SUM(dropoff_borocode) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY dropoff_boroname;`                                      |\n| 15 | getGanttSumRawEnum    | `SELECT pickup_cdeligibil, SUM(pickup_borocode) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY pickup_cdeligibil;`                                     |\n| 16 | getGanttSumWithFilter | `SELECT trip_type, SUM(fare_amount) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 AND trip_type IN (1, 2) GROUP BY trip_type;`                                 |\n|    | **Stacked API**       |                                                                                                                                                                                 |\n| 17 | stackedHist           | `SELECT trip_type, COUNT(trip_type) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY trip_type;`                                                         |\n| 18 | stackedHistDate       | `SELECT trip_type, COUNT(trip_type) FROM datasets.trips_mergetree WHERE toYYYYMMDD(pickup_datetime) = 20160101 GROUP BY trip_type;`                                             |\n| 19 | stackedEnum           | `SELECT dropoff_boroname, COUNT(dropoff_boroname) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY dropoff_boroname;`                                    |\n| 20 | stackedEnumDate       | `SELECT dropoff_boroname, COUNT(dropoff_boroname) FROM datasets.trips_mergetree WHERE toYYYYMMDD(pickup_datetime) = 20160101 GROUP BY dropoff_boroname;`                        |\n| 21 | stackedRaw            | `SELECT vendor_id, COUNT(vendor_id) FROM datasets.trips_mergetree WHERE toYear(pickup_date) = 2016 GROUP BY vendor_id;`                                                         |\n| 22 | stackedRawDate        | `SELECT vendor_id, COUNT(vendor_id) FROM datasets.trips_mergetree WHERE toYYYYMMDD(pickup_datetime) = 20160101 GROUP BY vendor_id;`                                             |\n\n## Загрузка\n- Сборка и установка Dimension DB из исходных кодов в локальный репозиторий Maven описана в разделе [Сборка проекта](#сборка-проекта).\n\n[Вернуться в Оглавление](#Оглавление)\n\n## Разработка\n- Если вы обнаружили ошибку в коде или у вас есть предложения по улучшению - создайте тикет;\n- Перед началом работы необходимо проверить сборку проекта и успешное прохождение модульных тестов по инструкции из раздела [Сборка проекта](#сборка-проекта);\n- Для проверки корректности и производительности API Dimension DB используются интеграционные тесты. Подробности в разделах [Подготовка окружения для запуска интеграционных тестов](#подготовка-окружения-для-запуска-интеграционных-тестов) и [Варианты использования кода](#варианты-использования-кода).\n\n[Вернуться в Оглавление](#Оглавление)\n\n## Документация\n\n| EN                             | RU                                |\n|:-------------------------------|:----------------------------------|\n| [README in English](README.md) | [README на русском](README-RU.md) |\n\n[Вернуться в Оглавление](#Оглавление)\n\n## Лицензия\n[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\nКод выпущен под лицензией Apache License Version 2.0\n\n[Вернуться в Оглавление](#Оглавление)\n\n## Поддержка\nРазработано при поддержке [\"Фонда содействия инновациям\"](https://fasie.ru/).\n\n## Контакты\n[@akardapolov](mailto:akardapolov@yandex.ru)\n\n[Вернуться в Оглавление](#Оглавление)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakardapolov%2Fdimension-db","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakardapolov%2Fdimension-db","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakardapolov%2Fdimension-db/lists"}