Skip to content

Commit b9446ff

Browse files
committed
Added CountDistinct() method in queries
1 parent 365ba94 commit b9446ff

14 files changed

Lines changed: 64 additions & 45 deletions

File tree

CommonAssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@
1919
// COM, set the ComVisible attribute to true on that type.
2020
[assembly: ComVisible(false)]
2121

22-
[assembly: AssemblyVersion("1.0.0.4")]
23-
[assembly: AssemblyFileVersion("1.0.0.4")]
22+
[assembly: AssemblyVersion("0.16.0.0")]
23+
[assembly: AssemblyFileVersion("0.16.0.0")]
2424

Simple.Data.Ado/AdoAdapter.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,20 @@ public override IEnumerable<IEnumerable<IDictionary<string, object>>> RunQueries
165165

166166
public override bool IsExpressionFunction(string functionName, params object[] args)
167167
{
168-
return (functionName.Equals("like", StringComparison.OrdinalIgnoreCase) ||
169-
functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase))
170-
&& args.Length == 1
171-
&& args[0] is string;
168+
return FunctionIsLikeOrNotLike(functionName, args);
169+
}
170+
171+
private static bool FunctionIsLikeOrNotLike(string functionName, object[] args)
172+
{
173+
return ((functionName.Equals("like", StringComparison.OrdinalIgnoreCase)
174+
|| functionName.Equals("notlike", StringComparison.OrdinalIgnoreCase))
175+
&& args.Length == 1
176+
&& args[0] is string);
177+
}
178+
179+
private static bool FunctionIsCount(string functionName, object[] args)
180+
{
181+
return (functionName.Equals("count", StringComparison.OrdinalIgnoreCase) && args.Length == 0);
172182
}
173183

174184
public override IObservable<IDictionary<string, object>> RunQueryAsObservable(SimpleQuery query,

Simple.Data.Ado/AdoAdapterUpserter.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,19 @@ private IDictionary<string, object> Upsert(string tableName, IDictionary<string,
4545
var finder = _transaction == null
4646
? new AdoAdapterFinder(_adapter, connection)
4747
: new AdoAdapterFinder(_adapter, _transaction);
48-
if (finder.FindOne(tableName, criteria) != null)
48+
49+
var existing = finder.FindOne(tableName, criteria);
50+
if (existing != null)
4951
{
5052
// Don't update columns used as criteria
5153
var keys = criteria.GetOperandsOfType<ObjectReference>().Select(o => o.GetName().Homogenize());
52-
data = data.Where(kvp => keys.All(k => k != kvp.Key.Homogenize())).ToDictionary();
54+
var updateData = data.Where(kvp => keys.All(k => k != kvp.Key.Homogenize())).ToDictionary();
55+
if (updateData.Count == 0)
56+
{
57+
return existing;
58+
}
5359

54-
var commandBuilder = new UpdateHelper(_adapter.GetSchema()).GetUpdateCommand(tableName, data, criteria);
60+
var commandBuilder = new UpdateHelper(_adapter.GetSchema()).GetUpdateCommand(tableName, updateData, criteria);
5561
if (_transaction == null)
5662
{
5763
AdoAdapter.Execute(commandBuilder, connection);

Simple.Data.Ado/QueryBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ private void HandleHavingCriteria()
281281

282282
private void HandleGrouping()
283283
{
284-
if (_havingCriteria == SimpleExpression.Empty && !_columns.OfType<FunctionReference>().Any(fr => fr.IsAggregate)) return;
284+
if (_havingCriteria == SimpleExpression.Empty && !_columns.OfType<FunctionReference>().Any(f => f.IsAggregate)) return;
285285

286286
var groupColumns =
287287
GetColumnsToSelect(_table).Where(c => (!(c is FunctionReference)) || !((FunctionReference) c).IsAggregate).ToList();

Simple.Data.Ado/Simple.Data.Ado.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
33
<metadata>
44
<id>Simple.Data.Ado</id>
5-
<version>1.0.0-beta4</version>
5+
<version>0.16.0.0</version>
66
<authors>Mark Rendle</authors>
77
<owners>Mark Rendle</owners>
88
<description>ADO Adapter for the Simple.Data data access library.</description>
@@ -12,7 +12,7 @@
1212
<tags>sqlserver database data ado .net40</tags>
1313
<language>en-us</language>
1414
<dependencies>
15-
<dependency id="Simple.Data.Core" version="1.0.0-beta4" />
15+
<dependency id="Simple.Data.Core" version="0.16.0.0" />
1616
</dependencies>
1717
</metadata>
1818
</package>

Simple.Data.Ado/SimpleReferenceFormatter.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,24 @@ private string TryFormatAsFunctionReference(FunctionReference functionReference,
102102
if (ReferenceEquals(functionReference, null)) return null;
103103

104104
var sqlName = _functionNameConverter.ConvertToSqlName(functionReference.Name);
105-
if (excludeAlias || functionReference.GetAlias() == null)
105+
string formatted;
106+
107+
if (sqlName.Equals("countdistinct", StringComparison.OrdinalIgnoreCase))
108+
{
109+
formatted = string.Format("count(distinct {0})", FormatColumnClause(functionReference.Argument));
110+
}
111+
else
106112
{
107-
return string.Format("{0}({1}{2})", sqlName,
113+
formatted = string.Format("{0}({1}{2})", sqlName,
108114
FormatColumnClause(functionReference.Argument),
109115
FormatAdditionalArguments(functionReference.AdditionalArguments));
110116
}
111-
return string.Format("{0}({1}{2}) AS {3}", sqlName,
112-
FormatColumnClause(functionReference.Argument),
113-
FormatAdditionalArguments(functionReference.AdditionalArguments),
114-
_schema.QuoteObjectName(functionReference.GetAlias()));
117+
118+
if ((!excludeAlias) && functionReference.GetAlias() != null)
119+
{
120+
formatted = string.Format("{0} AS {1}", formatted, _schema.QuoteObjectName(functionReference.GetAlias()));
121+
}
122+
return formatted;
115123
}
116124

117125
private string FormatAdditionalArguments(IEnumerable<object> additionalArguments)

Simple.Data.Ado/UpdateHelper.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public UpdateHelper(DatabaseSchema schema)
2525
public ICommandBuilder GetUpdateCommand(string tableName, IDictionary<string, object> data, SimpleExpression criteria)
2626
{
2727
var table = _schema.FindTable(tableName);
28-
_commandBuilder.Append(GetUpdateClause(table, data));
28+
var updateClause = GetUpdateClause(table, data);
29+
if (string.IsNullOrWhiteSpace(updateClause)) throw new InvalidOperationException("No columns to update.");
30+
_commandBuilder.Append(updateClause);
2931

3032
if (criteria != null )
3133
{

Simple.Data.BehaviourTest/Query/FunctionTest.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,15 @@ public void GroupingAndOrderingOnFunction()
6363

6464
GeneratedSqlIs(expected);
6565
}
66+
67+
[Test]
68+
public void CountingOnColumn()
69+
{
70+
const string expected =
71+
@"select [dbo].[users].[name],count(distinct isnull([dbo].[users].[password],@p1)) as [c] from [dbo].[users] group by [dbo].[users].[name]";
72+
EatException<InvalidOperationException>(
73+
() => _db.Users.All().Select(_db.Users.Name, _db.Users.Password.IsNull("No Password").CountDistinct().As("c")).ToList());
74+
GeneratedSqlIs(expected);
75+
}
6676
}
6777
}

Simple.Data.Mocking/Simple.Data.Mocking.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
33
<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
44
<id>Simple.Data.Mocking</id>
5-
<version>1.0.0-beta4</version>
5+
<version>0.16.0.0</version>
66
<authors>Mark Rendle</authors>
77
<owners>Mark Rendle</owners>
88
<description>XML-based Mocking adapter for the Simple.Data data access library.</description>
@@ -12,7 +12,7 @@
1212
<tags>database data .net40</tags>
1313
<language>en-us</language>
1414
<dependencies>
15-
<dependency id="Simple.Data.Ado" version="1.0.0-beta4" />
15+
<dependency id="Simple.Data.Ado" version="0.16.0.0" />
1616
</dependencies>
1717
</metadata>
1818
</package>

Simple.Data.SqlCe40/Simple.Data.SqlCe40.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
33
<metadata xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
44
<id>Simple.Data.SqlCompact40</id>
5-
<version>1.0.0-beta4</version>
5+
<version>0.16.0.0</version>
66
<authors>Mark Rendle</authors>
77
<owners>Mark Rendle</owners>
88
<description>SQL Server Compact 4.0 ADO provider for the Simple.Data data access library.</description>
@@ -12,7 +12,7 @@
1212
<tags>sqlserver compact sqlce database data ado .net40</tags>
1313
<language>en-us</language>
1414
<dependencies>
15-
<dependency id="Simple.Data.Ado" version="1.0.0-beta4" />
15+
<dependency id="Simple.Data.Ado" version="0.16.0.0" />
1616
</dependencies>
1717
</metadata>
1818
</package>

0 commit comments

Comments
 (0)