CREATE DATABASE IF NOT EXISTS `mobilemodels` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci; CREATE DATABASE IF NOT EXISTS `python_services_test` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci; DROP VIEW IF EXISTS `python_services_test`.`models`; USE `mobilemodels`; SET @drop_stmt = ( SELECT CASE `TABLE_TYPE` WHEN 'BASE TABLE' THEN 'DROP TABLE `mm_device_record`' WHEN 'VIEW' THEN 'DROP VIEW `mm_device_record`' ELSE 'DO 0' END FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mobilemodels' AND `TABLE_NAME` = 'mm_device_record' LIMIT 1 ); SET @drop_stmt = COALESCE(@drop_stmt, 'DO 0'); PREPARE stmt FROM @drop_stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @drop_stmt = ( SELECT CASE `TABLE_TYPE` WHEN 'BASE TABLE' THEN 'DROP TABLE `mm_device_lookup`' WHEN 'VIEW' THEN 'DROP VIEW `mm_device_lookup`' ELSE 'DO 0' END FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mobilemodels' AND `TABLE_NAME` = 'mm_device_lookup' LIMIT 1 ); SET @drop_stmt = COALESCE(@drop_stmt, 'DO 0'); PREPARE stmt FROM @drop_stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @drop_stmt = ( SELECT CASE `TABLE_TYPE` WHEN 'BASE TABLE' THEN 'DROP TABLE `models`' WHEN 'VIEW' THEN 'DROP VIEW `models`' ELSE 'DO 0' END FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = 'mobilemodels' AND `TABLE_NAME` = 'models' LIMIT 1 ); SET @drop_stmt = COALESCE(@drop_stmt, 'DO 0'); PREPARE stmt FROM @drop_stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; DROP VIEW IF EXISTS `vw_mm_device_lookup`; DROP VIEW IF EXISTS `vw_models`; CREATE TABLE IF NOT EXISTS `mm_device_catalog` ( `record_id` varchar(64) NOT NULL, `model` varchar(191) NOT NULL, `alias_norm` varchar(191) NOT NULL, `device_name` varchar(255) NOT NULL, `brand` varchar(64) NOT NULL, `manufacturer_brand` varchar(64) NOT NULL, `parent_brand` varchar(64) NOT NULL, `market_brand` varchar(64) NOT NULL, `device_type` enum('phone','tablet','wear','tv','other') NOT NULL, `code` varchar(64) DEFAULT NULL, `code_alias` varchar(255) DEFAULT NULL, `ver_name` text DEFAULT NULL, `source_file` varchar(255) NOT NULL, `section` varchar(255) NOT NULL, `source_rank` int NOT NULL, `source_weight` decimal(6,3) NOT NULL, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `hash_md5` char(32) GENERATED ALWAYS AS ( md5(concat_ws(_utf8mb4'|', `model`, `device_type`, `market_brand`, `manufacturer_brand`, `code`, `code_alias`, `device_name`, `ver_name`)) ) STORED, `hash_crc` int unsigned GENERATED ALWAYS AS ( crc32(concat_ws(_utf8mb4'|', `model`, `device_type`, `market_brand`, `manufacturer_brand`, `code`, `code_alias`, `device_name`, `ver_name`)) ) STORED, PRIMARY KEY (`record_id`, `model`), KEY `idx_mm_device_catalog_alias_norm` (`alias_norm`, `source_rank`, `record_id`), KEY `idx_mm_device_catalog_model` (`model`), KEY `idx_mm_device_catalog_market_brand` (`market_brand`), KEY `idx_mm_device_catalog_parent_brand` (`parent_brand`), KEY `idx_mm_device_catalog_manufacturer_brand` (`manufacturer_brand`), KEY `idx_mm_device_catalog_device_type` (`device_type`), KEY `idx_mm_device_catalog_code` (`code`), KEY `idx_mm_device_catalog_hash` (`hash_md5`, `hash_crc`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE IF NOT EXISTS `mm_brand_lookup` ( `alias_norm` varchar(191) NOT NULL, `alias_type` enum('manufacturer','parent','market') NOT NULL, `canonical_brand` varchar(64) NOT NULL, `manufacturer_brand` varchar(64) DEFAULT NULL, `parent_brand` varchar(64) DEFAULT NULL, `market_brand` varchar(64) DEFAULT NULL, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`alias_norm`, `alias_type`), KEY `idx_mm_brand_lookup_canonical_brand` (`canonical_brand`), KEY `idx_mm_brand_lookup_manufacturer_brand` (`manufacturer_brand`), KEY `idx_mm_brand_lookup_parent_brand` (`parent_brand`), KEY `idx_mm_brand_lookup_market_brand` (`market_brand`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE OR REPLACE VIEW `mm_device_lookup` AS SELECT c.`alias_norm`, c.`record_id`, c.`device_name`, c.`brand`, c.`manufacturer_brand`, c.`parent_brand`, c.`market_brand`, c.`device_type`, c.`source_file`, c.`section`, c.`source_rank`, c.`source_weight`, c.`updated_at` FROM `mm_device_catalog` AS c; CREATE OR REPLACE VIEW `mm_device_record` AS SELECT c.`record_id`, c.`device_name`, c.`brand`, c.`manufacturer_brand`, c.`parent_brand`, c.`market_brand`, c.`device_type`, c.`source_file`, c.`section`, c.`source_rank`, c.`source_weight`, CAST(CONCAT('[', GROUP_CONCAT(JSON_QUOTE(c.`model`) ORDER BY c.`model` SEPARATOR ','), ']') AS JSON) AS `aliases_json`, MAX(c.`updated_at`) AS `updated_at` FROM `mm_device_catalog` AS c GROUP BY c.`record_id`, c.`device_name`, c.`brand`, c.`manufacturer_brand`, c.`parent_brand`, c.`market_brand`, c.`device_type`, c.`source_file`, c.`section`, c.`source_rank`, c.`source_weight`; CREATE OR REPLACE VIEW `vw_mm_device_lookup` AS SELECT c.`alias_norm`, c.`record_id`, c.`device_name`, c.`brand`, c.`manufacturer_brand`, c.`parent_brand`, c.`market_brand`, c.`device_type`, c.`source_file`, c.`section`, c.`source_rank`, c.`source_weight`, c.`updated_at` FROM `mm_device_catalog` AS c; CREATE OR REPLACE VIEW `models` AS SELECT c.`model`, c.`device_type` AS `dtype`, c.`market_brand` AS `brand`, c.`manufacturer_brand` AS `brand_title`, c.`code`, c.`code_alias`, c.`device_name` AS `model_name`, c.`ver_name`, c.`updated_at` AS `update_at`, c.`hash_md5`, c.`hash_crc` FROM `mm_device_catalog` AS c; CREATE OR REPLACE VIEW `vw_models` AS SELECT c.`model`, c.`device_type` AS `dtype`, c.`market_brand` AS `brand`, c.`manufacturer_brand` AS `brand_title`, c.`code`, c.`code_alias`, c.`device_name` AS `model_name`, c.`ver_name`, c.`updated_at` AS `update_at`, c.`hash_md5`, c.`hash_crc` FROM `mm_device_catalog` AS c; CREATE OR REPLACE VIEW `python_services_test`.`models` AS SELECT `model`, `dtype`, `brand`, `brand_title`, `code`, `code_alias`, `model_name`, `ver_name`, `update_at`, `hash_md5`, `hash_crc` FROM `mobilemodels`.`models`;