Skip to content

Instantly share code, notes, and snippets.

@sebastienros
Created October 5, 2015 10:19
Show Gist options
  • Save sebastienros/b2fcb55dbbb3456f9c85 to your computer and use it in GitHub Desktop.
Save sebastienros/b2fcb55dbbb3456f9c85 to your computer and use it in GitHub Desktop.
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