Skip to content

Commit c9883fa

Browse files
committed
Add PutRequestBuilder
1 parent cfc9d0a commit c9883fa

17 files changed

+209
-215
lines changed

src/Dynatello/Builders/Compose.cs

-43
This file was deleted.

src/Dynatello/Builders/Extensions/UpdateRequestBuilder.cs src/Dynatello/Builders/Extensions.cs

+37-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22
using DynamoDBGenerator;
33
using Dynatello.Builders.Types;
44

5-
namespace Dynatello.Builders.Extensions;
5+
namespace Dynatello.Builders;
66

7-
public static class UpdateRequestBuilder
7+
public static class Extensions
88
{
9+
public static GetItemRequestBuilder GetRequestBuilder<T, TArg, TReferences, TArgumentReferences>(
10+
this TableAccess<T, TArg, TReferences, TArgumentReferences> source)
11+
where TReferences : IAttributeExpressionNameTracker
12+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
13+
{
14+
return new GetItemRequestBuilder(source.TableName, source.Item.PrimaryKeyMarshaller);
15+
}
16+
917
public static UpdateRequestBuilder<TArg> ToUpdateItemRequestBuilder<T, TArg, TReferences, TArgumentReferences>(
1018
this UpdateExpression<T, TArg, TReferences, TArgumentReferences> source,
1119
Func<IDynamoDBKeyMarshaller, TArg, Dictionary<string, AttributeValue>> keySelector
@@ -36,8 +44,33 @@ Func<IDynamoDBKeyMarshaller, TArg, Dictionary<string, AttributeValue>> keySelect
3644
);
3745
}
3846

39-
public static PutRequestBuilder<T> ToPutItemRequestBuilder()
47+
public static PutRequestBuilder<T> ToPutRequestBuilder<T, TReferences,
48+
TArgumentReferences>(
49+
this TableAccess<T, T, TReferences, TArgumentReferences> source
50+
)
51+
where TReferences : IAttributeExpressionNameTracker
52+
where TArgumentReferences : IAttributeExpressionValueTracker<T>
53+
{
54+
return new PutRequestBuilder<T>
55+
(
56+
null,
57+
source.Item.Marshall,
58+
source.TableName
59+
);
60+
}
61+
62+
public static PutRequestBuilder<T> ToPutRequestBuilder<T, TReferences,
63+
TArgumentReferences>(
64+
this ConditionExpression<T, T, TReferences, TArgumentReferences> source
65+
)
66+
where TReferences : IAttributeExpressionNameTracker
67+
where TArgumentReferences : IAttributeExpressionValueTracker<T>
4068
{
41-
69+
return new PutRequestBuilder<T>
70+
(
71+
source.TableAccess.Item.ComposeAttributeExpression(null, source.Condition),
72+
source.TableAccess.Item.Marshall,
73+
source.TableAccess.TableName
74+
);
4275
}
4376
}

src/Dynatello/Builders/Extensions/PutRequestBuilder.cs

-23
This file was deleted.

src/Dynatello/Builders/GetItemRequestBuilder.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ internal GetItemRequestBuilder(string tableName, IDynamoDBKeyMarshaller itemPrim
1818
ConsistentRead = false;
1919
ReturnConsumedCapacity = ReturnConsumedCapacity.NONE;
2020
}
21-
21+
2222
internal GetItemRequest Build()
2323
{
2424
return new GetItemRequest
2525
{
2626
ConsistentRead = ConsistentRead,
2727
ReturnConsumedCapacity = ReturnConsumedCapacity,
28-
TableName = TableName,
28+
TableName = TableName
2929
//Key = _keySelector(_keySelector);
3030
};
3131
}
32-
}
32+
}

src/Dynatello/Builders/PutRequestBuilder.cs

+30-44
Original file line numberDiff line numberDiff line change
@@ -5,81 +5,70 @@
55
namespace Dynatello.Builders;
66

77
/// <summary>
8-
/// A record based builder for creating <see cref="PutItemRequest"/> that can be configured via the `with` syntax.
8+
/// A record based builder for creating <see cref="PutItemRequest" /> that can be configured via the `with` syntax.
99
/// </summary>
10-
public readonly record struct PutRequestBuilder<T, TReferences, TArgumentReferences>
11-
where TReferences : IAttributeExpressionNameTracker
12-
where TArgumentReferences : IAttributeExpressionValueTracker<T>
10+
public readonly record struct PutRequestBuilder<T>
1311
{
14-
private readonly Func<TReferences> _ref;
15-
private readonly Func<TArgumentReferences> _argRef;
12+
private readonly Func<T, IAttributeExpression>? _attributeExpressionSelector;
1613
private readonly Func<T, Dictionary<string, AttributeValue>> _marshall;
14+
private readonly ReturnConsumedCapacity _returnConsumedCapacity = ReturnConsumedCapacity.NONE;
15+
private readonly ReturnItemCollectionMetrics _returnItemCollectionMetrics = ReturnItemCollectionMetrics.NONE;
16+
17+
private readonly ReturnValue _returnValues = ReturnValue.NONE;
18+
19+
private readonly ReturnValuesOnConditionCheckFailure _returnValuesOnConditionCheckFailure =
20+
ReturnValuesOnConditionCheckFailure.NONE;
21+
22+
private readonly string _tableName;
23+
24+
25+
internal PutRequestBuilder(
26+
Func<T, IAttributeExpression>? attributeExpressionSelector,
27+
Func<T, Dictionary<string, AttributeValue>> marshall,
28+
string tableName
29+
)
30+
{
31+
_attributeExpressionSelector = attributeExpressionSelector;
32+
_marshall = marshall;
33+
_tableName = tableName;
34+
}
1735

1836
/// <summary>
19-
///
2037
/// </summary>
2138
public string TableName
2239
{
2340
get => _tableName;
2441
init => _tableName = value ?? throw new ArgumentNullException(nameof(value));
2542
}
2643

27-
private readonly ReturnValue _returnValues = ReturnValue.NONE;
28-
private readonly ReturnConsumedCapacity _returnConsumedCapacity = ReturnConsumedCapacity.NONE;
29-
private readonly ReturnItemCollectionMetrics _returnItemCollectionMetrics = ReturnItemCollectionMetrics.NONE;
30-
31-
private readonly ReturnValuesOnConditionCheckFailure _returnValuesOnConditionCheckFailure =
32-
ReturnValuesOnConditionCheckFailure.NONE;
33-
34-
private readonly string _tableName;
35-
36-
/// <inheritdoc cref="PutItemRequest.ReturnValues"/>
44+
/// <inheritdoc cref="PutItemRequest.ReturnValues" />
3745
public ReturnValue ReturnValues
3846
{
3947
get => _returnValues;
4048
init => _returnValues = value ?? throw new ArgumentNullException(nameof(value));
4149
}
4250

43-
/// <inheritdoc cref="PutItemRequest.ReturnConsumedCapacity"/>
51+
/// <inheritdoc cref="PutItemRequest.ReturnConsumedCapacity" />
4452
public ReturnConsumedCapacity ReturnConsumedCapacity
4553
{
4654
get => _returnConsumedCapacity;
4755
init => _returnConsumedCapacity = value ?? throw new ArgumentNullException(nameof(value));
4856
}
4957

50-
/// <inheritdoc cref="PutItemRequest.ReturnItemCollectionMetrics"/>
58+
/// <inheritdoc cref="PutItemRequest.ReturnItemCollectionMetrics" />
5159
public ReturnItemCollectionMetrics ReturnItemCollectionMetrics
5260
{
5361
get => _returnItemCollectionMetrics;
5462
init => _returnItemCollectionMetrics = value ?? throw new ArgumentNullException(nameof(value));
5563
}
5664

57-
/// <inheritdoc cref="PutItemRequest.ReturnValuesOnConditionCheckFailure"/>
65+
/// <inheritdoc cref="PutItemRequest.ReturnValuesOnConditionCheckFailure" />
5866
public ReturnValuesOnConditionCheckFailure ReturnValuesOnConditionCheckFailure
5967
{
6068
get => _returnValuesOnConditionCheckFailure;
6169
init => _returnValuesOnConditionCheckFailure = value ?? throw new ArgumentNullException(nameof(value));
6270
}
6371

64-
/// <summary>
65-
/// A optional function to perform string interpolation in order to create the <see cref="UpdateItemRequest.ConditionExpression"/>.
66-
/// </summary>
67-
public Func<TReferences, TArgumentReferences, string>? Condition { get; init; }
68-
69-
public PutRequestBuilder(
70-
Func<TReferences> @ref,
71-
Func<TArgumentReferences> argRef,
72-
Func<T, Dictionary<string, AttributeValue>> marshall,
73-
string tableName
74-
)
75-
{
76-
_ref = @ref;
77-
_argRef = argRef;
78-
_marshall = marshall;
79-
_tableName = tableName;
80-
Condition = null;
81-
}
82-
8372

8473
public PutItemRequest Build(T element)
8574
{
@@ -98,12 +87,9 @@ public PutItemRequest Build(T element)
9887
ExpressionAttributeValues = null
9988
};
10089

101-
if (Condition is null) return request;
102-
90+
if (_attributeExpressionSelector is null) return request;
91+
var attributeExpression = _attributeExpressionSelector(element);
10392

104-
var attributeExpression =
105-
DynamoDBGenerator.Extensions.DynamoDBMarshallerExtensions.ToAttributeExpression(_ref, _argRef, element,
106-
Condition);
10793
request.ExpressionAttributeNames = attributeExpression.Names;
10894
request.ExpressionAttributeValues = attributeExpression.Values;
10995
request.ConditionExpression = attributeExpression.Expressions[0];

src/Dynatello/Builders/QueryRequestBuilder.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
namespace Dynatello.Builders;
55

6-
public class QueryRequestBuilder<TArg, TReferences, TArgumentReferences>
7-
where TReferences : IAttributeExpressionNameTracker
6+
public class QueryRequestBuilder<TArg, TReferences, TArgumentReferences>
7+
where TReferences : IAttributeExpressionNameTracker
88
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
99
{
10-
private readonly IDynamoDBKeyMarshaller _keyMarshaller;
1110
private readonly TArg _arg;
11+
private readonly IDynamoDBKeyMarshaller _keyMarshaller;
1212

1313
internal QueryRequestBuilder(IDynamoDBKeyMarshaller keyMarshaller, TArg arg)
1414
{
@@ -23,7 +23,7 @@ internal QueryRequest Build()
2323
AttributesToGet = null,
2424
QueryFilter = null,
2525
ConditionalOperator = null,
26-
KeyConditions = null,
26+
KeyConditions = null
2727
};
2828
}
2929
}

src/Dynatello/Builders/TableAccess.cs

-17
This file was deleted.

src/Dynatello/Builders/Types/ConditionExpression.cs

+9-3
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ public readonly record struct ConditionExpression<T, TArg, TReferences, TArgumen
66
where TReferences : IAttributeExpressionNameTracker
77
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
88
{
9-
internal readonly TableAccess<T, TArg, TReferences, TArgumentReferences> TableAccess;
109
internal readonly Func<TReferences, TArgumentReferences, string> Condition;
10+
internal readonly TableAccess<T, TArg, TReferences, TArgumentReferences> TableAccess;
11+
12+
[Obsolete("Do not use this constructor!", true)]
13+
public ConditionExpression()
14+
{
15+
throw new InvalidOperationException("This is an invalid constructor access.");
16+
}
1117

1218
internal ConditionExpression(
13-
TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
14-
Func<TReferences, TArgumentReferences, string> condition
19+
in TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
20+
in Func<TReferences, TArgumentReferences, string> condition
1521
)
1622
{
1723
TableAccess = tableAccess;

src/Dynatello/Builders/Types/ConditionalUpdateExpression.cs

+10-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ public readonly record struct ConditionalUpdateExpression<T, TArg, TReferences,
66
where TReferences : IAttributeExpressionNameTracker
77
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
88
{
9+
internal readonly Func<TReferences, TArgumentReferences, string> Condition;
910
internal readonly TableAccess<T, TArg, TReferences, TArgumentReferences> TableAccess;
1011
internal readonly Func<TReferences, TArgumentReferences, string> Update;
11-
internal readonly Func<TReferences, TArgumentReferences, string> Condition;
12+
13+
[Obsolete("Do not use this constructor!", true)]
14+
public ConditionalUpdateExpression()
15+
{
16+
throw new InvalidOperationException("This is an invalid constructor access.");
17+
}
1218

1319
internal ConditionalUpdateExpression(
14-
TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
15-
Func<TReferences, TArgumentReferences, string> update,
16-
Func<TReferences, TArgumentReferences, string> condition)
20+
in TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
21+
in Func<TReferences, TArgumentReferences, string> update,
22+
in Func<TReferences, TArgumentReferences, string> condition)
1723
{
1824
TableAccess = tableAccess;
1925
Update = update;

0 commit comments

Comments
 (0)