ImagingTools Core SDK
imtlicdb Namespace Reference

Database persistence layer for licensing domain model using PostgreSQL with JSON documents. More...

Detailed Description

Database persistence layer for licensing domain model using PostgreSQL with JSON documents.

Overview

The imtlicdb module provides database persistence for the imtlic licensing domain model. It implements database delegate components that handle SQL/JSON-based data storage and retrieval for licenses, products, and features. The module bridges the licensing domain (imtlic) with the database infrastructure (imtdb) using PostgreSQL's powerful JSON capabilities.

Architecture

The module follows a delegate pattern architecture with three main components:

Database Delegates:**

All delegates inherit from CSqlJsonDatabaseDelegateComp (imtdb module), providing:

Design Patterns Used

Delegate Pattern

Database operations are delegated to specialized components:

Template Method Pattern

Base class (CSqlJsonDatabaseDelegateComp) defines algorithm structure:

Data Mapper Pattern

Maps database records to domain objects:

Component Pattern (ACF)

All delegates are ACF components:

Key Components

CLicenseDatabaseDelegateComp

Purpose:** Manages database operations for license definitions

Key Responsibilities:**

CProductsDatabaseDelegateComp

Purpose:** Manages database operations for product definitions

Key Responsibilities:**

CFeatureDatabaseDelegateComp

Purpose:** Manages database operations for feature definitions

Key Responsibilities:**

Database Schema

Table Structure

The module uses three main tables in PostgreSQL:

Licenses Table:**

Index Strategy

Recommended Indexes:**

-- Active record indexes
CREATE INDEX idx_licenses_active ON Licenses(DocumentId, RevisionNumber);
CREATE INDEX idx_products_active ON Products(DocumentId, RevisionNumber);
CREATE INDEX idx_features_active ON Features(DocumentId, RevisionNumber);
-- JSON field indexes using PostgreSQL GIN indexes
CREATE INDEX idx_licenses_license_id ON Licenses USING GIN ((Document->'LicenseId'));
CREATE INDEX idx_licenses_product_id ON Licenses USING GIN ((Document->'ProductId'));
CREATE INDEX idx_products_product_id ON Products USING GIN ((Document->'ProductId'));
CREATE INDEX idx_products_category_id ON Products USING GIN ((Document->'CategoryId'));
CREATE INDEX idx_features_feature_id ON Features USING GIN ((Document->'FeatureId'));
-- Full-text search indexes
CREATE INDEX idx_licenses_name ON Licenses USING GIN (to_tsvector('english', Document->>'LicenseName'));
CREATE INDEX idx_products_name ON Products USING GIN (to_tsvector('english', Document->>'ProductName'));

SQL and JSON Capabilities

PostgreSQL JSON Operators

The module leverages PostgreSQL's JSON operators:

Arrow Operators:**

Filtering Capabilities

ID-Based Filtering:**

// CLicenseDatabaseDelegateComp::CreateObjectFilterQuery()
QString filter = QString("(Document->>'LicenseId') = '%1'").arg(licenseId);

Text Search (ILIKE):**

// CProductsDatabaseDelegateComp::CreateTextFilterQuery()
QString filter = QString(
"(Document->>'ProductName') ILIKE '%%1%' OR "
"(Document->>'ProductDescription') ILIKE '%%1%'"
).arg(searchText);

Category Filtering:**

// CProductsDatabaseDelegateComp - Category filter
QString filter = QString("(Document->>'CategoryId') = '%1'").arg(categoryId);

Compound Filtering:**

// Multiple conditions combined
QString filter = QString(
"(Document->>'ProductId') = '%1' AND "
"(Document->>'CategoryId') = '%2' AND "
"RevisionNumber = 0"
).arg(productId, categoryId);

Cross-Table Queries

License-Product Join:**

SELECT
l.Document as LicenseDocument,
p.Document as ProductDocument,
(SELECT Document->>'CreatedAt' FROM Products
WHERE DocumentId = p.DocumentId AND RevisionNumber = 1) as ProductCreatedAt
FROM Licenses l
JOIN Products p ON (l.Document->>'ProductId') = (p.Document->>'ProductId')
WHERE l.RevisionNumber = 0 AND p.RevisionNumber = 0

Data Flow Examples

Storing a Product

1. imtlicgql: CProductCollectionControllerComp
└─> GraphQL mutation received
└─> imtlic: CProductControllerComp
└─> Create IProductInfo object
└─> imtlicdb: CProductsDatabaseDelegateComp
├─> Convert IProductInfo to JSON document
├─> Generate SQL INSERT statement
└─> PostgreSQL: INSERT INTO Products (DocumentId, RevisionNumber, Document)
VALUES (uuid, 0, jsonb_document)
<── Product ID (DocumentId)
<── IProductInfo with ID
<── GraphQL response
<── Success
Core licensing domain model providing feature-based product licensing and instance management.
Database persistence layer for licensing domain model using PostgreSQL with JSON documents.
GraphQL API interface layer for the licensing domain model.

Querying Licenses

1. imtlicgql: CLicenseCollectionControllerComp
└─> GraphQL query received with filters
└─> imtlic: CLicenseInfoProviderComp
└─> imtlicdb: CLicenseDatabaseDelegateComp
├─> GetBaseSelectionQuery() - Build base SQL
├─> CreateObjectFilterQuery() - Add ID filter
├─> CreateTextFilterQuery() - Add text search
└─> PostgreSQL: SELECT ... FROM Licenses WHERE ...
<── Result set (JSON documents)
├─> SetObjectMetaInfoFromRecord() - Parse each record
├─> Create ILicenseDefinition objects
└─> Populate with metadata
<── List of ILicenseDefinition objects
<── License collection
<── GraphQL response
<── JSON license list

Feature Lookup by ID

1. Application needs feature details
└─> imtlic: CFeatureInfoProviderComp
└─> imtlicdb: CFeatureDatabaseDelegateComp
├─> CreateObjectFilterQuery("feature-uuid")
└─> PostgreSQL: SELECT * FROM Features
WHERE (Document->>'FeatureId') = 'feature-uuid'
AND RevisionNumber = 0
<── Single JSON document
├─> SetObjectMetaInfoFromRecord()
├─> Extract FeatureId, FeatureName, etc.
└─> Create IFeatureInfo object
<── IFeatureInfo object
<── Feature details
<── Feature available for use

Integration Points

Integration with imtdb (Database Framework)

Extends Base Classes:**

Integration with imtlic (Licensing Core)

Implements Persistence For:**

Integration with imtlicgql (GraphQL API)

Indirect Integration:**

Performance Considerations

Indexing Strategy

Query Optimization

Caching Strategies

JSON Document Size

Best Practices

Transaction Management

Version Control

Data Validation

Security Best Practices

Additional Documentation

See also
imtlic For core licensing domain model
imtlicgql For GraphQL API layer
imtdb For database framework infrastructure