docs: def report(self):
          """
          Query analytics and stash data in a format suitable for serializing.
          """
          output = OrderedDict()
  
          for arg in GLOBAL_ARGUMENTS:
              output[arg] = getattr(self.args, arg) or self.config.get(arg, None)
  
          output['title'] = getattr(self.args, 'title') or self.config.get('title', 'Untitled Report')
          output['run_date'] = datetime.now().strftime('%Y-%m-%d')
          output['queries'] = []
  
          for analytic in self.config.get('queries', []):
              print 'Querying "%s"' % analytic['name']
  
              results = self.query(
                  metrics=analytic['metrics'],
                  dimensions=analytic.get('dimensions', []),
                  filters=analytic.get('filter', None),
                  segment=analytic.get('segment', None),
                  sort=analytic.get('sort', []),
                  start_index=analytic.get('start-index', 1),
                  max_results=analytic.get('max-results', 10)
              )
              
              dimensions_len = len(analytic.get('dimensions', []))
  
              data = OrderedDict([ 
                  ('config', analytic),
                  ('sampled', results.get('containsSampledData', False)),
                  ('sampleSize', int(results.get('sampleSize', 0))),
                  ('sampleSpace', int(results.get('sampleSpace', 0))),
                  ('data_types', OrderedDict()),
                  ('data', OrderedDict())
              ])
                      
              for column in results['columnHeaders'][dimensions_len:]:
                  data['data_types'][column['name']] = column['dataType']
  
              def cast_data_type(d, dt):
                  if dt == 'INTEGER':
                      return int(d)
                  elif data_type in ['TIME', 'FLOAT', 'CURRENCY', 'PERCENT']:  
                      return float(d)
                  else:
                      raise Exception('Unknown metric data type: %s' % data_type)
  
              for i, metric in enumerate(analytic['metrics']):
                  data['data'][metric] = OrderedDict()
                  data_type = data['data_types'][metric]
  
                  if dimensions_len:
                      for row in results.get('rows', []):
                          column = i + dimensions_len
                          label = ','.join(row[:dimensions_len]) 
                          value = cast_data_type(row[column], data_type)
  
                          data['data'][metric][label] = value 
  
                  data['data'][metric]['total'] = cast_data_type(results['totalsForAllResults'][metric], data_type)
  
                  # Prevent rate-limiting
                  sleep(1)
  
              output['queries'].append(data)
  
          return output