export async function fetchClassifiedReports()

in src/server/helpers/classified_reports_transform.ts [9:82]


export async function fetchClassifiedReports(projectId: string, paramFrom: string, paramTo: string, logger: Logger) {
  logger.verbose("Connecting to BigQuery...");
  const bq = getBqConnection(projectId);

  logger.verbose("Starting queries...");
  // Note: this looks weird - but it makes sure the queries run in parallel.
  // Since BQ has some initial latency when responding, this matters.
  // [ToDo] Investigate whether using QueryJobs makes sense here.
  const [[rawReports], [rawUrlPatterns]] = await Promise.all([
    bq.query({
      query: `
        SELECT
          reports.document_id AS uuid,
          CAST(reports.submission_timestamp AS DATETIME) AS reported_at,
          reports.client_info.app_display_version AS app_version,
          reports.metrics.string.broken_site_report_breakage_category AS breakage_category,
          reports.metrics.string.broken_site_report_tab_info_antitracking_block_list AS tp_status,
          reports.metrics.text2.broken_site_report_browser_info_app_default_useragent_string as ua_string,
          reports.metrics.text2.broken_site_report_description AS comments,
          reports.metrics.url2.broken_site_report_url AS url,
          reports.normalized_app_name AS app_name,
          reports.normalized_channel AS app_channel,
          reports.metadata.user_agent.version AS app_major_version,
          ARRAY(
            SELECT label
            FROM webcompat_user_reports.labels
            WHERE report_uuid = reports.document_id
          ) as labels,
          bp.label as prediction,
          bp.probability as prob,
          action.type AS action,
          ml_trans.translated_text AS translated_comments,
          ml_trans.language_code AS translated_from,

          # If the report is from Windows, we have to use a bit of mozfun to figure out the human-readable Windows
          # version for the build number. But this function only works on Windows pings, so we have to gate it.
          IF (
            client_info.windows_build_number IS NOT NULL,
            mozfun.norm.windows_version_info('Windows_NT', client_info.os_version, client_info.windows_build_number),
            reports.normalized_os
          ) as os
        FROM moz-fx-data-shared-prod.firefox_desktop.broken_site_report as reports
        LEFT JOIN webcompat_user_reports.bugbug_predictions AS bp ON reports.document_id = bp.report_uuid
        LEFT JOIN webcompat_user_reports.translations AS ml_trans ON reports.document_id = ml_trans.report_uuid
        LEFT JOIN 
        (SELECT 
             report_uuid,
             type,
             created_at,
             ROW_NUMBER() OVER (PARTITION BY report_uuid ORDER BY created_at DESC) AS rn
         FROM 
         webcompat_user_reports.report_actions
        ) AS action ON reports.document_id = action.report_uuid AND action.rn = 1
        WHERE
          reports.submission_timestamp BETWEEN TIMESTAMP(?) and TIMESTAMP(DATE_ADD(?, interval 1 day))
          AND reports.metrics.text2.broken_site_report_description != "";
      `,
      params: [paramFrom, paramTo],
    }),
    bq.query({
      query: [
        "SELECT patterns.*, bugs.title",
        "FROM webcompat_knowledge_base.url_patterns AS patterns",
        "LEFT JOIN webcompat_knowledge_base.bugzilla_bugs AS bugs ON patterns.bug = bugs.number",
      ].join(" "),
    }),
  ]);
  logger.verbose(`Received ${rawReports.length} user reports and ${rawUrlPatterns.length} URL patterns.`);

  return {
    rawReports,
    rawUrlPatterns,
  };
}