Skip to content

Commit 9e66abb

Browse files
committed
Add QueryRequestBuilder
1 parent 71b19e9 commit 9e66abb

File tree

4 files changed

+158
-13
lines changed

4 files changed

+158
-13
lines changed

src/Dynatello/Builders/Extensions.cs

+33-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,33 @@ namespace Dynatello.Builders;
66

77
public static class Extensions
88
{
9+
public static QueryRequestBuilder<TArg> ToQueryRequestBuilder<T, TArg, TReferences, TArgumentReferences>(
10+
this KeyConditionedFilterExpression<T, TArg, TReferences, TArgumentReferences> source
11+
)
12+
where TReferences : IAttributeExpressionNameTracker
13+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
14+
{
15+
return new QueryRequestBuilder<TArg>(
16+
source.TableAccess.Item.ComposeAttributeExpression(source.Condition, source.Filter),
17+
source.TableAccess.TableName
18+
);
19+
}
20+
21+
public static QueryRequestBuilder<TArg> ToQueryRequestBuilder<T, TArg, TReferences, TArgumentReferences>(
22+
this KeyConditionExpression<T, TArg, TReferences, TArgumentReferences> source
23+
)
24+
where TReferences : IAttributeExpressionNameTracker
25+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
26+
{
27+
return new QueryRequestBuilder<TArg>(
28+
source.TableAccess.Item.ComposeAttributeExpression(source.Condition, null),
29+
source.TableAccess.TableName
30+
);
31+
}
32+
933
public static GetItemRequestBuilder GetRequestBuilder<T, TArg, TReferences, TArgumentReferences>(
1034
this TableAccess<T, TArg, TReferences, TArgumentReferences> source
11-
)
35+
)
1236
where TReferences : IAttributeExpressionNameTracker
1337
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
1438
{
@@ -45,6 +69,14 @@ Func<IDynamoDBKeyMarshaller, TArg, Dictionary<string, AttributeValue>> keySelect
4569
);
4670
}
4771

72+
public static KeyConditionExpression<T, TArg, TReferences, TArgumentReferences> WithKeyConditionExpression<T, TArg, TReferences, TArgumentReferences>(
73+
this TableAccess<T, TArg, TReferences, TArgumentReferences> source,
74+
Func<TReferences, TArgumentReferences, string> condition)
75+
where TReferences : IAttributeExpressionNameTracker
76+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
77+
{
78+
return new KeyConditionExpression<T, TArg, TReferences, TArgumentReferences>(source, condition);
79+
}
4880
public static PutRequestBuilder<T> ToPutRequestBuilder<T, TReferences,
4981
TArgumentReferences>(
5082
this TableAccess<T, T, TReferences, TArgumentReferences> source
+56-11
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,74 @@
1+
using Amazon.DynamoDBv2;
12
using Amazon.DynamoDBv2.Model;
23
using DynamoDBGenerator;
34

45
namespace Dynatello.Builders;
56

6-
public readonly record struct QueryRequestBuilder<TArg, TReferences, TArgumentReferences>
7-
where TReferences : IAttributeExpressionNameTracker
8-
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
7+
public readonly record struct QueryRequestBuilder<T>
98
{
10-
private readonly TArg _arg;
11-
private readonly IDynamoDBKeyMarshaller _keyMarshaller;
9+
private readonly Func<T, IAttributeExpression> _attributeExpressionSelector;
1210

13-
internal QueryRequestBuilder(IDynamoDBKeyMarshaller keyMarshaller, TArg arg)
11+
/// <inheritdoc cref="QueryRequest.TableName"/>
12+
public string TableName { get; init; }
13+
14+
/// <inheritdoc cref="QueryRequest.IndexName"/>
15+
public string? IndexName { get; init; }
16+
17+
/// <inheritdoc cref="QueryRequest.Limit"/>
18+
public int? Limit { get; init; }
19+
20+
/// <inheritdoc cref="QueryRequest.ConsistentRead"/>
21+
public bool ConsistentRead { get; init; }
22+
23+
/// <inheritdoc cref="QueryRequest.ScanIndexForward"/>
24+
public bool ScanIndexForward { get; init; }
25+
26+
/// <inheritdoc cref="QueryRequest.Select"/>
27+
public Select Select { get; init; }
28+
29+
/// <inheritdoc cref="QueryRequest.ReturnConsumedCapacity"/>
30+
public ReturnConsumedCapacity ReturnConsumedCapacity { get; init; }
31+
32+
public QueryRequestBuilder(Func<T, IAttributeExpression> attributeExpressionSelector, string tableName)
1433
{
15-
_keyMarshaller = keyMarshaller;
16-
_arg = arg;
34+
_attributeExpressionSelector = attributeExpressionSelector;
35+
TableName = tableName;
36+
IndexName = null;
37+
Limit = null;
38+
ConsistentRead = false;
39+
Select = Select.ALL_ATTRIBUTES;
40+
ReturnConsumedCapacity = ReturnConsumedCapacity.NONE;
41+
ScanIndexForward = true;
1742
}
1843

19-
internal QueryRequest Build()
44+
public QueryRequest Build(T arg)
2045
{
21-
return new QueryRequest
46+
var attributeExpression = _attributeExpressionSelector(arg);
47+
48+
var queryRequest = new QueryRequest
2249
{
2350
AttributesToGet = null,
2451
QueryFilter = null,
2552
ConditionalOperator = null,
26-
KeyConditions = null
53+
KeyConditions = null,
54+
KeyConditionExpression = attributeExpression.Expressions[0],
55+
ExpressionAttributeValues = attributeExpression.Values,
56+
ExpressionAttributeNames = attributeExpression.Names,
57+
TableName = TableName,
58+
IndexName = IndexName,
59+
ConsistentRead = ConsistentRead,
60+
Select = Select,
61+
ReturnConsumedCapacity = ReturnConsumedCapacity,
62+
ScanIndexForward = ScanIndexForward,
63+
ProjectionExpression = null
2764
};
65+
66+
if (Limit is { } limit)
67+
queryRequest.Limit = limit;
68+
69+
if (attributeExpression.Expressions.Count == 2)
70+
queryRequest.FilterExpression = attributeExpression.Expressions[1];
71+
72+
return queryRequest;
2873
}
2974
}

src/Dynatello/Builders/Types/Extensions.cs

+17-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@ namespace Dynatello.Builders.Types;
44

55
public static class Extensions
66
{
7+
public static KeyConditionedFilterExpression<T, TArg, TReferences, TArgumentReferences> WithFilterExpression<T,
8+
TArg, TReferences, TArgumentReferences>(
9+
this KeyConditionExpression<T, TArg, TReferences, TArgumentReferences> source,
10+
Func<TReferences, TArgumentReferences, string> filter
11+
)
12+
where TReferences : IAttributeExpressionNameTracker
13+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
14+
{
15+
return new KeyConditionedFilterExpression<T, TArg, TReferences, TArgumentReferences>(
16+
source.TableAccess,
17+
source.Condition,
18+
filter
19+
);
20+
}
21+
722
public static ConditionalUpdateExpression<T, TArg, TReferences, TArgumentReferences> WithConditionExpression<T,
823
TArg, TReferences, TArgumentReferences>(
924
this UpdateExpression<T, TArg, TReferences, TArgumentReferences> source,
@@ -29,7 +44,8 @@ Func<TReferences, TArgumentReferences, string> updateExpression
2944
return new UpdateExpression<T, TArg, TReferences, TArgumentReferences>(in source, in updateExpression);
3045
}
3146

32-
public static ConditionExpression<T, TArg, TReferences, TArgumentReferences> WithConditionExpression<T, TArg, TReferences,
47+
public static ConditionExpression<T, TArg, TReferences, TArgumentReferences> WithConditionExpression<T, TArg,
48+
TReferences,
3349
TArgumentReferences>(
3450
this TableAccess<T, TArg, TReferences, TArgumentReferences> source,
3551
Func<TReferences, TArgumentReferences, string> condition
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using DynamoDBGenerator;
2+
3+
namespace Dynatello.Builders.Types;
4+
5+
public readonly struct KeyConditionedFilterExpression<T, TArg, TReferences, TArgumentReferences>
6+
where TReferences : IAttributeExpressionNameTracker
7+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
8+
{
9+
internal readonly Func<TReferences, TArgumentReferences, string> Condition;
10+
internal readonly Func<TReferences, TArgumentReferences, string> Filter;
11+
internal readonly TableAccess<T, TArg, TReferences, TArgumentReferences> TableAccess;
12+
13+
[Obsolete("Do not use this constructor!", true)]
14+
public KeyConditionedFilterExpression()
15+
{
16+
throw new InvalidOperationException("This is an invalid constructor access.");
17+
}
18+
19+
internal KeyConditionedFilterExpression(
20+
in TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
21+
in Func<TReferences, TArgumentReferences, string> condition,
22+
in Func<TReferences, TArgumentReferences, string> filter
23+
)
24+
{
25+
TableAccess = tableAccess;
26+
Condition = condition;
27+
Filter = filter;
28+
}
29+
}
30+
31+
public readonly struct KeyConditionExpression<T, TArg, TReferences, TArgumentReferences>
32+
where TReferences : IAttributeExpressionNameTracker
33+
where TArgumentReferences : IAttributeExpressionValueTracker<TArg>
34+
{
35+
internal readonly Func<TReferences, TArgumentReferences, string> Condition;
36+
internal readonly TableAccess<T, TArg, TReferences, TArgumentReferences> TableAccess;
37+
38+
[Obsolete("Do not use this constructor!", true)]
39+
public KeyConditionExpression()
40+
{
41+
throw new InvalidOperationException("This is an invalid constructor access.");
42+
}
43+
44+
internal KeyConditionExpression(
45+
in TableAccess<T, TArg, TReferences, TArgumentReferences> tableAccess,
46+
in Func<TReferences, TArgumentReferences, string> condition
47+
)
48+
{
49+
TableAccess = tableAccess;
50+
Condition = condition;
51+
}
52+
}

0 commit comments

Comments
 (0)