[
  {
    "type": "alter_table",
    "description": "Replace unique constraint uk_floorPlan_rackName with regular index idx_floorPlan_rackName on fpRacks - allows duplicate custom names per floor plan (e.g. multiple Cash Wrap racks)",
    "database": "{{store}}",
    "check_query": "SELECT INDEX_NAME FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'fpRacks' AND INDEX_NAME = 'idx_floorPlan_rackName'",
    "sql": "ALTER TABLE `fpRacks` DROP INDEX `uk_floorPlan_rackName`, ADD INDEX `idx_floorPlan_rackName` (`floorPlanId`, `name`)"
  },
  {
    "type": "update",
    "description": "Backfill fpRacks.name from diagram JSON annotations[0].content - syncs custom rack names that were only saved in diagramData",
    "database": "{{store}}",
    "sql": "UPDATE fpRacks r INNER JOIN fpFloorPlans fp ON r.floorPlanId = fp.id CROSS JOIN (SELECT a.n + b.n * 10 as n FROM (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a CROSS JOIN (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b) idx SET r.name = JSON_UNQUOTE(JSON_EXTRACT(fp.diagramData, CONCAT('$.nodes[', idx.n, '].annotations[0].content'))), r.updated_at = NOW() WHERE JSON_UNQUOTE(JSON_EXTRACT(fp.diagramData, CONCAT('$.nodes[', idx.n, '].id'))) = r.syncfusionNodeId AND JSON_UNQUOTE(JSON_EXTRACT(fp.diagramData, CONCAT('$.nodes[', idx.n, '].annotations[0].content'))) IS NOT NULL AND TRIM(JSON_UNQUOTE(JSON_EXTRACT(fp.diagramData, CONCAT('$.nodes[', idx.n, '].annotations[0].content')))) != '' AND JSON_UNQUOTE(JSON_EXTRACT(fp.diagramData, CONCAT('$.nodes[', idx.n, '].annotations[0].content'))) != r.name"
  }
]
