Skip to main content

CarrierServiceMapping Database Schema

Database schema documentation for the carrier service mapping tables introduced in Phase 37.

Overview

The carrier service mapping feature uses three tables:

TablePurpose
cat_carrier_service_mappingMaps ServiceTemplates to carrier PPCs
cat_carrier_bundleDefines carrier-specific service bundles
cat_carrier_bundle_memberJunction table linking bundles to mappings

cat_carrier_service_mapping

Maps vendor-agnostic ServiceTemplates to carrier-specific Product Plan Codes (PPCs).

DDL

CREATE TABLE cat_carrier_service_mapping (
-- Primary key
id BIGINT PRIMARY KEY,
version INT,

-- BusinessEntity columns
code VARCHAR(255) NOT NULL,
description VARCHAR(255),

-- ServiceTemplate link
service_template_id BIGINT NOT NULL,

-- Carrier identification
carrier_code VARCHAR(50) NOT NULL,
product_plan_code VARCHAR(100) NOT NULL,
product_type VARCHAR(50),
usage_id VARCHAR(100),

-- Optus-specific hierarchy
pass_code INT,
is_parent_ppc BOOLEAN NOT NULL DEFAULT FALSE,
parent_ppc_code VARCHAR(100),

-- Network configuration (JSON)
network_config TEXT,

-- Audit columns
creator VARCHAR(100),
created TIMESTAMP,
updater VARCHAR(100),
updated TIMESTAMP,

-- Constraints
CONSTRAINT cat_carrier_service_mapping_pkey PRIMARY KEY (id),
CONSTRAINT uk_csm_code UNIQUE (code),
CONSTRAINT uk_csm_carrier_ppc UNIQUE (carrier_code, product_plan_code),
CONSTRAINT fk_csm_service_template
FOREIGN KEY (service_template_id)
REFERENCES cat_service_template(id)
ON DELETE CASCADE
);

-- Sequence
CREATE SEQUENCE cat_carrier_service_mapping_seq START 1 INCREMENT 1;

Indexes

-- Fast lookup by service template
CREATE INDEX idx_csm_service_template
ON cat_carrier_service_mapping(service_template_id);

-- Filter by carrier
CREATE INDEX idx_csm_carrier_code
ON cat_carrier_service_mapping(carrier_code);

-- Lookup by PPC
CREATE INDEX idx_csm_product_plan_code
ON cat_carrier_service_mapping(product_plan_code);

-- Find child PPCs by parent
CREATE INDEX idx_csm_parent_ppc
ON cat_carrier_service_mapping(parent_ppc_code);

-- Find parent PPCs for carrier (Optus hierarchy)
CREATE INDEX idx_csm_carrier_parent
ON cat_carrier_service_mapping(carrier_code, is_parent_ppc);

Column Details

ColumnTypeNullableDescription
idBIGINTNoAuto-generated primary key
versionINTYesOptimistic locking version
codeVARCHAR(255)NoUnique business identifier
descriptionVARCHAR(255)YesHuman-readable description
service_template_idBIGINTNoFK to cat_service_template
carrier_codeVARCHAR(50)NoCarrier identifier (optus, telstra, etc.)
product_plan_codeVARCHAR(100)NoCarrier-specific PPC
product_typeVARCHAR(50)YesProduct classification
usage_idVARCHAR(100)YesCDR usage identifier
pass_codeINTYesOptus hierarchy: 0/1/2
is_parent_ppcBOOLEANNoDefault FALSE
parent_ppc_codeVARCHAR(100)YesParent PPC reference
network_configTEXTYesJSON configuration

cat_carrier_bundle

Defines carrier-specific service bundles.

DDL

CREATE TABLE cat_carrier_bundle (
-- Primary key
id BIGINT PRIMARY KEY,
version INT,

-- BusinessEntity columns
code VARCHAR(255) NOT NULL,
description VARCHAR(255),

-- Bundle identification
bundle_code VARCHAR(50) NOT NULL,
carrier_code VARCHAR(50) NOT NULL,

-- Primary PPC for bundle
primary_ppc_code VARCHAR(100),

-- Service classification
service_type VARCHAR(32),
billing_type VARCHAR(32),

-- Audit columns
creator VARCHAR(100),
created TIMESTAMP,
updater VARCHAR(100),
updated TIMESTAMP,

-- Constraints
CONSTRAINT cat_carrier_bundle_pkey PRIMARY KEY (id),
CONSTRAINT uk_cb_code UNIQUE (code),
CONSTRAINT uk_cb_bundle_code UNIQUE (bundle_code)
);

-- Sequence
CREATE SEQUENCE cat_carrier_bundle_seq START 1 INCREMENT 1;

Indexes

CREATE INDEX idx_cb_carrier ON cat_carrier_bundle(carrier_code);
CREATE INDEX idx_cb_primary_ppc ON cat_carrier_bundle(primary_ppc_code);
CREATE INDEX idx_cb_service_type ON cat_carrier_bundle(service_type);

cat_carrier_bundle_member

Junction table linking carrier bundles to carrier service mappings.

DDL

CREATE TABLE cat_carrier_bundle_member (
-- Foreign keys (composite primary key)
carrier_bundle_id BIGINT NOT NULL,
carrier_service_mapping_id BIGINT NOT NULL,

-- Optus-specific pass_code
pass_code INT,

-- Ordering and requirements
sort_order INT NOT NULL DEFAULT 0,
is_mandatory BOOLEAN NOT NULL DEFAULT TRUE,

-- Composite primary key
CONSTRAINT cat_carrier_bundle_member_pkey
PRIMARY KEY (carrier_bundle_id, carrier_service_mapping_id),

-- Foreign keys
CONSTRAINT fk_cbm_carrier_bundle
FOREIGN KEY (carrier_bundle_id)
REFERENCES cat_carrier_bundle(id)
ON DELETE CASCADE,

CONSTRAINT fk_cbm_carrier_service_mapping
FOREIGN KEY (carrier_service_mapping_id)
REFERENCES cat_carrier_service_mapping(id)
ON DELETE CASCADE
);

Indexes

CREATE INDEX idx_cbm_bundle ON cat_carrier_bundle_member(carrier_bundle_id);
CREATE INDEX idx_cbm_mapping ON cat_carrier_bundle_member(carrier_service_mapping_id);
CREATE INDEX idx_cbm_sort_order ON cat_carrier_bundle_member(carrier_bundle_id, sort_order);

Migration

Liquibase Changeset

The migration is defined in: commerce/opencell-core/opencell-model/src/main/db_resources/changelog/staqr/structure-carrier-service-mapping.xml

Changesets:

IDDescription
staqr-carrier-service-mapping-001Create sequence
staqr-carrier-service-mapping-002Create mapping table
staqr-carrier-service-mapping-003Add foreign key
staqr-carrier-service-mapping-004Create indexes
staqr-carrier-service-mapping-005Create bundle sequence
staqr-carrier-service-mapping-006Create bundle table
staqr-carrier-service-mapping-007Create bundle indexes
staqr-carrier-service-mapping-008Create member table
staqr-carrier-service-mapping-009Add member foreign keys
staqr-carrier-service-mapping-010Create member indexes

Running the Migration

# Liquibase update (Commerce container)
docker exec -it opencell-wildfly \
/opt/jboss/wildfly/bin/jboss-cli.sh -c \
--command="/subsystem=datasources/data-source=MEVEO:test-connection-in-pool"

# Verify migration applied
docker exec -it opencell-postgres \
psql -U opencell -d opencell \
-c "SELECT * FROM databasechangelog WHERE id LIKE 'staqr-carrier-service-mapping%';"

Rollback

Drop Tables (Reverse Order)

-- 1. Drop junction table first (no dependencies)
DROP TABLE IF EXISTS cat_carrier_bundle_member CASCADE;

-- 2. Drop bundle table
DROP TABLE IF EXISTS cat_carrier_bundle CASCADE;
DROP SEQUENCE IF EXISTS cat_carrier_bundle_seq;

-- 3. Drop mapping table
DROP TABLE IF EXISTS cat_carrier_service_mapping CASCADE;
DROP SEQUENCE IF EXISTS cat_carrier_service_mapping_seq;

Liquibase Rollback

# Rollback last 10 changesets
docker exec -it opencell-wildfly \
/opt/jboss/wildfly/bin/liquibase.sh \
--changeLogFile=db/changelog/db.changelog-master.xml \
rollbackCount 10

Monitoring Queries

Health Check

-- Count mappings by carrier
SELECT carrier_code, COUNT(*) as mapping_count
FROM cat_carrier_service_mapping
GROUP BY carrier_code
ORDER BY carrier_code;

-- Find orphaned mappings (no service template)
SELECT csm.*
FROM cat_carrier_service_mapping csm
LEFT JOIN cat_service_template st ON csm.service_template_id = st.id
WHERE st.id IS NULL;

-- Find parent PPCs for Optus
SELECT code, product_plan_code, product_type
FROM cat_carrier_service_mapping
WHERE carrier_code = 'optus' AND is_parent_ppc = true
ORDER BY product_plan_code;

-- Find child PPCs missing parent reference
SELECT code, product_plan_code, pass_code, parent_ppc_code
FROM cat_carrier_service_mapping
WHERE pass_code = 2 AND parent_ppc_code IS NULL;

Bundle Composition

-- List bundle members with PPC details
SELECT
cb.bundle_code,
cb.carrier_code,
cbm.sort_order,
cbm.is_mandatory,
csm.product_plan_code,
csm.product_type
FROM cat_carrier_bundle cb
JOIN cat_carrier_bundle_member cbm ON cb.id = cbm.carrier_bundle_id
JOIN cat_carrier_service_mapping csm ON cbm.carrier_service_mapping_id = csm.id
ORDER BY cb.bundle_code, cbm.sort_order;

Performance Considerations

  1. Index Usage: All foreign keys and common filter columns are indexed
  2. CASCADE Delete: Deleting ServiceTemplate removes all mappings automatically
  3. JSON Column: network_config is TEXT not JSONB for compatibility; parse in application
  4. Sequence Performance: Sequences use INCREMENT 1 for predictable ordering