diff --git a/APIs/src/EpiServer.ContentGraph/Api/Filters/AndFilter.cs b/APIs/src/EpiServer.ContentGraph/Api/Filters/AndFilter.cs index f859c852..3ec4a826 100644 --- a/APIs/src/EpiServer.ContentGraph/Api/Filters/AndFilter.cs +++ b/APIs/src/EpiServer.ContentGraph/Api/Filters/AndFilter.cs @@ -37,6 +37,7 @@ public AndFilter(Expression> fieldSelector, NumericFilterOperators And(fieldSelector, filterOperators); } #endregion + #region Base type public AndFilter And(Expression> fieldSelector, IFilterOperator filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -61,6 +62,12 @@ public AndFilter And(Expression> fieldSelector, IFilterOpera And(fieldSelector.GetFieldPath(), filterOperator); return this; } + public AndFilter And(Expression> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } public AndFilter And(Expression> fieldSelector, IFilterOperator filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -73,6 +80,64 @@ public AndFilter And(Expression> fieldSelector, IFilterOperator And(fieldSelector.GetFieldPath(), filterOperator); return this; } + #endregion + #region Enumerable + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter(Expression>> fieldSelector, StringFilterOperators filterOperators) + { + And(fieldSelector, filterOperators); + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public AndFilter And(Expression>> rootSelector, + Expression> fieldSelector, + IFilterOperator filterOperator) + { + rootSelector.ValidateNotNullArgument("rootSelector"); + fieldSelector.ValidateNotNullArgument("fieldSelector"); + And($"{rootSelector.GetFieldPath()}.{fieldSelector.GetFieldPath()}", filterOperator); + return this; + } + #endregion private AndFilter And(Expression> fieldSelector) { fieldSelector.ValidateNotNullArgument("fieldSelector"); diff --git a/APIs/src/EpiServer.ContentGraph/Api/Filters/NotFilter.cs b/APIs/src/EpiServer.ContentGraph/Api/Filters/NotFilter.cs index 8549b1ed..daa83dbb 100644 --- a/APIs/src/EpiServer.ContentGraph/Api/Filters/NotFilter.cs +++ b/APIs/src/EpiServer.ContentGraph/Api/Filters/NotFilter.cs @@ -54,6 +54,12 @@ public NotFilter Not(Expression> fieldSelector, IFilterOpera Not(fieldSelector.GetFieldPath(), filterOperator); return this; } + public NotFilter Not(Expression> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } public NotFilter Not(Expression> fieldSelector, IFilterOperator filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -85,6 +91,63 @@ public NotFilter Not(params Expression>[] fieldSelectors) } return this; } + #region Enumerable + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter(Expression>> fieldSelector, StringFilterOperators filterOperators) + { + Not(fieldSelector, filterOperators); + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public NotFilter Not(Expression>> rootSelector, + Expression> fieldSelector, + IFilterOperator filterOperator) + { + rootSelector.ValidateNotNullArgument("rootSelector"); + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Not($"{rootSelector.GetFieldPath()}.{fieldSelector.GetFieldPath()}", filterOperator); + return this; + } + #endregion } public class NotFilter : Filter diff --git a/APIs/src/EpiServer.ContentGraph/Api/Filters/NumericFilterOperators.cs b/APIs/src/EpiServer.ContentGraph/Api/Filters/NumericFilterOperators.cs index 8be5df0e..efa9955d 100644 --- a/APIs/src/EpiServer.ContentGraph/Api/Filters/NumericFilterOperators.cs +++ b/APIs/src/EpiServer.ContentGraph/Api/Filters/NumericFilterOperators.cs @@ -71,14 +71,6 @@ public NumericFilterOperators InRange(int? from, int? to) } return this; } - public NumericFilterOperators InRanges(params (int? from, int? to)[] ranges) - { - foreach (var range in ranges) - { - InRange(range.from, range.to); - } - return this; - } public NumericFilterOperators Eq(float value) { @@ -164,21 +156,5 @@ public NumericFilterOperators InRange(double? from, double? to) } return this; } - public NumericFilterOperators InRanges(params (float? from, float? to)[] ranges) - { - foreach (var range in ranges) - { - InRange(range.from, range.to); - } - return this; - } - public NumericFilterOperators InRanges(params (double? from, double? to)[] ranges) - { - foreach (var range in ranges) - { - InRange(range.from, range.to); - } - return this; - } } } diff --git a/APIs/src/EpiServer.ContentGraph/Api/Filters/OrFilter.cs b/APIs/src/EpiServer.ContentGraph/Api/Filters/OrFilter.cs index f8196973..2a54e1a9 100644 --- a/APIs/src/EpiServer.ContentGraph/Api/Filters/OrFilter.cs +++ b/APIs/src/EpiServer.ContentGraph/Api/Filters/OrFilter.cs @@ -54,6 +54,12 @@ public OrFilter Or(Expression> fieldSelector, IFilterOperator Or(fieldSelector.GetFieldPath(), filterOperator); return this; } + public OrFilter Not(Expression> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } public OrFilter Or(Expression> fieldSelector, IFilterOperator filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -92,6 +98,63 @@ public OrFilter Or(params Expression>[] fieldSelectors) } return this; } + #region Enumerable + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter(Expression>> fieldSelector, StringFilterOperators filterOperators) + { + Or(fieldSelector, filterOperators); + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> fieldSelector, IFilterOperator filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or(fieldSelector.GetFieldPath(), filterOperator); + return this; + } + public OrFilter Or(Expression>> rootSelector, + Expression> fieldSelector, + IFilterOperator filterOperator) + { + rootSelector.ValidateNotNullArgument("rootSelector"); + fieldSelector.ValidateNotNullArgument("fieldSelector"); + Or($"{rootSelector.GetFieldPath()}.{fieldSelector.GetFieldPath()}", filterOperator); + return this; + } + #endregion } public class OrFilter : Filter diff --git a/APIs/src/EpiServer.ContentGraph/Api/Querying/TypeQueryBuilder.cs b/APIs/src/EpiServer.ContentGraph/Api/Querying/TypeQueryBuilder.cs index 9b68cdc1..def645f8 100644 --- a/APIs/src/EpiServer.ContentGraph/Api/Querying/TypeQueryBuilder.cs +++ b/APIs/src/EpiServer.ContentGraph/Api/Querying/TypeQueryBuilder.cs @@ -488,6 +488,17 @@ private string MergeFilters(string exsting, string additional) } return exsting; } + private void SetWhereClause(string clause) + { + if (graphObject.WhereClause.IsNullOrEmpty()) + { + graphObject.WhereClause = clause; + } + else + { + graphObject.WhereClause += $",{clause}"; + } + } public TypeQueryBuilder Where(string fieldName, IFilterOperator filterOperator) { filterOperator.ValidateNotNullArgument("filterOperator"); @@ -509,14 +520,7 @@ public TypeQueryBuilder Where(string fieldName, IFilterOperator filterOperato } } - if (graphObject.WhereClause.IsNullOrEmpty()) - { - graphObject.WhereClause = $"{combinedQuery}"; - } - else - { - graphObject.WhereClause += $",{combinedQuery}"; - } + SetWhereClause(combinedQuery); return this; } @@ -539,6 +543,14 @@ public TypeQueryBuilder Where(Expression> fieldSelector, Stri return this; } + public TypeQueryBuilder Where(Expression>> fieldSelector, StringFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } public TypeQueryBuilder Where(Expression> fieldSelector, NumericFilterOperators filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -547,6 +559,62 @@ public TypeQueryBuilder Where(Expression> fieldSelector, Numer return this; } + public TypeQueryBuilder Where(Expression>> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression>> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression>> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } + public TypeQueryBuilder Where(Expression>> fieldSelector, NumericFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } public TypeQueryBuilder Where(Expression> fieldSelector, DateFilterOperators filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -555,6 +623,14 @@ public TypeQueryBuilder Where(Expression> fieldSelector, Date return this; } + public TypeQueryBuilder Where(Expression>> fieldSelector, DateFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } public TypeQueryBuilder Where(Expression> fieldSelector, BooleanFilterOperators filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -563,6 +639,14 @@ public TypeQueryBuilder Where(Expression> fieldSelector, Boolea return this; } + public TypeQueryBuilder Where(Expression>> fieldSelector, BooleanFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } public TypeQueryBuilder Where(Expression> fieldSelector, DateFilterOperators filterOperator) { fieldSelector.ValidateNotNullArgument("fieldSelector"); @@ -571,18 +655,57 @@ public TypeQueryBuilder Where(Expression> fieldSelector, D return this; } + public TypeQueryBuilder Where(Expression>> fieldSelector, DateFilterOperators filterOperator) + { + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldSelector.GetFieldPath(), filterOperator); + + return this; + } public TypeQueryBuilder Where(IFilter filter) { filter.ValidateNotNullArgument("filter"); - if (graphObject.WhereClause.IsNullOrEmpty()) - { - graphObject.WhereClause = $"{filter.FilterClause}"; - } - else + SetWhereClause(filter.FilterClause); + return this; + } + //Support filter property of IEnumerable with filter extension + public TypeQueryBuilder Where(Expression>> enumSelector, Expression> fieldSelector) + { + enumSelector.ValidateNotNullArgument("enumSelector"); + fieldSelector.ValidateNotNullArgument("fieldSelector"); + + var enumPath = enumSelector.GetFieldPath(); + var paser = new FilterExpressionParser(); + var filter = paser.GetFilter(fieldSelector); + if (filter.IsNotNull()) { - graphObject.WhereClause += $",{filter.FilterClause}"; + var fieldFilter = filter.FilterClause; + var combineFilter = $"{enumPath}:{{{fieldFilter}}}"; + SetWhereClause(combineFilter); } + return this; + } + //Support filter property of IEnumerable with filter operator + public TypeQueryBuilder Where(Expression>> enumSelector, + Expression> fieldSelector, IFilterOperator filterOperator) + { + enumSelector.ValidateNotNullArgument("enumSelector"); + fieldSelector.ValidateNotNullArgument("fieldSelector"); + filterOperator.ValidateNotNullArgument("filterOperator"); + + var enumPath = enumSelector.GetFieldPath(); + var fullFieldPath = $"{enumPath}.{fieldSelector.GetFieldPath()}"; + Where(fullFieldPath, filterOperator); + return this; + } + //Support raw string field path + public TypeQueryBuilder Where(string fieldPath, IFilterOperator filterOperator) + { + fieldPath.ValidateNotNullArgument("fieldPath"); + filterOperator.ValidateNotNullArgument("filterOperator"); + Where(fieldPath, filterOperator); return this; } private TypeQueryBuilder Facet(string propertyName, IFacetOperator facetFilter) diff --git a/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtension.cs b/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtension.cs index 9cc9d9d6..3cb6641d 100644 --- a/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtension.cs +++ b/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtension.cs @@ -188,16 +188,6 @@ public static DelegateFilterBuilder InRange(this int field, int from, int to) { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from,to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this int field, params (int? from, int? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Long type @@ -248,16 +238,6 @@ public static DelegateFilterBuilder InRange(this long field, int from, int to) { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this long field, params (int? from, int? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Float type @@ -308,16 +288,6 @@ public static DelegateFilterBuilder InRange(this float field, int from, int to) { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this float field, params (float? from, float? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Double type @@ -368,16 +338,6 @@ public static DelegateFilterBuilder InRange(this double field, int from, int to) { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this double field, params (float? from, float? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #endregion diff --git a/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtensionIEnumerable.cs b/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtensionIEnumerable.cs index 4416c8be..0b3a55a7 100644 --- a/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtensionIEnumerable.cs +++ b/APIs/src/EpiServer.ContentGraph/Extensions/FilterExtensionIEnumerable.cs @@ -142,16 +142,6 @@ public static DelegateFilterBuilder InRange(this IEnumerable field, int fro { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this IEnumerable field, params (int? from, int? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Long type @@ -202,16 +192,6 @@ public static DelegateFilterBuilder InRange(this IEnumerable field, int fr { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this IEnumerable field, params (int? from, int? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Float type @@ -262,16 +242,6 @@ public static DelegateFilterBuilder InRange(this IEnumerable field, int f { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this IEnumerable field, params (float? from, float? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #region Double type @@ -322,16 +292,6 @@ public static DelegateFilterBuilder InRange(this IEnumerable field, int { return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRange(from, to))); } - /// - /// Multiple ranges for InRange filter. - /// - /// - /// Array of tuples (from,to) - /// - public static DelegateFilterBuilder InRanges(this IEnumerable field, params (float? from, float? to)[] ranges) - { - return new DelegateFilterBuilder(field => new TermFilter(field, new NumericFilterOperators().InRanges(ranges))); - } #endregion #endregion diff --git a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/EpiServer.ContentGraph.UnitTests.csproj b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/EpiServer.ContentGraph.UnitTests.csproj index 88601790..2e5980b5 100644 --- a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/EpiServer.ContentGraph.UnitTests.csproj +++ b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/EpiServer.ContentGraph.UnitTests.csproj @@ -7,12 +7,15 @@ + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/ExtensionTests/QueryExtensionTests.cs b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/ExtensionTests/QueryExtensionTests.cs index b1d4eaf4..47aeb92f 100644 --- a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/ExtensionTests/QueryExtensionTests.cs +++ b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/ExtensionTests/QueryExtensionTests.cs @@ -66,6 +66,23 @@ public void GetScore_should_build_query_with_score_field() typeQueryBuilder.GetScore(); var query = typeQueryBuilder.ToQuery().GetQuery(); + Assert.NotNull(query); + Assert.Contains(expectedFields, query.Query); + Assert.Equal(query.Query, expectedFullQuery); + } + [Fact] + public void generate_where_with_IEnumerable() + { + const string expectedFields = "{items{Property1 _score}}"; + const string expectedFilter = "where:{NestedObjects:{NestedProperty:{eq: 100}}}"; + const string expectedFullQuery = $"RequestTypeObject({expectedFilter}){expectedFields}"; + + typeQueryBuilder.Field(x => x.Property1); + typeQueryBuilder.GetScore(); + typeQueryBuilder.Where(x => x.NestedObjects, f => f.NestedProperty.Eq(100)); + + var query = typeQueryBuilder.ToQuery().GetQuery(); + Assert.NotNull(query); Assert.Contains(expectedFields, query.Query); Assert.Equal(query.Query, expectedFullQuery); diff --git a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/GenerateFilterTests.cs b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/GenerateFilterTests.cs index 56d850dd..f9e14179 100644 --- a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/GenerateFilterTests.cs +++ b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/GenerateFilterTests.cs @@ -103,5 +103,37 @@ public void SingleFieldWithNotFiltersTest() Assert.Contains(expectedFilters, query); Assert.Equal($"{type}{expectedFilters}{items}", query); } + [Fact] + public void generate_where_with_raw_string() + { + const string expectedFields = "{items{Property1}}"; + const string expectedFilter = "where:{Nesteds:{NestedProperty:{eq: 100}}}"; + const string expectedFullQuery = $"RequestTypeObject({expectedFilter}){expectedFields}"; + + typeQueryBuilder.Field(x => x.Property1); + typeQueryBuilder.Where("Nesteds.NestedProperty", new NumericFilterOperators().Eq(100)); + + var query = typeQueryBuilder.ToQuery().GetQuery(); + + Assert.NotNull(query); + Assert.Contains(expectedFields, query.Query); + Assert.Equal(query.Query, expectedFullQuery); + } + [Fact] + public void generate_where_with_IFilterOperator() + { + const string expectedFields = "{items{Property1}}"; + const string expectedFilter = "where:{NestedObjects:{NestedProperty:{eq: 100}}}"; + const string expectedFullQuery = $"RequestTypeObject({expectedFilter}){expectedFields}"; + + typeQueryBuilder.Field(x => x.Property1); + typeQueryBuilder.Where(x => x.NestedObjects, f => f.NestedProperty, new NumericFilterOperators().Eq(100)); + + var query = typeQueryBuilder.ToQuery().GetQuery(); + + Assert.NotNull(query); + Assert.Contains(expectedFields, query.Query); + Assert.Equal(query.Query, expectedFullQuery); + } } } diff --git a/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/Startup.cs b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/Startup.cs new file mode 100644 index 00000000..f010e67a --- /dev/null +++ b/APIs/src/Testing/EpiServer.ContentGraph.UnitTests/Startup.cs @@ -0,0 +1,17 @@ +using EPiServer.ContentGraph.Connection; +using EPiServer.ServiceLocation; +using Microsoft.Extensions.DependencyInjection; + +namespace EpiServer.ContentGraph.UnitTests +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddMemoryCache(); + services.AddSingleton(); + var provider = services.BuildServiceProvider(); + CacheAccessor.Cache = provider.GetService(); + } + } +}