def fetch(self, cur):
        cur.execute('''
        SELECT SUM(adu_count)
        FROM product_adu badu
        JOIN product_versions pv ON
          pv.product_version_id = badu.product_version_id
        WHERE
          adu_date >= %(enddate)s - interval '1 week' AND adu_date < %(enddate)s
          AND pv.build_type = 'beta' AND pv.major_version = %(version)s
          AND pv.product_name = 'Firefox'
        ''', {'os': self.os,
              'version': self.range.version,
              'enddate': self.range.enddate})

        adu, = cur.fetchone()
        self.adu = float(adu)

        startdate = date_to_timestamp(self.range.enddate - timedelta(days=7))
        enddate = date_to_timestamp(self.range.enddate - timedelta(days=1))
        cur.execute('''
            SELECT COUNT(*) count
            FROM reports_clean rc
            JOIN product_versions pv ON
              pv.product_version_id = rc.product_version_id
            WHERE
              date_processed BETWEEN %(startdate)s AND %(enddate)s
              AND pv.build_type = 'beta' AND pv.major_version = %(version)s
              AND pv.product_name = 'Firefox'
              AND rc.process_type = 'Browser'
            ''', {'os': self.os,
                  'version': self.range.version,
                  'startdate': startdate,
                  'enddate': enddate})
        self.total, = cur.fetchone()

        cur.execute('''
            SELECT s.signature, COUNT(*) count
            FROM reports_clean rc
            JOIN signatures s ON
              s.signature_id = rc.signature_id
            JOIN product_versions pv ON
              pv.product_version_id = rc.product_version_id
            WHERE
              date_processed BETWEEN %(startdate)s AND %(enddate)s
              AND pv.build_type = 'beta' AND pv.major_version = %(version)s
              AND pv.product_name = 'Firefox'
              AND rc.process_type = 'Browser'
            GROUP BY signature
            ORDER BY count DESC
            LIMIT 200
            ''', {'os': self.os,
                  'version': self.range.version,
                  'startdate': startdate,
                  'enddate': enddate})

        self.signatures = list(cur)
    def fetch(self, cur):
        cur.execute(
            '''
        SELECT SUM(adu_count)
        FROM product_adu badu
        JOIN product_versions pv ON
          pv.product_version_id = badu.product_version_id
        WHERE
          adu_date >= %(enddate)s - interval '1 week' AND adu_date < %(enddate)s
          AND pv.build_type = 'beta' AND pv.major_version = %(version)s
          AND pv.product_name = 'Firefox'
        ''', {
                'os': self.os,
                'version': self.range.version,
                'enddate': self.range.enddate
            })

        adu, = cur.fetchone()
        self.adu = float(adu)

        startdate = date_to_timestamp(self.range.enddate - timedelta(days=7))
        enddate = date_to_timestamp(self.range.enddate - timedelta(days=1))
        cur.execute(
            '''
            SELECT COUNT(*) count
            FROM reports_clean rc
            JOIN product_versions pv ON
              pv.product_version_id = rc.product_version_id
            WHERE
              date_processed BETWEEN %(startdate)s AND %(enddate)s
              AND pv.build_type = 'beta' AND pv.major_version = %(version)s
              AND pv.product_name = 'Firefox'
              AND rc.process_type = 'Browser'
            ''', {
                'os': self.os,
                'version': self.range.version,
                'startdate': startdate,
                'enddate': enddate
            })
        self.total, = cur.fetchone()

        cur.execute(
            '''
            SELECT s.signature, COUNT(*) count
            FROM reports_clean rc
            JOIN signatures s ON
              s.signature_id = rc.signature_id
            JOIN product_versions pv ON
              pv.product_version_id = rc.product_version_id
            WHERE
              date_processed BETWEEN %(startdate)s AND %(enddate)s
              AND pv.build_type = 'beta' AND pv.major_version = %(version)s
              AND pv.product_name = 'Firefox'
              AND rc.process_type = 'Browser'
            GROUP BY signature
            ORDER BY count DESC
            LIMIT 200
            ''', {
                'os': self.os,
                'version': self.range.version,
                'startdate': startdate,
                'enddate': enddate
            })

        self.signatures = list(cur)
    WHERE build_adus.build = releases_raw.build_id::text
  ) AS aducount,
  (
    SELECT crashcount FROM sigreports
    WHERE sigreports.build = releases_raw.build_id
  ) AS crashcount
FROM releases_raw
WHERE
  product_name = 'firefox' AND
  platform = 'win32' AND
  build_type = %(studlyChannel)s AND
  repository = %(repository)s AND
  to_date(substring(build_id::text from 1 for 8), 'YYYYMMDD') BETWEEN %(startdate)s AND %(enddate)s
ORDER BY build_id
  ''', {
        'startdate': dateoption.date_to_timestamp(opts.startdate),
        'enddate': dateoption.date_to_timestamp(opts.enddate),
        'signatures': signatures,
        'search': opts.search,
        'channel': opts.channel,
        'studlyChannel': opts.channel.capitalize(),
        'repository': channels[opts.channel]
    })

if opts.graph:
    import nightly_signature_graph
    builds = map(nightly_signature_graph.RowType, cur)
    label = "Crashes/100ADI for signature(s) %s on the %s channel" % (
        ','.join(signatures), opts.channel)
    nightly_signature_graph.produce_graph(builds, label, sys.stdout)
else:
    SELECT aducount FROM build_adus
    WHERE build_adus.build = releases_raw.build_id::text
  ) AS aducount,
  (
    SELECT crashcount FROM sigreports
    WHERE sigreports.build = releases_raw.build_id
  ) AS crashcount
FROM releases_raw
WHERE
  product_name = 'firefox' AND
  platform = 'win32' AND
  build_type = %(studlyChannel)s AND
  repository = %(repository)s AND
  to_date(substring(build_id::text from 1 for 8), 'YYYYMMDD') BETWEEN %(startdate)s AND %(enddate)s
ORDER BY build_id
  ''', {'startdate': dateoption.date_to_timestamp(opts.startdate),
        'enddate': dateoption.date_to_timestamp(opts.enddate),
        'signatures': signatures,
        'search': opts.search,
        'channel': opts.channel,
        'studlyChannel': opts.channel.capitalize(),
        'repository': channels[opts.channel]})

if opts.graph:
    import nightly_signature_graph
    builds = map(nightly_signature_graph.RowType, cur)
    label = "Crashes/100ADI for signature(s) %s on the %s channel" % (
        ','.join(signatures), opts.channel)
    nightly_signature_graph.produce_graph(builds, label, sys.stdout)
else:
    import csv