.assets change metadata 10 months ago
gradle/ wrapper Add pivot project 10 months ago
src/ main change benchmark 10 months ago
.gitignore Add pivot project 10 months ago
README.MD change metadata 10 months ago
build.gradle change metadata 10 months ago
gradle.properties Add pivot project 10 months ago
gradlew Add pivot project 10 months ago
gradlew.bat Add pivot project 10 months ago
settings.gradle Add pivot project 10 months ago
README.MD

Доступ к Swagger UI

После запуска приложения:

Swagger UI: http://localhost:8080/swagger-ui.html

OpenAPI JSON: http://localhost:8080/api-docs

OpenAPI YAML: http://localhost:8080/api-docs.yaml

img.png

Примеры вызовов (cURL)

METADATA

Получить все объекты организации

bash
curl -X GET "http://localhost:8080/api/metadata/objects?orgId=1"
[
  {
    "objId": 1,
    "orgId": 1,
    "objName": "Account",
    "label": "Account",
    "pluralLabel": "Accounts",
    "description": null,
    "isCustom": false,
    "isActive": true,
    "createdAt": "2025-12-17T21:33:04.584515Z",
    "modifiedAt": "2025-12-17T21:33:04.584515Z"
  },
  {
    "objId": 2,
    "orgId": 1,
    "objName": "Contact",
    "label": "Contact",
    "pluralLabel": "Contacts",
    "description": null,
    "isCustom": false,
    "isActive": true,
    "createdAt": "2025-12-17T21:33:04.584515Z",
    "modifiedAt": "2025-12-17T21:33:04.584515Z"
  }
]

Получить объект по имени

curl -X GET http://localhost:8080/api/metadata/objects/Contact?orgId=1
{
  "objId": 2,
  "orgId": 1,
  "objName": "Contact",
  "label": "Contact",
  "pluralLabel": "Contacts",
  "description": null,
  "isCustom": false,
  "isActive": true,
  "createdAt": "2025-12-17T21:33:04.584515Z",
  "modifiedAt": "2025-12-17T21:33:04.584515Z"
}

Получить поля объекта Contact

bash
curl -X GET "http://localhost:8080/api/metadata/objects/Contact/fields?orgId=1"
[
  {
    "fieldId": 11,
    "orgId": 1,
    "objId": 2,
    "fieldName": "FirstName",
    "label": "First Name",
    "dataType": "text",
    "fieldNum": 0,
    "isIndexed": false,
    "isUnique": false,
    "isRequired": false,
    "isExternalId": false,
    "relationshipName": null,
    "referenceObjId": null,
    "relationshipType": null,
    "deleteConstraint": null,
    "formulaExpression": null,
    "formulaReturnType": null,
    "autonumberFormat": null,
    "autonumberStart": 1,
    "validationRule": null,
    "validationMessage": null,
    "length": 40,
    "precision": null,
    "scale": null,
    "createdAt": "2025-12-17T21:33:04.584515Z",
    "createdBy": null,
    "modifiedAt": "2025-12-17T21:33:04.584515Z",
    "modifiedBy": null,
    "mtObject": null
  },
  ...,
  {
    "fieldId": 25,
    "orgId": 1,
    "objId": 2,
    "fieldName": "HasOptedOutOfEmail",
    "label": "Email Opt Out",
    "dataType": "boolean",
    "fieldNum": 14,
    "isIndexed": false,
    "isUnique": false,
    "isRequired": false,
    "isExternalId": false,
    "relationshipName": null,
    "referenceObjId": null,
    "relationshipType": null,
    "deleteConstraint": null,
    "formulaExpression": null,
    "formulaReturnType": null,
    "autonumberFormat": null,
    "autonumberStart": 1,
    "validationRule": null,
    "validationMessage": null,
    "length": null,
    "precision": null,
    "scale": null,
    "createdAt": "2025-12-17T21:33:04.584515Z",
    "createdBy": null,
    "modifiedAt": "2025-12-17T21:33:04.584515Z",
    "modifiedBy": null,
    "mtObject": null
  }
]

DATA

Получить все записи Contact

bash
curl -X GET "http://localhost:8080/api/data/Contact?orgId=1"

BENCHMARK

Запустить INSERT бенчмарк (10000 Contact записей)

bash
curl -X POST "http://localhost:8080/api/benchmark/insert?orgId=1&object=Contact&count=10000"

Запустить SELECT бенчмарк

bash
curl -X POST "http://localhost:8080/api/benchmark/select?orgId=1&object=Contact&iterations=10"

Получить количество записей

bash
curl -X GET "http://localhost:8080/api/benchmark/count?orgId=1&object=Contact"

UML/ERD схема базы данных Pivot Multitenancy

UML_ERD_схема_таблиц_Pivot_Multitenancy_модели.png

Схема показывает структуру таблиц, сгруппированных по назначению: Metadata (Синие)

organizations — тенанты системы

mt_objects — метаданные объектов (виртуальные таблицы)

mt_fields — метаданные полей с маппингом на flex-слоты

Data Storage (Зелёные)

mt_data — основное хранилище с 50 flex-колонками (value0-value49)

mt_clobs — выносное хранение больших текстов (>4000 символов)

Pivot Indexes (Оранжевые)

mt_indexes — типизированные индексы (string/num/date) для поиска

mt_unique_fields — уникальные индексы с enforce constraint

mt_fallback_index — индекс по Name для быстрого поиска

mt_name_denorm — денормализация имён для гиперссылок

Relationships (Фиолетовые)

mt_relationships — связи parent-child между записями

Audit (Красные)

mt_field_history — история изменений полей

Ключевые связи | Связь | Кардинальность | | -------------------------- | -------------- | | organizations → mt_objects | 1 : N | | organizations → mt_data | 1 : N | | mt_objects → mt_fields | 1 : N | | mt_objects → mt_data | 1 : N | | mt_data → mt_indexes | 1 : N | | mt_data → mt_clobs | 1 : N | | mt_data → mt_field_history | 1 : N | | mt_data ↔ mt_relationships | N : M |