You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
EntityFrameworkCore.Jet/test/EFCore.Jet.FunctionalTests/TPTTableSplittingJetTest.cs

242 lines
9.0 KiB
C#

// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Threading.Tasks;
using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.TestUtilities;
using Xunit.Abstractions;
namespace EntityFrameworkCore.Jet.FunctionalTests;
public class TPTTableSplittingJetTest(NonSharedFixture fixture, ITestOutputHelper testOutputHelper) : TPTTableSplittingTestBase(fixture, testOutputHelper)
{
protected override ITestStoreFactory TestStoreFactory
=> JetTestStoreFactory.Instance;
public override async Task Can_use_with_redundant_relationships()
{
await base.Can_use_with_redundant_relationships();
AssertSql(
"""
SELECT [v].[Name], [v].[SeatingCapacity], [c].[AttachedVehicleName], CASE
WHEN [c].[Name] IS NOT NULL THEN N'CompositeVehicle'
WHEN [p].[Name] IS NOT NULL THEN N'PoweredVehicle'
END AS [Discriminator], [t].[Name], [t].[Operator_Name], [t].[LicenseType], [t].[Discriminator], [t0].[Name], [t0].[Active], [t0].[Type], [t1].[Name], [t1].[Computed], [t1].[Description], [t1].[Discriminator], [t2].[VehicleName], [t2].[Capacity], [t2].[FuelType], [t2].[GrainGeometry], [t2].[Discriminator]
FROM [Vehicles] AS [v]
LEFT JOIN [PoweredVehicles] AS [p] ON [v].[Name] = [p].[Name]
LEFT JOIN [CompositeVehicles] AS [c] ON [v].[Name] = [c].[Name]
LEFT JOIN (
SELECT [v0].[Name], [v0].[Operator_Name], [l].[LicenseType], CASE
WHEN [l].[VehicleName] IS NOT NULL THEN N'LicensedOperator'
END AS [Discriminator]
FROM [Vehicles] AS [v0]
LEFT JOIN [LicensedOperators] AS [l] ON [v0].[Name] = [l].[VehicleName]
) AS [t] ON [v].[Name] = [t].[Name]
LEFT JOIN (
SELECT [v1].[Name], [v1].[Active], [v1].[Type]
FROM [Vehicles] AS [v1]
WHERE [v1].[Active] IS NOT NULL
) AS [t0] ON [t].[Name] = CASE
WHEN [t0].[Active] IS NOT NULL THEN [t0].[Name]
END
LEFT JOIN (
SELECT [p0].[Name], [p0].[Computed], [p0].[Description], CASE
WHEN [s].[VehicleName] IS NOT NULL THEN N'SolidRocket'
WHEN [i].[VehicleName] IS NOT NULL THEN N'IntermittentCombustionEngine'
WHEN [c1].[VehicleName] IS NOT NULL THEN N'ContinuousCombustionEngine'
END AS [Discriminator]
FROM [PoweredVehicles] AS [p0]
LEFT JOIN [ContinuousCombustionEngines] AS [c1] ON [p0].[Name] = [c1].[VehicleName]
LEFT JOIN [IntermittentCombustionEngines] AS [i] ON [p0].[Name] = [i].[VehicleName]
LEFT JOIN [SolidRockets] AS [s] ON [p0].[Name] = [s].[VehicleName]
WHERE [p0].[Computed] IS NOT NULL
) AS [t1] ON [v].[Name] = CASE
WHEN [t1].[Computed] IS NOT NULL THEN [t1].[Name]
END
LEFT JOIN (
SELECT [c2].[VehicleName], [c2].[Capacity], [c2].[FuelType], [s0].[GrainGeometry], CASE
WHEN [s0].[VehicleName] IS NOT NULL THEN N'SolidFuelTank'
END AS [Discriminator]
FROM [CombustionEngines] AS [c2]
LEFT JOIN [SolidFuelTanks] AS [s0] ON [c2].[VehicleName] = [s0].[VehicleName]
WHERE [c2].[Capacity] IS NOT NULL
) AS [t2] ON [t1].[Name] = CASE
WHEN [t2].[Capacity] IS NOT NULL THEN [t2].[VehicleName]
END
ORDER BY [v].[Name]
""");
}
public override async Task Can_query_shared()
{
await base.Can_query_shared();
AssertSql(
"""
SELECT [v].[Name], [v].[Operator_Name], [l].[LicenseType], CASE
WHEN [l].[VehicleName] IS NOT NULL THEN N'LicensedOperator'
END AS [Discriminator]
FROM [Vehicles] AS [v]
LEFT JOIN [LicensedOperators] AS [l] ON [v].[Name] = [l].[VehicleName]
""");
}
public override async Task Can_query_shared_nonhierarchy()
{
await base.Can_query_shared_nonhierarchy();
AssertSql(
"""
SELECT [v].[Name], [v].[Operator_Name]
FROM [Vehicles] AS [v]
""");
}
public override async Task Can_query_shared_nonhierarchy_with_nonshared_dependent()
{
await base.Can_query_shared_nonhierarchy_with_nonshared_dependent();
AssertSql(
"""
SELECT [v].[Name], [v].[Operator_Name]
FROM [Vehicles] AS [v]
""");
}
public override async Task Can_query_shared_derived_hierarchy()
{
await base.Can_query_shared_derived_hierarchy();
AssertSql(
"""
SELECT [c].[VehicleName], [c].[Capacity], [c].[FuelType], [s].[GrainGeometry], CASE
WHEN [s].[VehicleName] IS NOT NULL THEN N'SolidFuelTank'
END AS [Discriminator]
FROM [CombustionEngines] AS [c]
LEFT JOIN [SolidFuelTanks] AS [s] ON [c].[VehicleName] = [s].[VehicleName]
WHERE [c].[Capacity] IS NOT NULL
""");
}
public override async Task Can_query_shared_derived_nonhierarchy()
{
await base.Can_query_shared_derived_nonhierarchy();
AssertSql(
"""
SELECT [c].[VehicleName], [c].[Capacity], [c].[FuelType]
FROM [CombustionEngines] AS [c]
WHERE [c].[Capacity] IS NOT NULL
""");
}
public override async Task Can_query_shared_derived_nonhierarchy_all_required()
{
await base.Can_query_shared_derived_nonhierarchy_all_required();
AssertSql(
"""
SELECT [c].[VehicleName], [c].[Capacity], [c].[FuelType]
FROM [CombustionEngines] AS [c]
WHERE ([c].[Capacity] IS NOT NULL) AND ([c].[FuelType] IS NOT NULL)
""");
}
public override async Task Can_change_dependent_instance_non_derived()
{
await base.Can_change_dependent_instance_non_derived();
AssertSql(
$"""
@p0='Trek Pro Fit Madone 6 Series' (Nullable = false) (Size = 255)
@p1='Repair' (Size = 255)
INSERT INTO `LicensedOperators` (`VehicleName`, `LicenseType`)
VALUES ({AssertSqlHelper.Parameter("@p0")}, {AssertSqlHelper.Parameter("@p1")});
""",
//
$"""
@p0='repairman' (Size = 255)
@p1='Trek Pro Fit Madone 6 Series' (Nullable = false) (Size = 255)
UPDATE `Vehicles` SET `Operator_Name` = {AssertSqlHelper.Parameter("@p0")}
WHERE `Name` = {AssertSqlHelper.Parameter("@p1")};
SELECT @@ROWCOUNT;
""",
//
"""
SELECT TOP 2 `v`.`Name`, `v`.`SeatingCapacity`, `c`.`AttachedVehicleName`, IIF(`c`.`Name` IS NOT NULL, 'CompositeVehicle', IIF(`p`.`Name` IS NOT NULL, 'PoweredVehicle', NULL)) AS `Discriminator`, `s`.`Name`, `s`.`Operator_Name`, `s`.`LicenseType`, `s`.`Discriminator`
FROM ((`Vehicles` AS `v`
LEFT JOIN `PoweredVehicles` AS `p` ON `v`.`Name` = `p`.`Name`)
LEFT JOIN `CompositeVehicles` AS `c` ON `v`.`Name` = `c`.`Name`)
LEFT JOIN (
SELECT `v0`.`Name`, `v0`.`Operator_Name`, `l`.`LicenseType`, IIF(`l`.`VehicleName` IS NOT NULL, 'LicensedOperator', NULL) AS `Discriminator`
FROM `Vehicles` AS `v0`
LEFT JOIN `LicensedOperators` AS `l` ON `v0`.`Name` = `l`.`VehicleName`
) AS `s` ON `v`.`Name` = `s`.`Name`
WHERE `v`.`Name` = 'Trek Pro Fit Madone 6 Series'
""");
}
public override async Task Can_change_principal_instance_non_derived()
{
await base.Can_change_principal_instance_non_derived();
AssertSql(
$"""
@p0='2'
@p1='Trek Pro Fit Madone 6 Series' (Nullable = false) (Size = 255)
UPDATE `Vehicles` SET `SeatingCapacity` = {AssertSqlHelper.Parameter("@p0")}
WHERE `Name` = {AssertSqlHelper.Parameter("@p1")};
SELECT @@ROWCOUNT;
""",
//
"""
SELECT TOP 2 `v`.`Name`, `v`.`SeatingCapacity`, `c`.`AttachedVehicleName`, IIF(`c`.`Name` IS NOT NULL, 'CompositeVehicle', IIF(`p`.`Name` IS NOT NULL, 'PoweredVehicle', NULL)) AS `Discriminator`, `s`.`Name`, `s`.`Operator_Name`, `s`.`LicenseType`, `s`.`Discriminator`
FROM ((`Vehicles` AS `v`
LEFT JOIN `PoweredVehicles` AS `p` ON `v`.`Name` = `p`.`Name`)
LEFT JOIN `CompositeVehicles` AS `c` ON `v`.`Name` = `c`.`Name`)
LEFT JOIN (
SELECT `v0`.`Name`, `v0`.`Operator_Name`, `l`.`LicenseType`, IIF(`l`.`VehicleName` IS NOT NULL, 'LicensedOperator', NULL) AS `Discriminator`
FROM `Vehicles` AS `v0`
LEFT JOIN `LicensedOperators` AS `l` ON `v0`.`Name` = `l`.`VehicleName`
) AS `s` ON `v`.`Name` = `s`.`Name`
WHERE `v`.`Name` = 'Trek Pro Fit Madone 6 Series'
""");
}
public override async Task Optional_dependent_materialized_when_no_properties()
{
await base.Optional_dependent_materialized_when_no_properties();
AssertSql(
"""
SELECT TOP(1) [v].[Name], [v].[SeatingCapacity], [c].[AttachedVehicleName], CASE
WHEN [c].[Name] IS NOT NULL THEN N'CompositeVehicle'
WHEN [p].[Name] IS NOT NULL THEN N'PoweredVehicle'
END AS [Discriminator], [t].[Name], [t].[Operator_Name], [t].[LicenseType], [t].[Discriminator], [t0].[Name], [t0].[Active], [t0].[Type]
FROM [Vehicles] AS [v]
LEFT JOIN [PoweredVehicles] AS [p] ON [v].[Name] = [p].[Name]
LEFT JOIN [CompositeVehicles] AS [c] ON [v].[Name] = [c].[Name]
LEFT JOIN (
SELECT [v0].[Name], [v0].[Operator_Name], [l].[LicenseType], CASE
WHEN [l].[VehicleName] IS NOT NULL THEN N'LicensedOperator'
END AS [Discriminator]
FROM [Vehicles] AS [v0]
LEFT JOIN [LicensedOperators] AS [l] ON [v0].[Name] = [l].[VehicleName]
) AS [t] ON [v].[Name] = [t].[Name]
LEFT JOIN (
SELECT [v1].[Name], [v1].[Active], [v1].[Type]
FROM [Vehicles] AS [v1]
WHERE [v1].[Active] IS NOT NULL
) AS [t0] ON [t].[Name] = CASE
WHEN [t0].[Active] IS NOT NULL THEN [t0].[Name]
END
WHERE [v].[Name] = N'AIM-9M Sidewinder'
ORDER BY [v].[Name]
""");
}
}