public class SiteStatistics : AbstractMultiMapIndexCreationTask<SiteStatistics.ReduceResult>
  {
    public SiteStatistics()
    {
      AddMap<Site>(sites =>
        from site in sites
        select new
        {
          Id = site.Id,
          Name = site.Name,
          ActiveUntil = site.ActiveUntil ?? DateTime.MinValue,
          SurveyCount = site.Surveys,
          ViewCount = 0,
          ResponseCount = 0
        });
      AddMap<View>(views =>
        from view in views
        select new
        {
          Id = view.SiteId,
          Name = (string)null,
          ActiveUntil = DateTime.MinValue,
          SurveyCount = 0,
          ViewCount = 1,
          ResponseCount = 0
        });
           Â
      AddMap<Response>(responses =>
        from response in responses
        select new
        {
          Id = response.SiteId,
          Name = (string)null,
          ActiveUntil = DateTime.MinValue,
          SurveyCount = 0,
          ViewCount = 0,
          ResponseCount = 1
        });
      Reduce = results =>
        from result in results
        group result by result.Id into g
        select new
        {
          Id = g.Key,
          Name = g.Select(x => x.Name).Where(x => x != null).FirstOrDefault(),
          ActiveUntil = g.Select(x => x.ActiveUntil).Where(x => x != DateTime.MinValue).FirstOrDefault(),
          SurveyCount = g.Sum(x => x.SurveyCount),
          ViewCount = g.Sum(x => x.ViewCount),
          ResponseCount = g.Sum(x => x.ResponseCount)
        };
      Index(x => x.Name, FieldIndexing.Analyzed);
    }
    public class ReduceResult
    {
      public string Id { get; set; }
      public string Name { get; set; }
      public DateTime ActiveUntil { get; set; }
      public int SurveyCount { get; set; }
      public int ViewCount { get; set; }
      public int ResponseCount { get; set; }
    }
  }