- Added a new field to display the cron URL plan in user settings. - Updated JavaScript to handle the new plan data. refactor: Unify product model and migrate data - Migrated product data from `products_data` to `products` table. - Added new columns to `products` for better data organization. - Created `products_aggregate` table for storing aggregated product metrics. chore: Drop deprecated products_data table - Removed `products_data` table as data is now stored in `products`. feat: Add merchant URL flags to products - Introduced flags for tracking merchant URL status in `products` table. - Normalized product URLs to handle empty or invalid values. feat: Link campaign alerts to specific products - Added `product_id` column to `campaign_alerts` table for better tracking. - Created an index for efficient querying of alerts by product. chore: Add debug scripts for client data inspection - Created debug scripts to inspect client data from local and remote databases. - Included error handling and output formatting for better readability.
166 lines
5.6 KiB
SQL
166 lines
5.6 KiB
SQL
-- Migracja: unifikacja modelu danych produktow
|
|
-- Cel:
|
|
-- 1) przeniesienie danych produktowych do tabeli products (kolumny dotad trzymane glownie w products_data)
|
|
-- 2) dodanie tabeli agregatow products_aggregate (30 dni + all-time)
|
|
|
|
-- ===========================
|
|
-- products: nowe kolumny danych produktu
|
|
-- ===========================
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'custom_label_4'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `custom_label_4` VARCHAR(255) NULL DEFAULT NULL AFTER `min_roas`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'custom_label_3'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `custom_label_3` VARCHAR(255) NULL DEFAULT NULL AFTER `custom_label_4`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'title'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `title` VARCHAR(255) NULL DEFAULT NULL AFTER `custom_label_3`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'description'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `description` TEXT NULL AFTER `title`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'google_product_category'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `google_product_category` TEXT NULL AFTER `description`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
SET @sql = IF(
|
|
EXISTS (
|
|
SELECT 1
|
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
WHERE TABLE_SCHEMA = DATABASE()
|
|
AND TABLE_NAME = 'products'
|
|
AND COLUMN_NAME = 'product_url'
|
|
),
|
|
'DO 1',
|
|
'ALTER TABLE `products` ADD COLUMN `product_url` VARCHAR(500) NULL DEFAULT NULL AFTER `google_product_category`'
|
|
);
|
|
PREPARE stmt FROM @sql;
|
|
EXECUTE stmt;
|
|
DEALLOCATE PREPARE stmt;
|
|
|
|
-- ===========================
|
|
-- Backfill products <- products_data
|
|
-- (zostawiamy products_data na razie dla kompatybilnosci)
|
|
-- ===========================
|
|
|
|
UPDATE `products` p
|
|
INNER JOIN `products_data` pd ON pd.product_id = p.id
|
|
SET
|
|
p.custom_label_4 = CASE
|
|
WHEN ( p.custom_label_4 IS NULL OR TRIM( p.custom_label_4 ) = '' ) AND pd.custom_label_4 IS NOT NULL AND TRIM( pd.custom_label_4 ) <> '' THEN pd.custom_label_4
|
|
ELSE p.custom_label_4
|
|
END,
|
|
p.custom_label_3 = CASE
|
|
WHEN ( p.custom_label_3 IS NULL OR TRIM( p.custom_label_3 ) = '' ) AND pd.custom_label_3 IS NOT NULL AND TRIM( pd.custom_label_3 ) <> '' THEN pd.custom_label_3
|
|
ELSE p.custom_label_3
|
|
END,
|
|
p.title = CASE
|
|
WHEN ( p.title IS NULL OR TRIM( p.title ) = '' ) AND pd.title IS NOT NULL AND TRIM( pd.title ) <> '' THEN pd.title
|
|
ELSE p.title
|
|
END,
|
|
p.description = CASE
|
|
WHEN ( p.description IS NULL OR TRIM( p.description ) = '' ) AND pd.description IS NOT NULL AND TRIM( pd.description ) <> '' THEN pd.description
|
|
ELSE p.description
|
|
END,
|
|
p.google_product_category = CASE
|
|
WHEN ( p.google_product_category IS NULL OR TRIM( p.google_product_category ) = '' ) AND pd.google_product_category IS NOT NULL AND TRIM( pd.google_product_category ) <> '' THEN pd.google_product_category
|
|
ELSE p.google_product_category
|
|
END,
|
|
p.product_url = CASE
|
|
WHEN ( p.product_url IS NULL OR TRIM( p.product_url ) = '' ) AND pd.product_url IS NOT NULL AND TRIM( pd.product_url ) <> '' THEN pd.product_url
|
|
ELSE p.product_url
|
|
END;
|
|
|
|
-- ===========================
|
|
-- Tabela agregatow produktow
|
|
-- ===========================
|
|
|
|
CREATE TABLE IF NOT EXISTS `products_aggregate` (
|
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
`product_id` INT(11) NOT NULL,
|
|
`campaign_id` INT(11) NOT NULL DEFAULT 0,
|
|
`ad_group_id` INT(11) NOT NULL DEFAULT 0,
|
|
`impressions_30` INT(11) NOT NULL DEFAULT 0,
|
|
`clicks_30` INT(11) NOT NULL DEFAULT 0,
|
|
`ctr_30` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`cost_30` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`conversions_30` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`conversion_value_30` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`roas_30` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`impressions_all_time` INT(11) NOT NULL DEFAULT 0,
|
|
`clicks_all_time` INT(11) NOT NULL DEFAULT 0,
|
|
`ctr_all_time` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`cost_all_time` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`conversions_all_time` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`conversion_value_all_time` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`roas_all_time` DECIMAL(20,6) NOT NULL DEFAULT 0.000000,
|
|
`date_sync` DATE NOT NULL,
|
|
PRIMARY KEY (`id`),
|
|
UNIQUE KEY `uk_products_aggregate_scope` (`product_id`,`campaign_id`,`ad_group_id`),
|
|
KEY `idx_products_aggregate_campaign_id` (`campaign_id`),
|
|
KEY `idx_products_aggregate_ad_group_id` (`ad_group_id`),
|
|
KEY `idx_products_aggregate_date_sync` (`date_sync`),
|
|
CONSTRAINT `FK_products_aggregate_products`
|
|
FOREIGN KEY (`product_id`) REFERENCES `products` (`id`)
|
|
ON DELETE CASCADE ON UPDATE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|