Created
October 5, 2015 10:19
-
-
Save sebastienros/b2fcb55dbbb3456f9c85 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Web.Mvc; | |
using Orchard.ContentManagement; | |
using Orchard.Indexing; | |
namespace Attendees.Controllers | |
{ | |
public class SearchController : Controller | |
{ | |
private readonly IIndexProvider _indexProvider; | |
private readonly IContentManager _contentManager; | |
public SearchController(IIndexProvider indexProvider, IContentManager contentManager) { | |
_indexProvider = indexProvider; | |
_contentManager = contentManager; | |
} | |
// GET: Attendees | |
public ActionResult Index(string q, string gender, string order, double? longitude, double? latitude, double? radius = 1) { | |
var searchBuilder = _indexProvider.CreateSearchBuilder("Attendees"); | |
if(!String.IsNullOrWhiteSpace(q)) { | |
searchBuilder = searchBuilder.Parse(new[] { "title", "attendee-jobtitle", "attendee-city" }, q, escape: true); | |
} | |
if(!String.IsNullOrWhiteSpace(gender)) { | |
searchBuilder = searchBuilder.WithField("attendee-gender", gender).AsFilter(); | |
} | |
if (longitude.HasValue && latitude.HasValue) { | |
searchBuilder = searchBuilder.WithinRange("attendee-longitude", longitude - radius, longitude + radius).Mandatory(); | |
searchBuilder = searchBuilder.WithinRange("attendee-latitude", latitude - radius, latitude + radius).Mandatory(); | |
} | |
if (String.Equals(order, "created", StringComparison.OrdinalIgnoreCase)) { | |
searchBuilder = searchBuilder.SortByDateTime("created").Ascending(); | |
} | |
var contentItemIds = searchBuilder.Search().Select(x => x.ContentItemId); | |
var contentItems = _contentManager | |
.GetMany<IContent>(contentItemIds, VersionOptions.Published, QueryHints.Empty) | |
.Cast<dynamic>(); | |
var results = contentItems | |
.Select(x => | |
new { | |
Title = x.TitlePart.Title, | |
JobTitle = x.Attendee.JobTitle.Value, | |
Gender = x.Attendee.Gender.Value, | |
City = x.Attendee.City.Value, | |
Country = ((IEnumerable<dynamic>)x.Attendee.Country.Terms).Select(t => new { Id = t.Id, Name = t.Name }).FirstOrDefault(), | |
Longitude = x.Attendee.Longitude.Value, | |
Latitude = x.Attendee.Latitude.Value, | |
RegisteredUtc = x.CommonPart.CreatedUtc, | |
}); | |
// Creates facet | |
var resultFacets = searchBuilder.GetBits(); | |
// The generic facets can be cached | |
var maleFacets = _indexProvider.CreateSearchBuilder("Attendees").WithField("attendee-gender", "Male").Mandatory().ExactMatch().GetBits(); | |
var femaleFacets = _indexProvider.CreateSearchBuilder("Attendees").WithField("attendee-gender", "Female").Mandatory().ExactMatch().GetBits(); | |
return Json( | |
new { | |
count = resultFacets.Count(), | |
male = resultFacets.And(maleFacets).Count(), | |
female = resultFacets.And(femaleFacets).Count(), | |
results, | |
}, | |
"application/json", | |
JsonRequestBehavior.AllowGet | |
); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment