Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Simpleverse.Repository.Db.Test/SqlServer/DatabaseFixture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,16 @@ [Name] NVARCHAR(MAX) NULL,
[From] NVARCHAR(MAX) NULL
);");

connection.Execute(
$@"{DropTable("[IdentityDateOfBirth]")}
CREATE TABLE [IdentityDateOfBirth]
(
[Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] NVARCHAR(MAX) NULL,
[From] NVARCHAR(MAX) NULL,
[DateOfBirth] DATETIME NOT NULL
);");

connection.Execute(
$@"{DropTable("ExplicitKey")}
CREATE TABLE ExplicitKey(
Expand Down Expand Up @@ -135,6 +145,7 @@ public void TearDownDb()
{
connection.Open();
connection.Execute($@"{DropTable("[Identity]")}");
connection.Execute($@"{DropTable("[IdentityDateOfBirth]")}");
connection.Execute($@"{DropTable("[ExplicitKey]")}");
connection.Execute($@"{DropTable("[IdentityAndExplict]")}");
connection.Execute($@"{DropTable("[Computed]")}");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Dapper.Contrib.Extensions;
using Simpleverse.Repository.Db.Entity;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
Expand Down
71 changes: 65 additions & 6 deletions src/Simpleverse.Repository.Db.Test/SqlServer/Entity/EntityTest.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
using Dapper.Contrib.Extensions;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Threading.Tasks;
using System.Transactions;
using Dapper.Contrib.Extensions;
using Simpleverse.Repository.Db.Entity;
using Simpleverse.Repository.Db.Extensions;
using Simpleverse.Repository.Db.Extensions.Dapper;
using Simpleverse.Repository.Db.SqlServer;
using StackExchange.Profiling.Data;
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Transactions;
using Xunit;
using Xunit.Abstractions;

Expand Down Expand Up @@ -185,8 +187,35 @@ public async Task GetAsync_WhenProvidedSqlRepository_ReturnsRecord(int count)
}
}

[Fact]
public async Task GetAsync_WhenFilterContainsDateOfBirth_FiltersAsDateOnly()
{
{
using (var profiler = Profile())
using (var connection = _fixture.GetProfiledConnection())
{
// arange
connection.Open();
connection.Truncate<IdentityDateOfBirth>();
var dobRecord = TestData.IdentityDateOfBirthWithAllData(1).First();
connection.Insert(dobRecord);
var entity = new IdentityDateOfBirthEntity(_sqlRepository);

// act
await entity.AddAsync(dobRecord);
var filterDay = DateOnly.FromDateTime(dobRecord.DateOfBirth);
var returnedEntity = await entity.GetAsync(filter => filter.DateOfBirth = filterDay.ToDateTime(TimeOnly.MinValue));

// assert
Assert.NotNull(returnedEntity);
Assert.Equal(dobRecord.From, returnedEntity.From);
Assert.Equal(dobRecord.DateOfBirth, returnedEntity.DateOfBirth);
}
}
}

[Theory]
[InlineData(10)]
[InlineData(2)]
public async Task ListAsync_WhenProvidedSqlRepository_ReturnsRecords(int count)
{
using (var profiler = Profile())
Expand Down Expand Up @@ -303,4 +332,34 @@ public class IdentityQueryFilter
{
public virtual string Name { get; set; }
}

public class IdentityDateOfBirthEntity : Entity<IdentityDateOfBirth, DbQueryOptions>
{
public IdentityDateOfBirthEntity(DatabaseFixture fixture)
: base(new DbRepository(() => fixture.GetProfiledConnection()), new Table<IdentityDateOfBirth>("IDB"))
{
}

public IdentityDateOfBirthEntity(SqlRepository sqlRepository) : base(sqlRepository, new Table<IdentityDateOfBirth>("IDB")) { }

protected override void Filter(QueryBuilder<IdentityDateOfBirth> builder, IdentityDateOfBirth filter)
{
var dateOfBirthProperty = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == nameof(filter.DateOfBirth));
if (dateOfBirthProperty != null)
{
builder.Where($"CAST({Source.Column(x => x.DateOfBirth)} AS DATE) = CAST(@DateOfBirth AS DATE)", new { filter.DateOfBirth });
}

base.Filter(builder, filter);
}

protected override IEnumerable<string> GetFilterConditions(IdentityDateOfBirth filter)
{
var changed = base.GetFilterConditions(filter).ToList();

changed.Remove(nameof(IdentityDateOfBirth.DateOfBirth));

return changed;
}
}
}
10 changes: 10 additions & 0 deletions src/Simpleverse.Repository.Db.Test/TestData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Simpleverse.Repository.Db.Meta;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Simpleverse.Repository.Db.Test
{
Expand All @@ -28,6 +29,9 @@ public static IEnumerable<Identity> IdentityWithoutIdData(int count) =>
public static IEnumerable<Identity> IdentityWithIdData(int count) =>
Generate(x => new Identity() { Id = x, Name = x.ToString() }, count);

public static IEnumerable<IdentityDateOfBirth> IdentityDateOfBirthWithAllData(int count) =>
Generate(x => new IdentityDateOfBirth() { Id = x, Name = x.ToString(), DateOfBirth = DateTime.UtcNow }, count);

public static IEnumerable<ExplicitKey> ExplicitKeyData(int count) =>
Generate(x => new ExplicitKey() { Id = x, Name = x.ToString() }, count);

Expand Down Expand Up @@ -169,6 +173,12 @@ public class Immutable : Identity
public int ImmutableValue { get; set; }
}

[Table("[IdentityDateOfBirth]")]
public class IdentityDateOfBirth : Identity
{
public virtual DateTime DateOfBirth { get; set; }
}

public enum @Enum
{
Odd = 1,
Expand Down
9 changes: 4 additions & 5 deletions src/Simpleverse.Repository.Db/Entity/Entity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -583,11 +583,7 @@ protected TFilter GetFilter(Action<TFilter> filterSetup)

protected virtual void Filter(QueryBuilder<TModel> builder, TFilter filter)
{
var changeTrack = filter as IChangeTrack;
if (changeTrack == null)
return;

foreach (var propertyName in changeTrack.Changed)
foreach (var propertyName in GetFilterConditions(filter))
{
var property = builder.Table.Meta.Properties.SingleOrDefault(x => x.Name == propertyName);
if (property is null)
Expand Down Expand Up @@ -626,6 +622,9 @@ protected virtual void Filter(QueryBuilder<TModel> builder, TFilter filter)
}
}

protected virtual IEnumerable<string> GetFilterConditions(TFilter filter)
=> (filter as IChangeTrack)?.Changed ?? Array.Empty<string>();

protected virtual void Join(QueryBuilder<TModel> builder, TFilter filter) { }

protected void IfChanged<T, R>(T filter, Expression<Func<T, R>> expression, Action action)
Expand Down
Loading