Thursday, September 17, 2015

Search Query Builder

using Sitecore;
using Sitecore.Text;
using System;
using System.Globalization;
using System.Text;
using System.Web;

namespace TxtAv.Sc.Search.Util
{
    public class SearchQueryBuilder
    {
        private readonly UrlString _url;

        public struct Keys
        {
            public static string PAGE_KEY = "page";
            public static string SEARCH_KEY = "find";
            public static string TOPIC_KEY = "topic";
            public static string YEAR_KEY = "year";
            public static string AIRCRAFT_KEY = "aircraft";
            public static string MEDIATYPE_KEY = "mediatype";
            public static int PAGES_TO_DISPLAY = 5;
        }

        public SearchQueryBuilder(string url, string hash = null)
        {
            Hash = hash;

            // Append hash to the URL, if it was specified
            if (!String.IsNullOrEmpty(Hash) && !url.Contains("#"))
            {
                url = url + StringUtil.EnsurePrefix('#', Hash);
            }

            _url = new UrlString(url);

            int currentPage;
            Int32.TryParse(_url.Parameters[Keys.PAGE_KEY], out currentPage);
            CurrentPage = Math.Max(1, currentPage);

            SearchQuery = HttpUtility.UrlDecode(_url.Parameters[Keys.SEARCH_KEY]);

            Guid topicId;
            if (Guid.TryParse(_url.Parameters[Keys.TOPIC_KEY], out topicId))
            {
                TopicFilterOption = topicId;
            }

            Guid aircraftId;
            if (Guid.TryParse(_url.Parameters[Keys.AIRCRAFT_KEY], out aircraftId))
            {
                AircraftFilterOption = aircraftId;
            }

            Guid mediaTypeId;
            if (Guid.TryParse(_url.Parameters[Keys.MEDIATYPE_KEY], out mediaTypeId))
            {
                MediaTypeFilterOption = mediaTypeId;
            }

            int year;
            if (Int32.TryParse(_url.Parameters[Keys.YEAR_KEY], out year))
            {
                Year = year;
            }
        }

        public string Hash { get; set; }

        public int? CurrentPage { get; set; }

        public string SearchQuery { get; set; }

        public Guid? TopicFilterOption { get; set; }

        public Guid? AircraftFilterOption { get; set; }

        public Guid? MediaTypeFilterOption { get; set; }

        public int? Year { get; set; }

        public string GetUrl()
        {
            return GetUrl(CurrentPage);
        }

        public string GetUrl(int? page, string hash = null)
        {
            // Page
            if (page.HasValue && page.Value != 1)
                _url.Add(Keys.PAGE_KEY, page.ToString());
            else
                _url.Remove(Keys.PAGE_KEY);

            // Year
            if (Year.HasValue)
                _url.Add(Keys.YEAR_KEY, Year.ToString());
            else
                _url.Remove(Keys.YEAR_KEY);

            // Topic ID
            if (TopicFilterOption.HasValue)
                _url.Add(Keys.TOPIC_KEY, TopicFilterOption.ToString());
            else
                _url.Remove(Keys.TOPIC_KEY);

            // Aircraft ID
            if (AircraftFilterOption.HasValue)
                _url.Add(Keys.AIRCRAFT_KEY, AircraftFilterOption.ToString());
            else
                _url.Remove(Keys.AIRCRAFT_KEY);

            // Media Type
            if (MediaTypeFilterOption.HasValue)
                _url.Add(Keys.MEDIATYPE_KEY, MediaTypeFilterOption.ToString());
            else
                _url.Remove(Keys.MEDIATYPE_KEY);

            // Query
            if (!String.IsNullOrEmpty(SearchQuery))
                _url.Add(Keys.SEARCH_KEY, SearchQuery);
            else
                _url.Remove(Keys.SEARCH_KEY);

            // Hash
            string hashToAppend = !string.IsNullOrEmpty(hash) ? hash : Hash;
            if (!string.IsNullOrEmpty(hashToAppend))
            {
                _url.Hash = hashToAppend;
            }

            return _url.GetUrl();
        }

        public HtmlString RenderPagination(int totalItemCount, int pageSize)
        {
            var currentPage = CurrentPage ?? 1;

            int pageCount = (int)Math.Ceiling(totalItemCount / (double)pageSize);
            if (pageCount < 2) return null;

            var sb = new StringBuilder();

            // Handle previous link
            if (currentPage > 1)
            {
                sb.Append(BuildPageLink("&larr;", currentPage - 1, "prev"));
            }

            int start = 1;
            int end = pageCount;

            if (pageCount > Keys.PAGES_TO_DISPLAY)
            {
                int middle = (int)Math.Ceiling(Keys.PAGES_TO_DISPLAY / 2d) - 1;
                int below = (currentPage - middle);
                int above = (currentPage + middle);

                if (below < 4)
                {
                    above = Keys.PAGES_TO_DISPLAY;
                    below = 1;
                }
                else if (above > (pageCount - 4))
                {
                    above = pageCount;
                    below = (pageCount - Keys.PAGES_TO_DISPLAY);
                }

                start = below;
                end = above;
            }

            if (start > 3)
            {
                sb.Append(BuildPageLink("1", 1));
                sb.Append("<span>&hellip;</span>");
            }
            for (int i = start; i <= end; i++)
            {
                if (i == CurrentPage)
                {
                    sb.AppendFormat("<span class=\"active\">{0}</span>", i);
                }
                else
                {
                    sb.Append(BuildPageLink(i.ToString(CultureInfo.InvariantCulture), i));
                }
            }
            if (end < (pageCount - 3))
            {
                sb.Append("<span>&hellip;</span>");
                sb.Append(BuildPageLink(pageCount.ToString(CultureInfo.InvariantCulture), pageCount));
            }

            // Next
            if (CurrentPage < pageCount)
            {
                sb.Append(BuildPageLink("&rarr;", currentPage + 1, "next"));
            }

            return new HtmlString(sb.ToString());
        }

        private string BuildPageLink(string linkText, int page, string cssClass = null)
        {
            string url = GetUrl(page);
            return String.Format(
                    "<a href=\"{0}\"{1}>{2}</a>",
                    url,
                    !String.IsNullOrEmpty(cssClass) ? " class=\"" + cssClass + "\"" : String.Empty,
                    linkText
                );
        }

        public string GetMoreLink(string hash = null)
        {
            return GetUrl(CurrentPage + 1, hash);
        }

        public string GetTopicLink(Guid? guid, string hash = null)
        {
            SearchQueryBuilder tempSearchQueryBuilder =
                new SearchQueryBuilder(GetUrl(1, hash))
                {
                    TopicFilterOption = guid
                };

            return tempSearchQueryBuilder.GetUrl();
        }

        public string GetAircraftLink(Guid? guid, string hash = null)
        {
            SearchQueryBuilder tempSearchQueryBuilder =
                new SearchQueryBuilder(GetUrl(1, hash))
                {
                    AircraftFilterOption = guid
                };

            return tempSearchQueryBuilder.GetUrl();
        }

        public string GetMediaTypetLink(Guid? guid, string hash = null)
        {
            SearchQueryBuilder tempSearchQueryBuilder =
                new SearchQueryBuilder(GetUrl(1, hash))
                {
                    MediaTypeFilterOption = guid
                };

            return tempSearchQueryBuilder.GetUrl();
        }

        public string GetSearchLink(string term = null, string hash = null)
        {
            SearchQueryBuilder tempSearchQueryBuilder =
                new SearchQueryBuilder(GetUrl(1, hash))
                {
                    SearchQuery = term
                };

            return tempSearchQueryBuilder.GetUrl();
        }
    }
}

 ------------------

protected void lbSearch_Click(object sender, EventArgs e)
        {
            RootSearchQueryBuilder.CurrentPage = 1; // Reset pagnation upon filter
            Response.Redirect(RootSearchQueryBuilder.GetSearchLink(txtSearch.Text));
        }          
          

No comments:

Post a Comment