• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

loresoft / FluentCommand / 6648415992

26 Oct 2023 01:49AM UTC coverage: 51.645% (+0.1%) from 51.515%
6648415992

push

github

pwelter34
Update InsertBuilder.cs

981 of 2442 branches covered (0.0%)

Branch coverage included in aggregate %.

2896 of 5065 relevant lines covered (57.18%)

156.37 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

70.97
/src/FluentCommand/Query/StatementBuilder.cs
1
using System.Runtime.CompilerServices;
2

3
using FluentCommand.Extensions;
4
using FluentCommand.Query.Generators;
5

6
namespace FluentCommand.Query;
7

8
/// <summary>
9
/// Query statement builder
10
/// </summary>
11
public class StatementBuilder : StatementBuilder<StatementBuilder>
12
{
13
    /// <summary>
14
    /// Initializes a new instance of the <see cref="StatementBuilder"/> class.
15
    /// </summary>
16
    /// <param name="queryGenerator">The query generator.</param>
17
    /// <param name="parameters">The query parameters.</param>
18
    public StatementBuilder(IQueryGenerator queryGenerator, List<QueryParameter> parameters)
19
        : base(queryGenerator, parameters)
3✔
20
    {
21
    }
3✔
22

23
    /// <summary>
24
    /// Gets or sets the query sql statement.
25
    /// </summary>
26
    /// <value>
27
    /// The query sql statement.
28
    /// </value>
29
    protected string Statement { get; set; }
30

31
    /// <summary>
32
    /// Sets the query statement.
33
    /// </summary>
34
    /// <param name="queryStatement">The query statement.</param>
35
    /// <returns>
36
    /// The same builder so that multiple calls can be chained.
37
    /// </returns>
38
    public StatementBuilder Query(string queryStatement)
39
    {
40
        Statement = queryStatement;
3✔
41
        return this;
3✔
42
    }
43

44
    /// <summary>
45
    /// Adds a query parameter the specified name and value.
46
    /// </summary>
47
    /// <typeparam name="TValue">The type of the value.</typeparam>
48
    /// <param name="name">The parameter name.</param>
49
    /// <param name="value">The parameter value.</param>
50
    /// <returns>
51
    /// The same builder so that multiple calls can be chained.
52
    /// </returns>
53
    public StatementBuilder Parameter<TValue>(string name, TValue value)
54
    {
55
        var queryParam = new QueryParameter(name, value, typeof(TValue));
2✔
56
        Parameters.Add(queryParam);
2✔
57

58
        return this;
2✔
59
    }
60

61
    /// <inheritdoc />
62
    public override QueryStatement BuildStatement()
63
    {
64
        return new QueryStatement(Statement, Parameters);
3✔
65
    }
66
}
67

68
/// <summary>
69
/// Base class for query statement 
70
/// </summary>
71
/// <typeparam name="TBuilder">The type of the builder.</typeparam>
72
public abstract class StatementBuilder<TBuilder> : IStatementBuilder, IQueryBuilder
73
    where TBuilder : StatementBuilder<TBuilder>
74
{
75
    /// <summary>
76
    /// Initializes a new instance of the <see cref="StatementBuilder{TBuilder}"/> class.
77
    /// </summary>
78
    /// <param name="queryGenerator">The query generator.</param>
79
    /// <param name="parameters">The query parameters.</param>
80
    /// <exception cref="System.ArgumentNullException">queryGenerator or parameters is null</exception>
81
    protected StatementBuilder(IQueryGenerator queryGenerator, List<QueryParameter> parameters)
82
    {
83
        QueryGenerator = queryGenerator ?? throw new ArgumentNullException(nameof(queryGenerator));
96!
84
        Parameters = parameters ?? throw new ArgumentNullException(nameof(parameters));
96!
85
    }
96✔
86

87

88
    /// <summary>
89
    /// Gets the query generator.
90
    /// </summary>
91
    /// <value>
92
    /// The query generator.
93
    /// </value>
94
    protected IQueryGenerator QueryGenerator { get; }
95

96
    /// <summary>
97
    /// Gets the query parameters.
98
    /// </summary>
99
    /// <value>
100
    /// The query parameters.
101
    /// </value>
102
    protected List<QueryParameter> Parameters { get; }
103

104
    /// <summary>
105
    /// Gets or sets the query comment expressions.
106
    /// </summary>
107
    /// <value>
108
    /// The query comment expressions.
109
    /// </value>
110
    protected List<string> CommentExpressions { get; set; } = new();
96✔
111

112

113
    /// <summary>
114
    /// Tags the query with specified comment, caller name, file and line number.
115
    /// </summary>
116
    /// <param name="comment">The query comment.</param>
117
    /// <param name="memberName">The caller member name.</param>
118
    /// <param name="sourceFilePath">The caller source file path.</param>
119
    /// <param name="sourceLineNumber">The caller source line number.</param>
120
    /// <returns></returns>
121
    public TBuilder Tag(
122
        string comment = "Caller",
123
        [CallerMemberName] string memberName = "",
124
        [CallerFilePath] string sourceFilePath = "",
125
        [CallerLineNumber] int sourceLineNumber = 0)
126
    {
127
        // augment comment with source file and line number
128
        var fileName = Path.GetFileName(sourceFilePath);
36✔
129

130
        var commentMember = $"{comment}; {memberName}() in {fileName}:line {sourceLineNumber}";
36✔
131
        var commentExpression = QueryGenerator.CommentExpression(commentMember);
36✔
132

133
        CommentExpressions.Add(commentExpression);
36✔
134

135
        return (TBuilder)this;
36✔
136
    }
137

138
    /// <summary>
139
    /// Adds the specified comment to the query.
140
    /// </summary>
141
    /// <param name="comment">The query comment.</param>
142
    /// <returns>
143
    /// The same builder so that multiple calls can be chained.
144
    /// </returns>
145
    public TBuilder Comment(string comment)
146
    {
147
        if (comment.IsNullOrWhiteSpace())
×
148
            return (TBuilder)this;
×
149

150
        var commentExpression = QueryGenerator.CommentExpression(comment);
×
151

152
        CommentExpressions.Add(commentExpression);
×
153

154
        return (TBuilder)this;
×
155
    }
156

157

158
    /// <inheritdoc />
159
    public abstract QueryStatement BuildStatement();
160

161
    /// <summary>
162
    /// Gets the next unique parameter name.
163
    /// </summary>
164
    /// <returns>The next unique parameter name</returns>
165
    protected string NextParameter() => $"@p{Parameters.Count:0000}";
232✔
166

167

168
    /// <inheritdoc />
169
    IQueryGenerator IQueryBuilder.QueryGenerator => QueryGenerator;
3✔
170

171
    /// <inheritdoc />
172
    List<QueryParameter> IQueryBuilder.Parameters => Parameters;
3✔
173
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc