Skip to content

Commit 38bf8f9

Browse files
author
Michel Bieleveld
committed
Reconsidered approach, now clean and now utilizes the standard helper.ReplaceAll
1 parent 154b1bc commit 38bf8f9

4 files changed

Lines changed: 22 additions & 37 deletions

File tree

QueryBuilder.Tests/DefineTest.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public void Test_Define_Where()
2828
[Fact]
2929
public void Test_Define_Parameter_Where()
3030
{
31+
// note parameters need to start with @ or any other standard parameter indicator for
32+
// the library running the query.
3133
var query = new Query("Products")
3234
.Define("@name", "Anto")
3335
.DefineParameter("@param", "param")

QueryBuilder/Compilers/Compiler.cs

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -64,51 +64,35 @@ protected Compiler()
6464

6565
};
6666

67-
protected Dictionary<string, object> generateNamedBindings(object[] bindings)
67+
protected (string Name,object Variable)[] generateNamedBindingsArray(object[] bindings)
6868
{
69-
return Helper.Flatten(bindings).Select((v, i) => new { i, v })
70-
.ToDictionary(x => parameterPrefix + x.i, x => x.v);
71-
}
72-
73-
protected Dictionary<string, string> generateNamedParameterMapping(Dictionary<string,object> namedBindings)
74-
{
75-
return namedBindings
76-
.Where(v => v.Value is NamedParameterVariable _)
77-
.ToDictionary(x => x.Key,
78-
x => ((NamedParameterVariable) x.Value).Variable);
79-
}
80-
81-
protected string remapNamedParameters(string sql, Dictionary<string, string> mapping)
82-
{
83-
if (mapping.Count == 0) return sql;
84-
var pattern = string.Join("|", mapping.Keys.Select(Regex.Escape));
85-
return Regex.Replace(sql, pattern, match => mapping[match.Value]);
69+
return Helper.Flatten(bindings).Select((v, i) =>
70+
{
71+
if (v is NamedParameterVariable param)
72+
{
73+
return (param.Variable, param.Value);
74+
}
75+
return (parameterPrefix + i, v);
76+
}).ToArray();
8677
}
8778

88-
protected Dictionary<string, object> cleanupNamedBindings(Dictionary<string, object> namedBindings)
79+
protected Dictionary<string, object> generateNamedBindings((string, object)[] bindings)
8980
{
90-
var result = new Dictionary<string, object>();
91-
92-
foreach (var (key, value) in namedBindings)
81+
var dictionary = new Dictionary<string, object>();
82+
foreach (var (name, variable) in bindings)
9383
{
94-
var actualKey = value is NamedParameterVariable k ? k.Variable : key;
95-
var actualValue = value is NamedParameterVariable v ? v.Value : value;
96-
97-
result.TryAdd(actualKey, actualValue);
84+
dictionary.TryAdd(name, variable);
9885
}
9986

100-
return result;
87+
return dictionary;
10188
}
10289

10390

10491
protected SqlResult PrepareResult(SqlResult ctx)
10592
{
106-
ctx.NamedBindings = generateNamedBindings(ctx.Bindings.ToArray());
107-
ctx.Sql = Helper.ReplaceAll(ctx.RawSql, parameterPlaceholder, EscapeCharacter, i => parameterPrefix + i);
108-
var mapping = generateNamedParameterMapping(ctx.NamedBindings);
109-
if (mapping.Count == 0) return ctx;
110-
ctx.NamedBindings = cleanupNamedBindings(ctx.NamedBindings);
111-
ctx.Sql = remapNamedParameters(ctx.Sql,mapping);
93+
var bindings = generateNamedBindingsArray(ctx.Bindings.ToArray());
94+
ctx.NamedBindings = generateNamedBindings(bindings);
95+
ctx.Sql = Helper.ReplaceAll(ctx.RawSql, parameterPlaceholder, EscapeCharacter, i => bindings[i].Name);
11296
return ctx;
11397
}
11498

QueryBuilder/Query.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ public Query IncludeMany(string relationName, Query query, string foreignKey = n
371371
/// <returns></returns>
372372
public Query Define(string variable, object value)
373373
{
374-
Variables.Add($"@{variable.TrimStart('@')}", value);
374+
Variables.Add(variable, value);
375375

376376
return this;
377377
}
@@ -384,8 +384,7 @@ public Query Define(string variable, object value)
384384
/// <returns></returns>
385385
public Query DefineParameter(string variable, object value)
386386
{
387-
var name = $"@{variable.TrimStart('@')}";
388-
Variables.Add(name, new NamedParameterVariable(name,value));
387+
Variables.Add(variable, new NamedParameterVariable(variable,value));
389388

390389
return this;
391390
}

QueryBuilder/Variable.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class Variable
66

77
public Variable(string name)
88
{
9-
this.Name = $"@{name.TrimStart('@')}";
9+
this.Name = name;
1010
}
1111

1212
}

0 commit comments

Comments
 (0)