diff --git a/JsonApiBugReport/JsonApiBugReport.csproj b/JsonApiBugReport/JsonApiBugReport.csproj
index b4490c0..bcf9008 100644
--- a/JsonApiBugReport/JsonApiBugReport.csproj
+++ b/JsonApiBugReport/JsonApiBugReport.csproj
@@ -7,7 +7,7 @@
- 5.7.2-master-01199
+ 5.7.2-master-01204
diff --git a/JsonApiBugReport/JsonApiBugReport.http b/JsonApiBugReport/JsonApiBugReport.http
index 4d36ac6..2e1b9ed 100644
--- a/JsonApiBugReport/JsonApiBugReport.http
+++ b/JsonApiBugReport/JsonApiBugReport.http
@@ -8,10 +8,40 @@ GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units
GET {{HostAddress}}/PriceGroup?include=products
-### Sparse fieldset on subset of derived types
+### Sparse fieldset on derived type Bundle
+
+GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Bundle]=isTaxable
+
+### Sparse fieldset on derived type Addon
+
+GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Addon]=trialDuration,allowsCustomEndDate
+
+### Sparse fieldset on subset of derived types [SLOW]
GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&fields[Addon]=trialDuration,allowsCustomEndDate&fields[Bundle]=isTaxable
### Non-default page size on top-level include
GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&page[size]=products:5
+
+### Filter on type hierarchy
+
+GET {{HostAddress}}/PriceGroup?include=products&filter[products]=equals(id,'FFFFFFFF-0000-0000-0000-FFFFFFFFFFFF')
+
+### Filter after type hierarchy [HAS NEVER WORKED]
+
+GET {{HostAddress}}/PriceGroup?include=products.unitGroup.units&filter[products.unitGroup.units]=equals(id,'FFFFFFFF-0000-0000-0000-FFFFFFFFFFFF')
+
+### ProductBase
+### : CommonProduct
+### : ProductBundle = "Bundle"
+### : StandaloneProduct
+### : Product
+### : ProductAddon = "Addon"
+### : ProductGroup
+###
+### HasOne: UnitGroup
+### HasMany: Units
+###
+### PriceGroup
+### HasMany: Products
diff --git a/JsonApiBugReport/Program.cs b/JsonApiBugReport/Program.cs
index d7be839..2b0faed 100644
--- a/JsonApiBugReport/Program.cs
+++ b/JsonApiBugReport/Program.cs
@@ -21,8 +21,6 @@
{
["Logging:LogLevel:JsonApiDotNetCore.Repositories"] = "Debug"
});
-
- builder.Services.AddTransient();
}
else
{
@@ -43,4 +41,4 @@
await app.RunDbMigrations();
-await app.RunAsync();
+await app.RunAsync();
\ No newline at end of file
diff --git a/JsonApiBugReport/PruningQueryableBuilder.cs b/JsonApiBugReport/PruningQueryableBuilder.cs
deleted file mode 100644
index 892d11f..0000000
--- a/JsonApiBugReport/PruningQueryableBuilder.cs
+++ /dev/null
@@ -1,85 +0,0 @@
-using System;
-using System.Linq;
-using System.Linq.Expressions;
-using AgileObjects.ReadableExpressions;
-using JsonApiDotNetCore.Configuration;
-using JsonApiDotNetCore.Queries;
-using JsonApiDotNetCore.Queries.QueryableBuilding;
-using Microsoft.Extensions.Logging;
-
-#nullable enable
-
-namespace JsonApiBugReport;
-
-public class PruningQueryableBuilder(
- IIncludeClauseBuilder includeClauseBuilder,
- IWhereClauseBuilder whereClauseBuilder,
- IOrderClauseBuilder orderClauseBuilder,
- ISkipTakeClauseBuilder skipTakeClauseBuilder,
- ISelectClauseBuilder selectClauseBuilder,
- IJsonApiOptions options,
- ILogger logger)
- : QueryableBuilder(includeClauseBuilder, whereClauseBuilder, orderClauseBuilder, skipTakeClauseBuilder,
- selectClauseBuilder)
-{
- public override Expression ApplyQuery(QueryLayer layer, QueryableBuilderContext context)
- {
- ArgumentNullException.ThrowIfNull(layer);
-
- Prune(layer);
-
- var expression = base.ApplyQuery(layer, context);
- var text = expression.ToReadableString();
-
- if (text.StartsWith("[Microsoft.EntityFrameworkCore.Query.EntityQueryRootExpression]"))
- {
- logger.LogInformation("Expression (after prune): {Expression}", text);
- }
-
- return expression;
- }
-
- private void Prune(QueryLayer queryLayer)
- {
- if (queryLayer.Selection != null)
- {
- foreach (var resourceType in queryLayer.Selection.GetResourceTypes().ToArray())
- {
- var selectors = queryLayer.Selection.GetOrCreateSelectors(resourceType);
-
- foreach (var (field, subLayer) in selectors)
- {
- if (subLayer != null)
- {
- Prune(subLayer);
-
- if (IsDefault(subLayer))
- {
- selectors.Remove(field);
- }
- }
- }
- }
-
- if (queryLayer.Selection.IsEmpty)
- {
- queryLayer.Selection = null;
- }
- }
- }
-
- private bool IsDefault(QueryLayer queryLayer)
- {
- bool hasDefaultSort = queryLayer.Sort != null && queryLayer.Sort.ToString() == "id";
-
- bool hasDefaultPagination = queryLayer.Pagination != null &&
- Equals(queryLayer.Pagination.PageNumber, PageNumber.ValueOne) &&
- Equals(queryLayer.Pagination.PageSize, options.DefaultPageSize);
-
- var isDefault = queryLayer.Include == null && queryLayer.Filter == null &&
- (queryLayer.Sort == null || hasDefaultSort) &&
- (queryLayer.Pagination == null || hasDefaultPagination) && queryLayer.Selection == null;
-
- return isDefault;
- }
-}
\ No newline at end of file
diff --git a/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs b/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs
new file mode 100644
index 0000000..8e406ef
--- /dev/null
+++ b/JsonApiBugReport/ResourceDefinitions/UnitDefinition.cs
@@ -0,0 +1,19 @@
+#nullable enable
+using System;
+using JsonApiBugReport.Data;
+using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCore.Queries.Expressions;
+using JsonApiDotNetCore.Resources;
+
+namespace JsonApiBugReport.ResourceDefinitions;
+
+public sealed class UnitDefinition(IResourceGraph resourceGraph)
+ : JsonApiResourceDefinition(resourceGraph)
+{
+ private static readonly PaginationExpression NoPagination = new(PageNumber.ValueOne, null);
+
+ public override PaginationExpression OnApplyPagination(PaginationExpression? existingPagination)
+ {
+ return NoPagination;
+ }
+}
\ No newline at end of file
diff --git a/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs b/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs
new file mode 100644
index 0000000..79c5c10
--- /dev/null
+++ b/JsonApiBugReport/ResourceDefinitions/UnitGroupDefinition.cs
@@ -0,0 +1,19 @@
+using JsonApiBugReport.Data;
+using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCore.Queries.Expressions;
+using JsonApiDotNetCore.Resources;
+
+#nullable enable
+
+namespace JsonApiBugReport.ResourceDefinitions;
+
+public sealed class UnitGroupDefinition(IResourceGraph resourceGraph)
+ : JsonApiResourceDefinition(resourceGraph)
+{
+ private static readonly PaginationExpression NoPagination = new(PageNumber.ValueOne, null);
+
+ public override PaginationExpression OnApplyPagination(PaginationExpression? existingPagination)
+ {
+ return NoPagination;
+ }
+}
\ No newline at end of file