Skip to content

Commit

Permalink
Merge pull request #67 from MerifondNewMarkets/feature/bitwise-expres…
Browse files Browse the repository at this point in the history
…sions-AND-OR

Adding support for bitwise AND and OR expressions
  • Loading branch information
artiomchi authored Sep 17, 2019
2 parents 7ebc636 + a6fbbdf commit 218e54c
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@ Also supports injecting sql command generators to add support for other provider
<RepositoryUrl>https://github.com/artiomchi/FlexLabs.Upsert</RepositoryUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<PackageTags>Entity Framework Core entity-framework-core EF EntityFramework EntityFrameworkCore EFCore Upsert</PackageTags>
<VersionPrefix>2.2.0</VersionPrefix>
<VersionPrefix>2.2.1</VersionPrefix>
<PackageReleaseNotes>
v2.2.1:
+ Support for more expressions (Bitwise AND and bitwise OR)

v2.2.0:
+ Support for more expressions (AND and OR)
+ Support for default column values and expressions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ private static object GetValueInternal<TSource>(this Expression expression, Lamb
case ExpressionType.NotEqual:
case ExpressionType.AndAlso:
case ExpressionType.OrElse:
case ExpressionType.And:
case ExpressionType.Or:
{
var exp = (BinaryExpression)expression;
if (!nested)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,9 +219,11 @@ protected virtual string ExpandExpression(KnownExpression expression, Func<strin
switch (expression.ExpressionType)
{
case ExpressionType.Add:
case ExpressionType.And:
case ExpressionType.Divide:
case ExpressionType.Modulo:
case ExpressionType.Multiply:
case ExpressionType.Or:
case ExpressionType.Subtract:
case ExpressionType.LessThan:
case ExpressionType.LessThanOrEqual:
Expand Down Expand Up @@ -307,9 +309,11 @@ protected virtual string GetSimpleOperator(ExpressionType expressionType)
switch (expressionType)
{
case ExpressionType.Add: return "+";
case ExpressionType.And: return "&";
case ExpressionType.Divide: return "/";
case ExpressionType.Modulo: return "%";
case ExpressionType.Multiply: return "*";
case ExpressionType.Or: return "|";
case ExpressionType.Subtract: return "-";
case ExpressionType.LessThan: return "<";
case ExpressionType.LessThanOrEqual: return "<=";
Expand Down
80 changes: 80 additions & 0 deletions test/FlexLabs.EntityFrameworkCore.Upsert.Tests/EF/BasicTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -841,6 +841,86 @@ public void Upsert_PageVisit_Update_On_WhenMatched_ValueMultiply(TestDbContext.D
}
}

[Theory]
[MemberData(nameof(GetDatabaseEngines))]
public void Upsert_PageVisit_Update_On_WhenMatched_ValueBitwiseOr(TestDbContext.DbDriver driver)
{
ResetDb(driver);
using (var dbContext = new TestDbContext(_dataContexts[driver]))
{
var newVisit = new PageVisit
{
UserID = 1,
Date = DateTime.Today,
Visits = 1,
FirstVisit = _now,
LastVisit = _now,
};

dbContext.PageVisits.Upsert(newVisit)
.On(pv => new { pv.UserID, pv.Date })
.WhenMatched(pv => new PageVisit
{
Visits = pv.Visits | 3,
LastVisit = _now,
})
.Run();

Assert.Collection(dbContext.PageVisits.OrderBy(c => c.ID),
visit => AssertEqual(_dbVisitOld, visit),
visit =>
{
Assert.Equal(newVisit.UserID, visit.UserID);
Assert.Equal(newVisit.Date, visit.Date);
Assert.NotEqual(newVisit.Visits, visit.Visits);
Assert.Equal(_dbVisit.Visits | 3, visit.Visits);
Assert.NotEqual(newVisit.FirstVisit, visit.FirstVisit);
Assert.Equal(_dbVisit.FirstVisit, visit.FirstVisit);
Assert.Equal(newVisit.LastVisit, visit.LastVisit);
});
}
}

[Theory]
[MemberData(nameof(GetDatabaseEngines))]
public void Upsert_PageVisit_Update_On_WhenMatched_ValueBitwiseAnd(TestDbContext.DbDriver driver)
{
ResetDb(driver);
using (var dbContext = new TestDbContext(_dataContexts[driver]))
{
var newVisit = new PageVisit
{
UserID = 1,
Date = DateTime.Today,
Visits = 1,
FirstVisit = _now,
LastVisit = _now,
};

dbContext.PageVisits.Upsert(newVisit)
.On(pv => new { pv.UserID, pv.Date })
.WhenMatched(pv => new PageVisit
{
Visits = pv.Visits & 3,
LastVisit = _now,
})
.Run();

Assert.Collection(dbContext.PageVisits.OrderBy(c => c.ID),
visit => AssertEqual(_dbVisitOld, visit),
visit =>
{
Assert.Equal(newVisit.UserID, visit.UserID);
Assert.Equal(newVisit.Date, visit.Date);
Assert.NotEqual(newVisit.Visits, visit.Visits);
Assert.Equal(_dbVisit.Visits & 3, visit.Visits);
Assert.NotEqual(newVisit.FirstVisit, visit.FirstVisit);
Assert.Equal(_dbVisit.FirstVisit, visit.FirstVisit);
Assert.Equal(newVisit.LastVisit, visit.LastVisit);
});
}
}

[Theory]
[MemberData(nameof(GetDatabaseEngines))]
public void Upsert_PageVisit_Update_On_WhenMatched_ValueDivide(TestDbContext.DbDriver driver)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,38 @@ public void ExpressionHelpersTests_ValueModulo()
IsConstantValue(knownValue.Value2, 4);
}

[Fact]
public void ExpressionHelpersTests_ValueBitwiseOr()
{
Expression<Func<TestEntity, TestEntity>> exp = e => new TestEntity
{
Num1 = e.Num1 | 1,
};

var memberAssig = GetMemberExpression(exp);
var expValue = memberAssig.GetValue<TestEntity>(exp);

var knownValue = IsKnownExpression(expValue, ExpressionType.Or);
IsPropertyValue(knownValue.Value1, "Num1", true);
IsConstantValue(knownValue.Value2, 1);
}

[Fact]
public void ExpressionHelpersTests_ValueBitwiseAnd()
{
Expression<Func<TestEntity, TestEntity>> exp = e => new TestEntity
{
Num1 = e.Num1 & 1,
};

var memberAssig = GetMemberExpression(exp);
var expValue = memberAssig.GetValue<TestEntity>(exp);

var knownValue = IsKnownExpression(expValue, ExpressionType.And);
IsPropertyValue(knownValue.Value1, "Num1", true);
IsConstantValue(knownValue.Value2, 1);
}

[Fact]
public void ExpressionHelpersTests_Property()
{
Expand Down

0 comments on commit 218e54c

Please sign in to comment.