Skip to content

Commit b496a75

Browse files
authored
fix: Ignored Nested Computed properties as well (#139)
1 parent 2716a53 commit b496a75

File tree

9 files changed

+267
-28
lines changed

9 files changed

+267
-28
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<!-- Directory.Build.props -->
22
<Project>
33
<PropertyGroup>
4-
<Version>1.10.1</Version>
4+
<Version>1.10.2</Version>
55
</PropertyGroup>
66
</Project>
77

src/Dapper.DDD.Repository.MySql/MySqlQueryGenerator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public MySqlQueryGenerator(BaseAggregateConfiguration<TAggregate> configuration)
3333
var valueObjects = readConfiguration.GetValueObjects();
3434
foreach (var valueObject in valueObjects)
3535
{
36-
var valueObjectProperties = valueObject.GetFlattenedPropertiesOrdered(configuration);
36+
var valueObjectProperties = valueObject.GetFlattenedNonComputedPropertiesOrdered(configuration);
3737
properties.Remove(valueObject);
3838
properties.AddRange(valueObjectProperties);
3939
if (keys.Contains(valueObject))
@@ -143,11 +143,12 @@ public string GenerateUpsertQuery(TAggregate aggregate)
143143
}
144144

145145
#region Helpers
146+
146147
private string GenerateSetClause()
147148
{
148149
var primaryKeys = _keys;
149150
var propertiesToSet = _properties.Where(property =>
150-
!primaryKeys.Contains(property) && property.HasSetter );
151+
!primaryKeys.Contains(property) && property.HasSetter);
151152
return string.Join(", ", propertiesToSet.Select(property => $"{property.Name} = @{property.Name}"));
152153
}
153154

@@ -166,5 +167,6 @@ private static string GeneratePropertyClause(string tableName, ExtendedPropertyI
166167
{
167168
return $"{tableName}.{property.Name}";
168169
}
170+
169171
#endregion
170172
}

src/Dapper.DDD.Repository.PostGreSql/PostGreSqlQueryGenerator.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public PostGreSqlQueryGenerator(BaseAggregateConfiguration<TAggregate> configura
3535
var valueObjects = readConfiguration.GetValueObjects();
3636
foreach (var valueObject in valueObjects)
3737
{
38-
var valueObjectProperties = valueObject.GetFlattenedPropertiesOrdered(configuration);
38+
var valueObjectProperties = valueObject.GetFlattenedNonComputedPropertiesOrdered(configuration);
3939
properties.Remove(valueObject);
4040
properties.AddRange(valueObjectProperties);
4141
if (keys.Contains(valueObject))
@@ -55,7 +55,7 @@ public string GenerateDeleteQuery()
5555
{
5656
var whereClause = GenerateWhereClause();
5757

58-
var outputProperties = GeneratePropertyList(this._schemaAndEntity);
58+
var outputProperties = GeneratePropertyList(_schemaAndEntity);
5959
return $"DELETE FROM {_schemaAndEntity} WHERE {whereClause} RETURNING {outputProperties};";
6060
}
6161

@@ -70,22 +70,22 @@ public string GenerateInsertQuery(TAggregate aggregate)
7070
!property.HasDefaultValue(aggregate)))
7171
.ToList();
7272

73-
var outputProperties = GeneratePropertyList(this._schemaAndEntity);
73+
var outputProperties = GeneratePropertyList(_schemaAndEntity);
7474
return
7575
$"INSERT INTO {_schemaAndEntity} ({string.Join(", ", propertiesToInsert.Select(property => property.Name))}) VALUES ({string.Join(", ", propertiesToInsert.Select(property => $"@{property.Name}"))}) RETURNING {outputProperties};";
7676
}
7777

7878
public string GenerateGetAllQuery()
7979
{
80-
var propertyList = GeneratePropertyList(this._schemaAndEntity);
80+
var propertyList = GeneratePropertyList(_schemaAndEntity);
8181
return $"SELECT {propertyList} FROM {_schemaAndEntity};";
8282
}
8383

8484
public string GenerateGetQuery()
8585
{
8686
var whereClause = GenerateWhereClause();
8787

88-
var propertyList = GeneratePropertyList(this._schemaAndEntity);
88+
var propertyList = GeneratePropertyList(_schemaAndEntity);
8989

9090
return $"SELECT {propertyList} FROM {_schemaAndEntity} WHERE {whereClause};";
9191
}
@@ -100,7 +100,7 @@ public string GenerateUpdateQuery(TAggregate aggregate)
100100
$"GenerateUpdateQuery for aggregate of type {typeof(TAggregate).FullName} failed as the type has no properties with a setter.");
101101
}
102102

103-
var outputProperties = GeneratePropertyList(this._schemaAndEntity);
103+
var outputProperties = GeneratePropertyList(_schemaAndEntity);
104104

105105
return
106106
$"UPDATE {_schemaAndEntity} SET {setClause} WHERE {GenerateWhereClause()} RETURNING {outputProperties};";
@@ -119,15 +119,17 @@ public string GenerateUpsertQuery(TAggregate aggregate)
119119

120120
var setClause = GenerateSetClause();
121121
if (string.IsNullOrEmpty(setClause))
122+
{
122123
throw new InvalidOperationException("PostGreSql does not support Upsert on tables with no updatable columns.");
124+
}
123125

124126

125127
var returningIndex = insertQuery.IndexOf(" RETURNING ");
126128
insertQuery = insertQuery.Remove(returningIndex);
127129
var primaryKeys = string.Join(", ", _keys.Select(prop => prop.Name));
128130

129131
var conflictResolution = $"ON CONFLICT ({primaryKeys}) DO UPDATE";
130-
var outputProperties = GeneratePropertyList(this._schemaAndEntity);
132+
var outputProperties = GeneratePropertyList(_schemaAndEntity);
131133
var updateQuery = $"SET {setClause} WHERE {GenerateWhereClause()} RETURNING {outputProperties};";
132134

133135
return $"{insertQuery} {conflictResolution} {updateQuery}";
@@ -142,7 +144,7 @@ private string GenerateSetClause()
142144
{
143145
var primaryKeys = _keys;
144146
var propertiesToSet = _properties.Where(property =>
145-
!primaryKeys.Contains(property) && property.HasSetter );
147+
!primaryKeys.Contains(property) && property.HasSetter);
146148
var result = string.Join(", ",
147149
propertiesToSet.Select(property =>
148150
$"{property.Name} = @{property.Name}"));

src/Dapper.DDD.Repository.Sql/SqlQueryGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public SqlQueryGenerator(BaseAggregateConfiguration<TAggregate> configuration,
4545
var valueObjects = readConfiguration.GetValueObjects();
4646
foreach (var valueObject in valueObjects)
4747
{
48-
var valueObjectProperties = valueObject.GetFlattenedPropertiesOrdered(configuration);
48+
var valueObjectProperties = valueObject.GetFlattenedNonComputedPropertiesOrdered(configuration);
4949
properties.Remove(valueObject);
5050
properties.AddRange(valueObjectProperties);
5151
if (keys.Contains(valueObject))

src/Dapper.DDD.Repository/Reflection/ExtendedPropertyInfo.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,25 +66,30 @@ private static IOrderedEnumerable<ExtendedPropertyInfo> GetPropertiesOrdered(Typ
6666
.OrderBy(prop => prop.Name);
6767
}
6868

69-
public IReadOnlyExtendedPropertyInfoCollection GetFlattenedPropertiesOrdered<TAggregate>(
69+
public IReadOnlyExtendedPropertyInfoCollection GetFlattenedNonComputedPropertiesOrdered<TAggregate>(
7070
IReadAggregateConfiguration<TAggregate> configuration) where TAggregate : notnull
7171
{
72-
return new ExtendedPropertyInfoCollection(GetFlattenedPropertiesOrdered(Type, Name, configuration));
72+
return new ExtendedPropertyInfoCollection(GetFlattenedNonComputedPropertiesOrdered(Type, Name, configuration));
7373
}
7474

75-
private static IEnumerable<ExtendedPropertyInfo> GetFlattenedPropertiesOrdered<TAggregate>(Type type, string prefix,
75+
private static IEnumerable<ExtendedPropertyInfo> GetFlattenedNonComputedPropertiesOrdered<TAggregate>(Type type, string prefix,
7676
IReadAggregateConfiguration<TAggregate> configuration) where TAggregate : notnull
7777
{
7878
var properties = GetPropertiesOrdered(type, prefix);
7979
foreach (var prop in properties)
8080
{
81+
if (prop.IsComputed)
82+
{
83+
continue;
84+
}
85+
8186
if (prop.Type.IsSimpleOrBuiltIn(EmptyCollections.TypeSet) || configuration.HasTypeConverter(prop.Type) || configuration.TreatAsBuiltInType(prop.Type))
8287
{
8388
yield return prop;
8489
}
8590
else
8691
{
87-
foreach (var nestedProp in GetFlattenedPropertiesOrdered(prop.Type, prop.Name, configuration))
92+
foreach (var nestedProp in GetFlattenedNonComputedPropertiesOrdered(prop.Type, prop.Name, configuration))
8893
{
8994
yield return nestedProp;
9095
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace Dapper.DDD.Repository.UnitTests.Aggregates;
2+
3+
public class NestedComputedPropertyAggregate
4+
{
5+
public ValueObjectWithComputedProperty Value { get; set; } = default!;
6+
}
7+
8+
public record ValueObjectWithComputedProperty(int Value)
9+
{
10+
public string Description => Value.ToString();
11+
}

tests/Dapper.DDD.Repository.UnitTests/QueryGenerators/MySqlQueryGeneratorTests.cs

Lines changed: 79 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ public void Constructor_TableNameIsNull_Throws()
1515
var configuration = new TableAggregateConfiguration<SinglePrimaryKeyAggregate> { TableName = null! };
1616

1717
// Act && Assert
18-
var ex = Assert.Throws<ArgumentNullException>(
19-
() => new MySqlQueryGenerator<SinglePrimaryKeyAggregate>(configuration));
18+
var ex = Assert.Throws<ArgumentNullException>(() => new MySqlQueryGenerator<SinglePrimaryKeyAggregate>(configuration));
2019

2120
Assert.Equal("Value cannot be null. (Parameter 'readConfiguration.EntityName')", ex.Message);
2221
}
@@ -178,6 +177,19 @@ public void GenerateGetAllQuery_ProperTableName_Valid()
178177
Assert.Equal("SELECT Users.Id, Users.Username, Users.Password FROM Users;", selectQuery);
179178
}
180179

180+
[Fact]
181+
public void GenerateGetAllQuery_NestedComputedProperty_DoesNotContainComputedProperty()
182+
{
183+
// Arrange
184+
var generator = CreateNestedComputedPropertyQueryGenerator();
185+
186+
// Act
187+
var query = generator.GenerateGetAllQuery();
188+
189+
// Assert
190+
Assert.DoesNotContain(nameof(ValueObjectWithComputedProperty.Description), query);
191+
}
192+
181193
#endregion
182194

183195
#region Get
@@ -253,6 +265,19 @@ public void GenerateGetQuery_CompositePrimaryKey_Valid()
253265
selectQuery);
254266
}
255267

268+
[Fact]
269+
public void GenerateGetQuery_NestedComputedProperty_DoesNotContainComputedProperty()
270+
{
271+
// Arrange
272+
var generator = CreateNestedComputedPropertyQueryGenerator();
273+
274+
// Act
275+
var query = generator.GenerateGetQuery();
276+
277+
// Assert
278+
Assert.DoesNotContain(nameof(ValueObjectWithComputedProperty.Description), query);
279+
}
280+
256281
#endregion
257282

258283
#region Insert
@@ -415,6 +440,19 @@ public void GenerateInsertQuery_CompositePrimaryKey_Valid()
415440
insertQuery);
416441
}
417442

443+
[Fact]
444+
public void GenerateInsertQuery_NestedComputedProperty_DoesNotContainComputedProperty()
445+
{
446+
// Arrange
447+
var generator = CreateNestedComputedPropertyQueryGenerator();
448+
449+
// Act
450+
var query = generator.GenerateInsertQuery(new NestedComputedPropertyAggregate());
451+
452+
// Assert
453+
Assert.DoesNotContain(nameof(ValueObjectWithComputedProperty.Description), query);
454+
}
455+
418456
#endregion
419457

420458
#region Update
@@ -527,6 +565,19 @@ public void GenerateUpdateQuery_PropertyHasNoSetter_PropertyIsExcluded()
527565
query);
528566
}
529567

568+
[Fact]
569+
public void GenerateUpdateQuery_NestedComputedProperty_DoesNotContainComputedProperty()
570+
{
571+
// Arrange
572+
var generator = CreateNestedComputedPropertyQueryGenerator();
573+
574+
// Act
575+
var query = generator.GenerateUpdateQuery(new NestedComputedPropertyAggregate());
576+
577+
// Assert
578+
Assert.DoesNotContain(nameof(ValueObjectWithComputedProperty.Description), query);
579+
}
580+
530581
#endregion
531582

532583
#region Upsert
@@ -593,12 +644,24 @@ public void GenerateUpsertQuery_HasNoUpdatableColumns_Valid()
593644
query);
594645
}
595646

647+
[Fact]
648+
public void GenerateUpsertQuery_NestedComputedProperty_DoesNotContainComputedProperty()
649+
{
650+
// Arrange
651+
var generator = CreateNestedComputedPropertyQueryGenerator();
652+
653+
// Act
654+
var query = generator.GenerateUpsertQuery(new NestedComputedPropertyAggregate());
655+
656+
// Assert
657+
Assert.DoesNotContain(nameof(ValueObjectWithComputedProperty.Description), query);
658+
}
659+
596660
#endregion
597661

598662
#region Constructors
599663

600-
private static MySqlQueryGenerator<HasDefaultConstraintAggregate>
601-
CreateHasDefaultConstraintAggregateQueryGenerator()
664+
private static MySqlQueryGenerator<HasDefaultConstraintAggregate> CreateHasDefaultConstraintAggregateQueryGenerator()
602665
{
603666
var configuration = new TableAggregateConfiguration<HasDefaultConstraintAggregate> { TableName = "Users" };
604667
configuration.HasKey(aggregate => aggregate.Id);
@@ -616,8 +679,7 @@ private static MySqlQueryGenerator<SinglePrimaryKeyAggregate> CreateSinglePrimar
616679
return generator;
617680
}
618681

619-
private static MySqlQueryGenerator<CompositePrimaryKeyAggregate>
620-
CreateCompositePrimaryKeyAggregateQueryGenerator()
682+
private static MySqlQueryGenerator<CompositePrimaryKeyAggregate> CreateCompositePrimaryKeyAggregateQueryGenerator()
621683
{
622684
var configuration = new TableAggregateConfiguration<CompositePrimaryKeyAggregate> { TableName = "Users" };
623685
configuration.HasKey(aggregate => new { aggregate.Username, aggregate.Password });
@@ -641,8 +703,7 @@ private static MySqlQueryGenerator<AggregateWithValueObjectId> CreateAggregateWi
641703
return generator;
642704
}
643705

644-
private static MySqlQueryGenerator<AggregateWithNestedValueObject>
645-
CreateAggregateWithNestedValueObjectGenerator()
706+
private static MySqlQueryGenerator<AggregateWithNestedValueObject> CreateAggregateWithNestedValueObjectGenerator()
646707
{
647708
var defaultConfig = new DefaultConfiguration();
648709
var config = new TableAggregateConfiguration<AggregateWithNestedValueObject> { TableName = "Users" };
@@ -652,5 +713,15 @@ private static MySqlQueryGenerator<AggregateWithNestedValueObject>
652713
return generator;
653714
}
654715

716+
private static MySqlQueryGenerator<NestedComputedPropertyAggregate> CreateNestedComputedPropertyQueryGenerator()
717+
{
718+
var configuration = new TableAggregateConfiguration<NestedComputedPropertyAggregate>
719+
{
720+
TableName = "Users"
721+
};
722+
var generator = new MySqlQueryGenerator<NestedComputedPropertyAggregate>(configuration);
723+
return generator;
724+
}
725+
655726
#endregion
656727
}

0 commit comments

Comments
 (0)