Skip to content

Commit d1dcdbc

Browse files
committed
Fixed Count() and Exists() in InMemoryAdapter
1 parent 5416c14 commit d1dcdbc

4 files changed

Lines changed: 59 additions & 9 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("0.11.4.1")]
23-
[assembly: AssemblyFileVersion("0.11.4.1")]
22+
[assembly: AssemblyVersion("0.12.0.1")]
23+
[assembly: AssemblyFileVersion("0.12.0.1")]
2424

Simple.Data.InMemoryTest/InMemoryTests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,38 @@ public void AutoIncrementShouldReturnNextIdInSequenceWhenOneRowExsists()
350350
Assert.AreEqual(2, newId);
351351
}
352352

353+
[Test]
354+
public void SelectCountShouldReturnCount()
355+
{
356+
Database.UseMockAdapter(new InMemoryAdapter());
357+
var db = Database.Open();
358+
db.Test.Insert(Id: 1, Name: "Alice");
359+
db.Test.Insert(Id: 2, Name: "Bob");
360+
361+
var count = db.Test.All().Count();
362+
Assert.AreEqual(2, count);
363+
}
364+
365+
[Test]
366+
public void SelectExistsShouldReturnTrueForAnyRows()
367+
{
368+
Database.UseMockAdapter(new InMemoryAdapter());
369+
var db = Database.Open();
370+
db.Test.Insert(Id: 1, Name: "Alice");
371+
db.Test.Insert(Id: 2, Name: "Bob");
372+
373+
Assert.IsTrue(db.Test.All().Exists());
374+
}
375+
376+
[Test]
377+
public void SelectExistsShouldReturnFalseForNoRows()
378+
{
379+
Database.UseMockAdapter(new InMemoryAdapter());
380+
var db = Database.Open();
381+
382+
Assert.IsFalse(db.Test.All().Exists());
383+
}
384+
353385
private static int ThreadTestHelper(int userId)
354386
{
355387
var mockAdapter = new InMemoryAdapter();

Simple.Data/QueryPolyfills/SelectClauseHandler.cs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ class SelectClauseHandler
1515
public SelectClauseHandler(SelectClause clause)
1616
{
1717
_references = clause.Columns.ToList();
18-
_resolvers = _references.Select(ValueResolver.Create).ToList();
19-
if (_resolvers.OfType<AggregateValueResolver>().Any())
18+
if (!(_references.Count == 1 && _references[0] is SpecialReference))
2019
{
21-
_groupingHandler =
22-
new GroupingHandler(
23-
_references.Where(ReferenceIsNotAggregateFunction).Select(r => r.GetAliasOrName()).ToArray());
20+
_resolvers = _references.Select(ValueResolver.Create).ToList();
21+
if (_resolvers.OfType<AggregateValueResolver>().Any())
22+
{
23+
_groupingHandler =
24+
new GroupingHandler(
25+
_references.Where(ReferenceIsNotAggregateFunction).Select(r => r.GetAliasOrName()).ToArray());
26+
}
2427
}
2528
}
2629

@@ -31,10 +34,24 @@ public IEnumerable<IDictionary<string,object>> Run(IEnumerable<IDictionary<strin
3134
var groupedSource = _groupingHandler.Group(source);
3235
return groupedSource.Select(Run);
3336
}
34-
else
37+
38+
if (_references.Count == 1)
3539
{
36-
return source.Select(Run);
40+
if (_references[0] is CountSpecialReference)
41+
{
42+
return new[] {new Dictionary<string, object> {{"", source.Count()}}};
43+
}
44+
45+
if (_references[0] is ExistsSpecialReference)
46+
{
47+
if (source.Any())
48+
{
49+
return new[] {new Dictionary<string, object> {{"", 1}}};
50+
}
51+
return Enumerable.Empty<IDictionary<string, object>>();
52+
}
3753
}
54+
return source.Select(Run);
3855
}
3956

4057
public IDictionary<string, object> Run(IGrouping<IDictionary<string, object>, IDictionary<string, object>> grouping)

Simple.Data/QueryPolyfills/ValueResolver.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static ValueResolver Create(SimpleReference reference)
1717
if (FunctionHandlers.Exists(functionReference.Name)) return new AggregateValueResolver(functionReference);
1818
return new FunctionValueResolver(functionReference);
1919
}
20+
2021
throw new InvalidOperationException("Unresolvable Reference type.");
2122
}
2223

0 commit comments

Comments
 (0)