Skip to content

Commit

Permalink
Optimize First calls by using Limit 1
Browse files Browse the repository at this point in the history
First operator gets handled by Single call in MartenQueryExecutor as result should be one be then
  • Loading branch information
dpen2000 committed Nov 23, 2015
1 parent b9e82a3 commit 1f0c737
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
13 changes: 12 additions & 1 deletion src/Marten/Linq/DocumentQuery.cs
Expand Up @@ -92,7 +92,18 @@ private string appendLimit(string sql)
var take =
_query.ResultOperators.OfType<TakeResultOperator>().OrderByDescending(x => x.Count).FirstOrDefault();

return take == null ? sql : sql + " LIMIT " + take.Count + " ";
var first = _query.ResultOperators.OfType<FirstResultOperator>().FirstOrDefault();

string limitNumber = null;
if (take != null)
{
limitNumber = take.Count.ToString();
}
else if (first != null)
{
limitNumber = "1";
}
return limitNumber == null ? sql : sql + " LIMIT " + limitNumber + " ";
}

private string toOrderClause()
Expand Down
7 changes: 1 addition & 6 deletions src/Marten/Linq/MartenQueryExecutor.cs
Expand Up @@ -63,7 +63,6 @@ T IQueryExecutor.ExecuteScalar<T>(QueryModel queryModel)

T IQueryExecutor.ExecuteSingle<T>(QueryModel queryModel, bool returnDefaultWhenEmpty)
{
var isFirst = queryModel.ResultOperators.OfType<FirstResultOperator>().Any();
var isLast = queryModel.ResultOperators.OfType<LastResultOperator>().Any();

// TODO -- optimize by using Top 1
Expand All @@ -73,11 +72,7 @@ T IQueryExecutor.ExecuteSingle<T>(QueryModel queryModel, bool returnDefaultWhenE
if (returnDefaultWhenEmpty && all.Length == 0) return default(T);

string data = null;
if (isFirst)
{
data = all.First();
}
else if (isLast)
if (isLast)
{
data = all.Last();
}
Expand Down

0 comments on commit 1f0c737

Please sign in to comment.