{
  "description": "Named queries of map.html and details.html, run by data-source.js on SQLite (sql.js) or by api.php on MySQL. SQL must run on both: quote reserved words with backticks, no ONLY_FULL_GROUP_BY violations, explicit ORDER BY. A query with \"with\" gets that fragment in front; params name the ? placeholders in order.",
  "fragments": {
    "latest": [
      "WITH last AS (",
      "  SELECT m.id AS municipality_id, MAX(s.scan_timestamp) AS scan_timestamp",
      "  FROM municipalities m",
      "  JOIN domains d ON d.municipality_id = m.id AND d.is_base_domain = 1 AND d.is_active = 1",
      "  JOIN scans s ON s.domain_id = d.id",
      "  WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL AND s.scan_timestamp < ?",
      "  GROUP BY m.id",
      "), latest AS (",
      "  SELECT l.municipality_id, MAX(s.id) AS scan_id",
      "  FROM last l",
      "  JOIN domains d ON d.municipality_id = l.municipality_id AND d.is_base_domain = 1 AND d.is_active = 1",
      "  JOIN scans s ON s.domain_id = d.id AND s.scan_timestamp = l.scan_timestamp",
      "  GROUP BY l.municipality_id",
      ")"
    ],
    "latest_audit": [
      "WITH last_audit AS (",
      "  SELECT a.municipality_id, MAX(a.audited_at) AS audited_at",
      "  FROM web_audits a JOIN municipalities m ON m.id = a.municipality_id",
      "  WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL AND a.audited_at < ?",
      "  GROUP BY a.municipality_id",
      "), latest_audit AS (",
      "  SELECT l.municipality_id, MAX(a.id) AS audit_id",
      "  FROM last_audit l JOIN web_audits a ON a.municipality_id = l.municipality_id AND a.audited_at = l.audited_at",
      "  GROUP BY l.municipality_id",
      ")"
    ]
  },
  "queries": {
    "status": {
      "sql": [
        "SELECT 1"
      ],
      "params": []
    },
    "config_regions": {
      "sql": [
        "SELECT name, is_eu, badge, badge_label FROM regions ORDER BY name"
      ],
      "params": []
    },
    "config_web_levels": {
      "sql": [
        "SELECT level, min_score, max_score, label, color FROM web_score_levels ORDER BY sort_order"
      ],
      "params": []
    },
    "mail_categories": {
      "sql": [
        "SELECT `key`, label, color, group_label, sort_order FROM mail_categories ORDER BY sort_order"
      ],
      "params": []
    },
    "provider_patterns": {
      "sql": [
        "SELECT pp.pattern, p.name, p.mail_category FROM provider_patterns pp",
        "JOIN providers p ON p.id = pp.provider_id ORDER BY p.id, pp.id"
      ],
      "params": []
    },
    "countries": {
      "sql": [
        "SELECT b.country_code, COALESCE(c.name, b.country_code),",
        "       (SELECT COUNT(DISTINCT d.municipality_id) FROM domains d",
        "        JOIN municipalities m ON m.id = d.municipality_id",
        "        WHERE m.country_code = b.country_code AND m.merged_into IS NULL AND m.retired_on IS NULL AND d.is_base_domain = 1 AND d.is_active = 1",
        "        AND EXISTS (SELECT 1 FROM scans s WHERE s.domain_id = d.id)),",
        "       c.unit",
        "FROM boundaries b LEFT JOIN countries c ON c.code = b.country_code",
        "ORDER BY 2"
      ],
      "params": []
    },
    "lists": {
      "sql": [
        "SELECT c.code, c.name,",
        "       (SELECT COUNT(DISTINCT d.municipality_id) FROM domains d",
        "        JOIN municipalities m ON m.id = d.municipality_id",
        "        WHERE m.country_code = c.code AND m.merged_into IS NULL AND m.retired_on IS NULL AND d.is_base_domain = 1 AND d.is_active = 1",
        "        AND EXISTS (SELECT 1 FROM scans s WHERE s.domain_id = d.id)),",
        "       c.unit",
        "FROM countries c",
        "WHERE c.unit IS NOT NULL AND NOT EXISTS (SELECT 1 FROM boundaries b WHERE b.country_code = c.code)",
        "ORDER BY 2"
      ],
      "params": []
    },
    "months": {
      "sql": [
        "SELECT DISTINCT substr(s.scan_timestamp, 1, 7)",
        "FROM municipalities m",
        "JOIN domains d ON d.municipality_id = m.id AND d.is_base_domain = 1 AND d.is_active = 1",
        "JOIN scans s ON s.domain_id = d.id",
        "WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL",
        "ORDER BY 1"
      ],
      "params": [
        "country"
      ]
    },
    "boundaries": {
      "sql": [
        "SELECT topojson FROM boundaries WHERE country_code = ?"
      ],
      "params": [
        "country"
      ]
    },
    "snapshot_providers": {
      "with": "latest",
      "sql": [
        "SELECT DISTINCT l.scan_id, p.name, p.is_tech_giant, p.region, dp.service_type, p.mail_category",
        "FROM latest l JOIN domain_providers dp ON dp.scan_id = l.scan_id JOIN providers p ON p.id = dp.provider_id",
        "ORDER BY l.scan_id, p.name, dp.service_type"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_hosting": {
      "with": "latest",
      "sql": [
        "SELECT DISTINCT l.scan_id, ig.country, ig.region, ig.ip_address",
        "FROM latest l JOIN hosting_locations hl ON hl.scan_id = l.scan_id",
        "JOIN ip_geolocations ig ON ig.id = hl.ip_geolocation_id",
        "ORDER BY l.scan_id, ig.ip_address"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_dns": {
      "with": "latest",
      "sql": [
        "SELECT DISTINCT l.scan_id, ig.region, ig.country, ig.ip_address",
        "FROM latest l JOIN dns_records dr ON dr.scan_id = l.scan_id AND dr.record_type = 'NS'",
        "JOIN ns_server_ips nsi ON nsi.dns_record_id = dr.id",
        "JOIN ip_geolocations ig ON ig.id = nsi.ip_geolocation_id",
        "ORDER BY l.scan_id, ig.ip_address"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_mx": {
      "with": "latest",
      "sql": [
        "SELECT l.scan_id, dr.record_value FROM latest l",
        "JOIN dns_records dr ON dr.scan_id = l.scan_id AND dr.record_type = 'MX'",
        "ORDER BY l.scan_id, dr.priority, dr.id"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_spf": {
      "with": "latest",
      "sql": [
        "SELECT DISTINCT l.scan_id, si.include_domain FROM latest l JOIN spf_includes si ON si.scan_id = l.scan_id",
        "ORDER BY l.scan_id, si.include_domain"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_web": {
      "with": "latest_audit",
      "sql": [
        "SELECT l.municipality_id, substr(a.audited_at, 1, 10), a.total, a.privacy, a.security, a.resilience, a.top_action,",
        "       a.privacy_rationale, a.security_rationale, a.resilience_rationale, a.report, a.shared_site",
        "FROM latest_audit l JOIN web_audits a ON a.id = l.audit_id",
        "ORDER BY l.municipality_id"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_collab": {
      "with": "latest",
      "sql": [
        "SELECT DISTINCT l.scan_id, cs.kind, cs.region, p.name FROM latest l",
        "JOIN collab_signals cs ON cs.scan_id = l.scan_id LEFT JOIN providers p ON p.id = cs.provider_id",
        "ORDER BY l.scan_id, cs.kind, cs.region, p.name"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_classified": {
      "with": "latest",
      "sql": [
        "SELECT l.scan_id, p.name, p.mail_category, s.mail_confidence, s.mail_rule, g.name, substr(s.scan_timestamp, 1, 10),",
        "       p.is_tech_giant, p.region, g.is_tech_giant, g.region",
        "FROM latest l JOIN scans s ON s.id = l.scan_id",
        "LEFT JOIN providers p ON p.id = s.mail_provider_id LEFT JOIN providers g ON g.id = s.gateway_provider_id",
        "ORDER BY l.scan_id"
      ],
      "params": [
        "country",
        "before"
      ]
    },
    "snapshot_municipalities": {
      "with": "latest",
      "sql": [
        "SELECT m.code, m.id, m.name, m.population, l.scan_id,",
        "       COALESCE(ld.domain_name, (SELECT MIN(domain_name) FROM domains",
        "                                 WHERE municipality_id = m.id AND is_base_domain = 1 AND is_active = 1))",
        "FROM municipalities m LEFT JOIN latest l ON l.municipality_id = m.id",
        "LEFT JOIN scans ls ON ls.id = l.scan_id LEFT JOIN domains ld ON ld.id = ls.domain_id",
        "WHERE m.country_code = ? AND m.code IS NOT NULL AND m.merged_into IS NULL AND m.retired_on IS NULL",
        "ORDER BY m.code"
      ],
      "params": [
        "country",
        "before",
        "country"
      ]
    },
    "detail_municipality": {
      "sql": [
        "SELECT m.id, m.name, m.country_code, m.population, d.id AS domain_id, d.domain_name",
        "FROM municipalities m",
        "LEFT JOIN domains d ON d.municipality_id = m.id AND d.is_base_domain = 1",
        "WHERE m.name = ?",
        "ORDER BY d.is_active DESC, m.id"
      ],
      "params": [
        "name"
      ]
    },
    "detail_municipality_id": {
      "sql": [
        "SELECT m.id, m.name, m.country_code, m.population, d.id AS domain_id, d.domain_name",
        "FROM municipalities m",
        "LEFT JOIN domains d ON d.municipality_id = m.id AND d.is_base_domain = 1",
        "WHERE m.id = ?",
        "ORDER BY d.is_active DESC, d.id"
      ],
      "params": [
        "municipality"
      ]
    },
    "detail_scan": {
      "sql": [
        "SELECT id, scan_timestamp FROM scans WHERE domain_id = ? ORDER BY scan_timestamp DESC, id DESC LIMIT 1"
      ],
      "params": [
        "domain"
      ]
    },
    "detail_municipality_scan": {
      "sql": [
        "SELECT s.id, s.scan_timestamp, d.domain_name",
        "FROM scans s JOIN domains d ON d.id = s.domain_id",
        "WHERE d.municipality_id = ? AND d.is_base_domain = 1 AND d.is_active = 1 AND s.scan_timestamp < ?",
        "ORDER BY s.scan_timestamp DESC, s.id DESC LIMIT 1"
      ],
      "params": [
        "municipality",
        "before"
      ]
    },
    "detail_web": {
      "sql": [
        "SELECT a.id, a.audited_at, a.url, a.total, a.privacy, a.security, a.resilience, a.top_action, a.cms,",
        "       a.cms_version, a.cms_eol, a.consent_state, a.third_parties, a.trackers,",
        "       a.privacy_rationale, a.security_rationale, a.resilience_rationale, a.report, a.shared_site",
        "FROM web_audits a WHERE a.municipality_id = ? AND a.audited_at < ?",
        "ORDER BY a.audited_at DESC, a.id DESC LIMIT 1"
      ],
      "params": [
        "municipality",
        "before"
      ]
    },
    "detail_web_deductions": {
      "sql": [
        "SELECT d.dimension, d.label, d.amount, d.explainer FROM web_audit_deductions d",
        "WHERE d.audit_id = (SELECT a.id FROM web_audits a WHERE a.municipality_id = ? AND a.audited_at < ?",
        "                    ORDER BY a.audited_at DESC, a.id DESC LIMIT 1)",
        "ORDER BY d.dimension, d.amount DESC, d.id"
      ],
      "params": [
        "municipality",
        "before"
      ]
    },
    "detail_web_jurisdictions": {
      "sql": [
        "SELECT j.code, j.is_eu, j.vendors FROM web_audit_jurisdictions j",
        "WHERE j.audit_id = (SELECT a.id FROM web_audits a WHERE a.municipality_id = ? AND a.audited_at < ?",
        "                    ORDER BY a.audited_at DESC, a.id DESC LIMIT 1)",
        "ORDER BY j.is_eu, j.code"
      ],
      "params": [
        "municipality",
        "before"
      ]
    },
    "detail_collab": {
      "sql": [
        "SELECT cs.kind, cs.name, cs.value, cs.region, p.name, p.is_tech_giant",
        "FROM collab_signals cs LEFT JOIN providers p ON p.id = cs.provider_id",
        "WHERE cs.scan_id = ?",
        "ORDER BY cs.kind, cs.id"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_mail": {
      "sql": [
        "SELECT p.name, p.is_tech_giant, p.region, p.mail_category, mc.label, mc.color,",
        "       s.mail_confidence, s.mail_rule, g.name, g.is_tech_giant, g.region",
        "FROM scans s",
        "LEFT JOIN providers p ON p.id = s.mail_provider_id",
        "LEFT JOIN mail_categories mc ON mc.`key` = p.mail_category",
        "LEFT JOIN providers g ON g.id = s.gateway_provider_id",
        "WHERE s.id = ?",
        "ORDER BY s.id"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_signals": {
      "sql": [
        "SELECT ms.kind, ms.name, ms.value, p.name, p.is_tech_giant, p.region, p.mail_role",
        "FROM mail_signals ms LEFT JOIN providers p ON p.id = ms.provider_id",
        "WHERE ms.scan_id = ?",
        "ORDER BY ms.kind, ms.id"
      ],
      "params": [
        "scan"
      ]
    },
    "signal_kinds": {
      "sql": [
        "SELECT kind, weight, is_primary, description FROM mail_signal_kinds",
        "ORDER BY weight DESC, kind"
      ],
      "params": []
    },
    "detail_patterns": {
      "sql": [
        "SELECT pp.pattern, p.name, p.is_tech_giant, p.region, p.mail_role FROM provider_patterns pp",
        "JOIN providers p ON p.id = pp.provider_id ORDER BY p.id, pp.id"
      ],
      "params": []
    },
    "detail_providers": {
      "sql": [
        "SELECT DISTINCT p.name, p.is_tech_giant, p.region, dp.service_type",
        "FROM domain_providers dp JOIN providers p ON p.id = dp.provider_id",
        "WHERE dp.scan_id = ?",
        "ORDER BY dp.service_type, p.name"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_hosting": {
      "sql": [
        "SELECT DISTINCT ig.country, ig.region, ig.ip_address",
        "FROM hosting_locations hl JOIN ip_geolocations ig ON ig.id = hl.ip_geolocation_id",
        "WHERE hl.scan_id = ?",
        "ORDER BY ig.ip_address"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_dns": {
      "sql": [
        "SELECT DISTINCT ig.region, ig.country, ig.ip_address, dr.record_value",
        "FROM dns_records dr",
        "JOIN ns_server_ips nsi ON nsi.dns_record_id = dr.id",
        "JOIN ip_geolocations ig ON ig.id = nsi.ip_geolocation_id",
        "WHERE dr.scan_id = ? AND dr.record_type = 'NS'",
        "ORDER BY dr.record_value, ig.ip_address"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_mx": {
      "sql": [
        "SELECT record_value, priority FROM dns_records",
        "WHERE scan_id = ? AND record_type = 'MX'",
        "ORDER BY priority, id"
      ],
      "params": [
        "scan"
      ]
    },
    "detail_spf": {
      "sql": [
        "SELECT si.include_domain, p.name, si.hosting_regions, p.is_tech_giant",
        "FROM spf_includes si LEFT JOIN providers p ON p.id = si.provider_id",
        "WHERE si.scan_id = ?",
        "ORDER BY si.include_domain"
      ],
      "params": [
        "scan"
      ]
    },
    "export_mail": {
      "with": "latest",
      "columns": [
        "code",
        "name",
        "population",
        "domain",
        "scan_date",
        "mail_provider",
        "mail_category",
        "provider_region",
        "confidence",
        "rule",
        "gateway_provider",
        "mx_hosts",
        "spf_includes"
      ],
      "sql": [
        "SELECT m.code, m.name, m.population, COALESCE(d.domain_name, (SELECT MIN(domain_name) FROM domains WHERE municipality_id = m.id AND is_base_domain = 1 AND is_active = 1)),",
        "       substr(s.scan_timestamp, 1, 10), p.name, p.mail_category, p.region, s.mail_confidence, s.mail_rule, g.name,",
        "       (SELECT REPLACE(GROUP_CONCAT(dr.record_value ORDER BY dr.priority, dr.id), ',', '; ') FROM dns_records dr",
        "        WHERE dr.scan_id = s.id AND dr.record_type = 'MX'),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT si.include_domain ORDER BY si.include_domain), ',', '; ') FROM spf_includes si WHERE si.scan_id = s.id)",
        "FROM municipalities m LEFT JOIN latest l ON l.municipality_id = m.id",
        "LEFT JOIN scans s ON s.id = l.scan_id LEFT JOIN domains d ON d.id = s.domain_id",
        "LEFT JOIN providers p ON p.id = s.mail_provider_id LEFT JOIN providers g ON g.id = s.gateway_provider_id",
        "WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL",
        "ORDER BY m.name, m.code"
      ],
      "params": [
        "country",
        "before",
        "country"
      ]
    },
    "export_hosting": {
      "with": "latest",
      "columns": [
        "code",
        "name",
        "domain",
        "scan_date",
        "web_countries",
        "web_regions",
        "dns_countries",
        "dns_regions"
      ],
      "sql": [
        "SELECT m.code, m.name, COALESCE(d.domain_name, (SELECT MIN(domain_name) FROM domains WHERE municipality_id = m.id AND is_base_domain = 1 AND is_active = 1)), substr(s.scan_timestamp, 1, 10),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT ig.country ORDER BY ig.country), ',', '; ') FROM hosting_locations hl JOIN ip_geolocations ig ON ig.id = hl.ip_geolocation_id WHERE hl.scan_id = s.id),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT ig.region ORDER BY ig.region), ',', '; ') FROM hosting_locations hl JOIN ip_geolocations ig ON ig.id = hl.ip_geolocation_id WHERE hl.scan_id = s.id),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT ig.country ORDER BY ig.country), ',', '; ') FROM dns_records dr JOIN ns_server_ips nsi ON nsi.dns_record_id = dr.id JOIN ip_geolocations ig ON ig.id = nsi.ip_geolocation_id WHERE dr.scan_id = s.id AND dr.record_type = 'NS'),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT ig.region ORDER BY ig.region), ',', '; ') FROM dns_records dr JOIN ns_server_ips nsi ON nsi.dns_record_id = dr.id JOIN ip_geolocations ig ON ig.id = nsi.ip_geolocation_id WHERE dr.scan_id = s.id AND dr.record_type = 'NS')",
        "FROM municipalities m LEFT JOIN latest l ON l.municipality_id = m.id",
        "LEFT JOIN scans s ON s.id = l.scan_id LEFT JOIN domains d ON d.id = s.domain_id",
        "WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL",
        "ORDER BY m.name, m.code"
      ],
      "params": [
        "country",
        "before",
        "country"
      ]
    },
    "export_collab": {
      "with": "latest",
      "columns": [
        "code",
        "name",
        "domain",
        "scan_date",
        "google_identity",
        "microsoft_tenant",
        "google_services",
        "microsoft_services",
        "file_servers",
        "meeting_servers"
      ],
      "sql": [
        "SELECT m.code, m.name, COALESCE(d.domain_name, (SELECT MIN(domain_name) FROM domains WHERE municipality_id = m.id AND is_base_domain = 1 AND is_active = 1)), substr(s.scan_timestamp, 1, 10),",
        "       CASE WHEN s.id IS NULL THEN NULL WHEN EXISTS (SELECT 1 FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind = 'google_identity') THEN 1 ELSE 0 END,",
        "       (SELECT MAX(COALESCE(cs.value, 'yes')) FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind = 'ms_tenant'),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT cs.name ORDER BY cs.name), ',', '; ') FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind IN ('google_service', 'google_link')),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT cs.name ORDER BY cs.name), ',', '; ') FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind IN ('ms_service', 'ms_link')),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT cs.name ORDER BY cs.name), ',', '; ') FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind = 'files'),",
        "       (SELECT REPLACE(GROUP_CONCAT(DISTINCT cs.name ORDER BY cs.name), ',', '; ') FROM collab_signals cs WHERE cs.scan_id = s.id AND cs.kind = 'comms')",
        "FROM municipalities m LEFT JOIN latest l ON l.municipality_id = m.id",
        "LEFT JOIN scans s ON s.id = l.scan_id LEFT JOIN domains d ON d.id = s.domain_id",
        "WHERE m.country_code = ? AND m.merged_into IS NULL AND m.retired_on IS NULL",
        "ORDER BY m.name, m.code"
      ],
      "params": [
        "country",
        "before",
        "country"
      ]
    },
    "export_web": {
      "with": "latest_audit",
      "columns": [
        "code",
        "name",
        "domain",
        "audit_date",
        "url",
        "total",
        "privacy",
        "security",
        "resilience",
        "platform",
        "platform_end_of_life",
        "consent_state",
        "third_parties",
        "trackers",
        "biggest_win",
        "report_url"
      ],
      "sql": [
        "SELECT m.code, m.name, d.domain_name, substr(a.audited_at, 1, 10), a.url, a.total, a.privacy, a.security,",
        "       a.resilience, a.cms, a.cms_eol, a.consent_state, a.third_parties, a.trackers, a.top_action, a.report",
        "FROM latest_audit l JOIN web_audits a ON a.id = l.audit_id JOIN municipalities m ON m.id = l.municipality_id",
        "JOIN domains d ON d.id = a.domain_id",
        "ORDER BY m.name, m.code"
      ],
      "params": [
        "country",
        "before"
      ]
    }
  }
}
