Example #1
0
        /// <exception cref="T:System.ArgumentOutOfRangeException">Thrown when sort order option is not provided.</exception>
        private async Task <Func <SortDescriptor <TIndexItem>, IPromise <IList <ISort> > > > CreateSort(IEnumerable <SortOptionArgs> sortOptions)
        {
            var descriptor = new SortDescriptor <TIndexItem>();

            foreach (var sortOption in sortOptions)
            {
                bool isTextField;
                var  translatableProperty = sortOption.PropertyName.Split('.');
                if (translatableProperty.Length == 2)
                {
                    isTextField = string.IsNullOrWhiteSpace(translatableProperty[0])
                                      ? await _elasticSearchService.CheckIfFieldTypeIsTextAsync <TIndexItem>(translatableProperty[1])
                                      : await _elasticSearchService.CheckIfFieldTypeIsTextAsync <TIndexItem>(translatableProperty[1], translatableProperty[0]);
                }
                else
                {
                    isTextField = string.IsNullOrWhiteSpace(sortOption.ParentPropertyName)
                                      ? await _elasticSearchService.CheckIfFieldTypeIsTextAsync <TIndexItem>(sortOption.PropertyName)
                                      : await _elasticSearchService.CheckIfFieldTypeIsTextAsync <TIndexItem>(sortOption.PropertyName, sortOption.ParentPropertyName);
                }

                if (isTextField)
                {
                    sortOption.PropertyName = string.IsNullOrWhiteSpace(sortOption.ParentPropertyName)
                                                  ? $"{sortOption.PropertyName}.keyword"
                                                  : $"{sortOption.ParentPropertyName}.{sortOption.PropertyName}.keyword";
                }

                switch (sortOption.SortOrder)
                {
                case SortOrder.Ascending:
                    SortAscending(sortOption, descriptor);

                    break;

                case SortOrder.Descending:
                    SortDescending(sortOption, descriptor);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(sortOption.SortOrder), sortOption.SortOrder, null);
                }
            }

            IPromise <IList <ISort> > Sorting(SortDescriptor <TIndexItem> sortDescriptor) => descriptor;

            return(Sorting);
        }