// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.TestUtilities; using Xunit.Abstractions; namespace EntityFrameworkCore.Jet.FunctionalTests { public class TableSplittingJetTest : TableSplittingTestBase { public TableSplittingJetTest(ITestOutputHelper testOutputHelper) : base(testOutputHelper) { } protected override ITestStoreFactory TestStoreFactory => JetTestStoreFactory.Instance; public override void Can_use_with_redundant_relationships() { base.Can_use_with_redundant_relationships(); // TODO: [Name] shouldn't be selected multiple times and no joins are needed AssertSql( @"SELECT [v].[Name], [v].[Discriminator], [v].[SeatingCapacity], [t0].[Name], [t0].[Operator_Discriminator], [t0].[Operator_Name], [t0].[LicenseType], [t3].[Name], [t3].[Type], [t5].[Name], [t5].[Description], [t5].[Engine_Discriminator], [t9].[Name], [t9].[Capacity], [t9].[FuelTank_Discriminator], [t9].[FuelType], [t9].[GrainGeometry] FROM [Vehicles] AS [v] LEFT JOIN ( SELECT [v0].[Name], [v0].[Operator_Discriminator], [v0].[Operator_Name], [v0].[LicenseType], [t].[Name] AS [Name0] FROM [Vehicles] AS [v0] INNER JOIN ( SELECT [v1].[Name], [v1].[Discriminator], [v1].[SeatingCapacity] FROM [Vehicles] AS [v1] WHERE [v1].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ) AS [t] ON [v0].[Name] = [t].[Name] WHERE [v0].[Operator_Discriminator] IN ('Operator', 'LicensedOperator') ) AS [t0] ON [v].[Name] = [t0].[Name] LEFT JOIN ( SELECT [v2].[Name], [v2].[Type], [t2].[Name] AS [Name0], [t2].[Name0] AS [Name00] FROM [Vehicles] AS [v2] INNER JOIN ( SELECT [v3].[Name], [v3].[Operator_Discriminator], [v3].[Operator_Name], [v3].[LicenseType], [t1].[Name] AS [Name0] FROM [Vehicles] AS [v3] INNER JOIN ( SELECT [v4].[Name], [v4].[Discriminator], [v4].[SeatingCapacity] FROM [Vehicles] AS [v4] WHERE [v4].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ) AS [t1] ON [v3].[Name] = [t1].[Name] WHERE [v3].[Operator_Discriminator] IN ('Operator', 'LicensedOperator') ) AS [t2] ON [v2].[Name] = [t2].[Name] WHERE [v2].[Type] IS NOT NULL ) AS [t3] ON [t0].[Name] = [t3].[Name] LEFT JOIN ( SELECT [v5].[Name], [v5].[Description], [v5].[Engine_Discriminator], [t4].[Name] AS [Name0] FROM [Vehicles] AS [v5] INNER JOIN ( SELECT [v6].[Name], [v6].[Discriminator], [v6].[SeatingCapacity] FROM [Vehicles] AS [v6] WHERE [v6].[Discriminator] = 'PoweredVehicle' ) AS [t4] ON [v5].[Name] = [t4].[Name] WHERE [v5].[Engine_Discriminator] IN ('Engine', 'ContinuousCombustionEngine', 'IntermittentCombustionEngine', 'SolidRocket') ) AS [t5] ON [v].[Name] = [t5].[Name] LEFT JOIN ( SELECT [v7].[Name], [v7].[Capacity], [v7].[FuelTank_Discriminator], [v7].[FuelType], [v7].[GrainGeometry] FROM [Vehicles] AS [v7] INNER JOIN ( SELECT [v8].[Name], [v8].[Discriminator], [v8].[SeatingCapacity] FROM [Vehicles] AS [v8] WHERE [v8].[Discriminator] = 'PoweredVehicle' ) AS [t6] ON [v7].[Name] = [t6].[Name] WHERE [v7].[FuelTank_Discriminator] IN ('FuelTank', 'SolidFuelTank') UNION SELECT [v9].[Name], [v9].[Capacity], [v9].[FuelTank_Discriminator], [v9].[FuelType], [v9].[GrainGeometry] FROM [Vehicles] AS [v9] INNER JOIN ( SELECT [v10].[Name], [v10].[Description], [v10].[Engine_Discriminator], [t7].[Name] AS [Name0] FROM [Vehicles] AS [v10] INNER JOIN ( SELECT [v11].[Name], [v11].[Discriminator], [v11].[SeatingCapacity] FROM [Vehicles] AS [v11] WHERE [v11].[Discriminator] = 'PoweredVehicle' ) AS [t7] ON [v10].[Name] = [t7].[Name] WHERE [v10].[Engine_Discriminator] IN ('ContinuousCombustionEngine', 'IntermittentCombustionEngine', 'SolidRocket') ) AS [t8] ON [v9].[Name] = [t8].[Name] ) AS [t9] ON [t5].[Name] = [t9].[Name] WHERE [v].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ORDER BY [v].[Name]"); } public override void Can_query_shared() { base.Can_query_shared(); AssertSql( @"SELECT [v].[Name], [v].[Operator_Discriminator], [v].[Operator_Name], [v].[LicenseType] FROM [Vehicles] AS [v] INNER JOIN ( SELECT [v0].[Name], [v0].[Discriminator], [v0].[SeatingCapacity] FROM [Vehicles] AS [v0] WHERE [v0].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ) AS [t] ON [v].[Name] = [t].[Name] WHERE [v].[Operator_Discriminator] IN ('Operator', 'LicensedOperator')"); } public override void Can_query_shared_nonhierarchy() { base.Can_query_shared_nonhierarchy(); AssertSql( @"SELECT [t0].[Name], [t0].[Operator_Name] FROM ( SELECT [v].[Name], [v].[Operator_Name] FROM [Vehicles] AS [v] WHERE [v].[Operator_Name] IS NOT NULL UNION SELECT [v0].[Name], [v0].[Operator_Name] FROM [Vehicles] AS [v0] INNER JOIN ( SELECT [v1].[Name], [v1].[Type] FROM [Vehicles] AS [v1] WHERE [v1].[Type] IS NOT NULL ) AS [t] ON [v0].[Name] = [t].[Name] ) AS [t0] INNER JOIN ( SELECT [v2].[Name], [v2].[Discriminator], [v2].[SeatingCapacity] FROM [Vehicles] AS [v2] WHERE [v2].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ) AS [t1] ON [t0].[Name] = [t1].[Name]"); } public override void Can_query_shared_nonhierarchy_with_nonshared_dependent() { base.Can_query_shared_nonhierarchy_with_nonshared_dependent(); AssertSql( @"SELECT [t].[Name], [t].[Operator_Name] FROM ( SELECT [v].[Name], [v].[Operator_Name] FROM [Vehicles] AS [v] WHERE [v].[Operator_Name] IS NOT NULL UNION SELECT [v0].[Name], [v0].[Operator_Name] FROM [Vehicles] AS [v0] INNER JOIN [OperatorDetails] AS [o] ON [v0].[Name] = [o].[VehicleName] ) AS [t] INNER JOIN ( SELECT [v1].[Name], [v1].[Discriminator], [v1].[SeatingCapacity] FROM [Vehicles] AS [v1] WHERE [v1].[Discriminator] IN ('Vehicle', 'PoweredVehicle') ) AS [t0] ON [t].[Name] = [t0].[Name]"); } public override void Can_query_shared_derived_hierarchy() { base.Can_query_shared_derived_hierarchy(); AssertSql( @"SELECT [v].[Name], [v].[Capacity], [v].[FuelTank_Discriminator], [v].[FuelType], [v].[GrainGeometry] FROM [Vehicles] AS [v] INNER JOIN ( SELECT [v0].[Name], [v0].[Discriminator], [v0].[SeatingCapacity] FROM [Vehicles] AS [v0] WHERE [v0].[Discriminator] = 'PoweredVehicle' ) AS [t] ON [v].[Name] = [t].[Name] WHERE [v].[FuelTank_Discriminator] IN ('FuelTank', 'SolidFuelTank') UNION SELECT [v1].[Name], [v1].[Capacity], [v1].[FuelTank_Discriminator], [v1].[FuelType], [v1].[GrainGeometry] FROM [Vehicles] AS [v1] INNER JOIN ( SELECT [v2].[Name], [v2].[Description], [v2].[Engine_Discriminator], [t0].[Name] AS [Name0] FROM [Vehicles] AS [v2] INNER JOIN ( SELECT [v3].[Name], [v3].[Discriminator], [v3].[SeatingCapacity] FROM [Vehicles] AS [v3] WHERE [v3].[Discriminator] = 'PoweredVehicle' ) AS [t0] ON [v2].[Name] = [t0].[Name] WHERE [v2].[Engine_Discriminator] IN ('ContinuousCombustionEngine', 'IntermittentCombustionEngine', 'SolidRocket') ) AS [t1] ON [v1].[Name] = [t1].[Name]"); } public override void Can_query_shared_derived_nonhierarchy() { base.Can_query_shared_derived_nonhierarchy(); AssertSql( @"SELECT [v].[Name], [v].[Capacity], [v].[FuelType] FROM [Vehicles] AS [v] INNER JOIN ( SELECT [v0].[Name], [v0].[Discriminator], [v0].[SeatingCapacity] FROM [Vehicles] AS [v0] WHERE [v0].[Discriminator] = 'PoweredVehicle' ) AS [t] ON [v].[Name] = [t].[Name] WHERE [v].[FuelType] IS NOT NULL OR [v].[Capacity] IS NOT NULL UNION SELECT [v1].[Name], [v1].[Capacity], [v1].[FuelType] FROM [Vehicles] AS [v1] INNER JOIN ( SELECT [v2].[Name], [v2].[Description], [v2].[Engine_Discriminator], [t0].[Name] AS [Name0] FROM [Vehicles] AS [v2] INNER JOIN ( SELECT [v3].[Name], [v3].[Discriminator], [v3].[SeatingCapacity] FROM [Vehicles] AS [v3] WHERE [v3].[Discriminator] = 'PoweredVehicle' ) AS [t0] ON [v2].[Name] = [t0].[Name] WHERE [v2].[Engine_Discriminator] IN ('ContinuousCombustionEngine', 'IntermittentCombustionEngine', 'SolidRocket') ) AS [t1] ON [v1].[Name] = [t1].[Name]"); } public override void Can_query_shared_derived_nonhierarchy_all_required() { base.Can_query_shared_derived_nonhierarchy_all_required(); AssertSql( @"SELECT [v].[Name], [v].[Capacity], [v].[FuelType] FROM [Vehicles] AS [v] INNER JOIN ( SELECT [v0].[Name], [v0].[Discriminator], [v0].[SeatingCapacity] FROM [Vehicles] AS [v0] WHERE [v0].[Discriminator] = 'PoweredVehicle' ) AS [t] ON [v].[Name] = [t].[Name] WHERE [v].[FuelType] IS NOT NULL AND [v].[Capacity] IS NOT NULL UNION SELECT [v1].[Name], [v1].[Capacity], [v1].[FuelType] FROM [Vehicles] AS [v1] INNER JOIN ( SELECT [v2].[Name], [v2].[Description], [v2].[Engine_Discriminator], [t0].[Name] AS [Name0] FROM [Vehicles] AS [v2] INNER JOIN ( SELECT [v3].[Name], [v3].[Discriminator], [v3].[SeatingCapacity] FROM [Vehicles] AS [v3] WHERE [v3].[Discriminator] = 'PoweredVehicle' ) AS [t0] ON [v2].[Name] = [t0].[Name] WHERE [v2].[Engine_Discriminator] IN ('ContinuousCombustionEngine', 'IntermittentCombustionEngine', 'SolidRocket') ) AS [t1] ON [v1].[Name] = [t1].[Name]"); } public override void Can_change_dependent_instance_non_derived() { base.Can_change_dependent_instance_non_derived(); AssertSql( @"@p3='Trek Pro Fit Madone 6 Series' (Nullable = false) (Size = 450) @p0='LicensedOperator' (Nullable = false) (Size = 4000) @p1='repairman' (Size = 4000) @p2='Repair' (Size = 4000) SET NOCOUNT ON; UPDATE [Vehicles] SET [Operator_Discriminator] = @p0, [Operator_Name] = @p1, [LicenseType] = @p2 WHERE [Name] = @p3; SELECT @@ROWCOUNT;"); } public override void Can_change_principal_instance_non_derived() { base.Can_change_principal_instance_non_derived(); AssertSql( @"@p1='Trek Pro Fit Madone 6 Series' (Nullable = false) (Size = 450) @p0='2' SET NOCOUNT ON; UPDATE [Vehicles] SET [SeatingCapacity] = @p0 WHERE [Name] = @p1; SELECT @@ROWCOUNT;"); } } }