diff --git a/src/VirtoCommerce.Xapi.Core/Extensions/IHasLanguageExtensions.cs b/src/VirtoCommerce.Xapi.Core/Extensions/IHasLanguageExtensions.cs index 308ed22..4a7b0c1 100644 --- a/src/VirtoCommerce.Xapi.Core/Extensions/IHasLanguageExtensions.cs +++ b/src/VirtoCommerce.Xapi.Core/Extensions/IHasLanguageExtensions.cs @@ -8,6 +8,17 @@ namespace VirtoCommerce.Xapi.Core.Extensions { public static class IHasLanguageExtensions { + /// + /// Looking for first best-match language-specific value in the enumerable + /// + /// An enumerable with values to search + /// Language to search + /// First matching item to the specified language + public static IHasLanguageCode FirstBestMatchForLanguage(this IEnumerable hasLanguages, string language) + { + return hasLanguages.FirstBestMatchForLanguage(x => x.LanguageCode, language); + } + /// /// Looking for first best-match language-specific value in the enumerable, based on specified language value selector function /// @@ -20,12 +31,14 @@ public static T FirstBestMatchForLanguage(this IEnumerable hasLanguages, F { ArgumentNullException.ThrowIfNull(hasLanguages); - //Try find object for passed language event if it null - var result = hasLanguages.FirstOrDefault(x => langSelector(x)?.EqualsIgnoreCase(language) ?? langSelector(x) == language); + var hasLanguagesCollection = hasLanguages as ICollection ?? hasLanguages.ToList(); + + //Try to find object for passed language event if it is null + var result = hasLanguagesCollection.FirstOrDefault(x => langSelector(x)?.EqualsIgnoreCase(language) ?? langSelector(x) == language); if (result == null) { //find the first with no language set - result = hasLanguages.FirstOrDefault(x => langSelector(x) == null); + result = hasLanguagesCollection.FirstOrDefault(x => langSelector(x) == null); } return result; } @@ -41,16 +54,5 @@ public static IHasLanguage FirstBestMatchForLanguage(this IEnumerable x.LanguageCode, language); } - - /// - /// Looking for first best-match language-specific value in the enumerable - /// - /// An enumerable with values to search - /// Language to search - /// First matching item to the specified language - public static IHasLanguageCode FirstBestMatchForLanguage(this IEnumerable hasLanguages, string language) - { - return hasLanguages.FirstBestMatchForLanguage(x => x.LanguageCode, language); - } } } diff --git a/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetResult.cs b/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetResult.cs index 34f3ab3..0119509 100644 --- a/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetResult.cs +++ b/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetResult.cs @@ -10,5 +10,7 @@ public RangeFacetResult() } public IList Ranges { get; set; } = new List(); + + public RangeFacetStatistics Statistics { get; set; } } } diff --git a/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetStatistics.cs b/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetStatistics.cs new file mode 100644 index 0000000..9bfa9c3 --- /dev/null +++ b/src/VirtoCommerce.Xapi.Core/Models/Facets/RangeFacetStatistics.cs @@ -0,0 +1,7 @@ +namespace VirtoCommerce.Xapi.Core.Models.Facets; + +public class RangeFacetStatistics +{ + public double? Max { get; set; } + public double? Min { get; set; } +} diff --git a/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetResultType.cs b/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetResultType.cs index d5d74a8..3eb252a 100644 --- a/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetResultType.cs +++ b/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetResultType.cs @@ -11,12 +11,18 @@ public RangeFacetResultType() Field(d => d.Name, nullable: false).Description("The key/name of the facet."); Field(d => d.Label, nullable: false).Description("Localized name of the facet."); + Field>("FacetType") .Description("The three types of facets. Terms, Range, Filter"); + Field>>>("Ranges") .Description("Ranges") .Resolve(context => context.Source.Ranges); + Field("Statistics") + .Description("Statistics for the facet, such as min and max values across ranges.") + .Resolve(context => context.Source.Statistics); + IsTypeOf = obj => obj is RangeFacetResult; Interface(); } diff --git a/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetStatisticsType.cs b/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetStatisticsType.cs new file mode 100644 index 0000000..d5cf7ba --- /dev/null +++ b/src/VirtoCommerce.Xapi.Core/Schemas/Facets/RangeFacetStatisticsType.cs @@ -0,0 +1,15 @@ +using VirtoCommerce.Xapi.Core.Models.Facets; + +namespace VirtoCommerce.Xapi.Core.Schemas.Facets +{ + public class RangeFacetStatisticsType : ExtendableGraphType + { + public RangeFacetStatisticsType() + { + Name = "RangeFacetStatistics"; + + Field(d => d.Max, nullable: true).Description("The maximum value in the range or across ranges."); + Field(d => d.Min, nullable: true).Description("The minimum value in the range or across ranges."); + } + } +} diff --git a/src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj b/src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj index 0eb6473..8d93a7e 100644 --- a/src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj +++ b/src/VirtoCommerce.Xapi.Core/VirtoCommerce.Xapi.Core.csproj @@ -29,7 +29,7 @@ - + diff --git a/src/VirtoCommerce.Xapi.Web/module.manifest b/src/VirtoCommerce.Xapi.Web/module.manifest index 573f538..81dc36a 100644 --- a/src/VirtoCommerce.Xapi.Web/module.manifest +++ b/src/VirtoCommerce.Xapi.Web/module.manifest @@ -8,7 +8,7 @@ - +