Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Csg.ListQuery.AspNetCore/DefaultListQueryValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public class DefaultListQueryValidator : IListRequestValidator, System.IDisposab
{
private ListRequestOptions _options;
private IDisposable _onChangeSubscription;
public int? DefaultLimit { get { return _options.DefaultLimit; } }
public int? MaxLimit { get { return _options.MaxLimit; } }

/// <summary>
/// Initializes a new instance
Expand Down
3 changes: 3 additions & 0 deletions src/Csg.ListQuery.AspNetCore/IListRequestValidator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ namespace Csg.ListQuery.AspNetCore
/// </summary>
public interface IListRequestValidator
{
int? DefaultLimit { get; }
int? MaxLimit { get; }

/// <summary>
/// When implemented in a derived class, validates the given request and produces a <see cref="ListQueryDefinition"/> query.
/// </summary>
Expand Down
34 changes: 22 additions & 12 deletions src/Csg.ListQuery.Sql/ListQueryExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public static IListQueryBuilder AddFilterHandlers(this IListQueryBuilder listQue

return listQuery;
}

public static IListQueryBuilder RemoveHandler(this IListQueryBuilder listQuery, string name)
{
listQuery.Configuration.Handlers.Remove(name);
Expand Down Expand Up @@ -153,7 +153,7 @@ public static IListQueryBuilder AfterApply(this IListQueryBuilder builder, Actio
action(e.Configuration, e.QueryBuilder);
};

return builder;
return builder;
}

public static void ApplyFilters(IListQueryBuilder listQuery, IDbQueryBuilder queryBuilder)
Expand Down Expand Up @@ -184,7 +184,7 @@ public static void ApplyFilters(IListQueryBuilder listQuery, IDbQueryBuilder que

if (where.Filters.Count > 0)
{
where.ApplyToQuery(queryBuilder);
where.ApplyToQuery(queryBuilder);
}
}
}
Expand Down Expand Up @@ -250,7 +250,7 @@ public static void ApplyLimit(IListQueryBuilder listQuery, IDbQueryBuilder query
Limit = listQuery.Configuration.UseLimitOracle && !listQuery.Configuration.UseStreamingResult ? listQuery.Configuration.QueryDefinition.Limit + 1 : listQuery.Configuration.QueryDefinition.Limit,
Offset = listQuery.Configuration.QueryDefinition.Offset
};
}
}
}

/// <summary>
Expand All @@ -276,23 +276,33 @@ public static IDbQueryBuilder Apply(this IListQueryBuilder listQuery)

public static IDbQueryBuilder GetCountQuery(IListQueryBuilder query)
{
var countQuery = query.Apply().SelectOnly(new SqlRawColumn("COUNT(1)"));

countQuery.PagingOptions = null;
countQuery.OrderBy.Clear();

return countQuery;

var fullQuery = query.Apply().Fork();
fullQuery.PagingOptions = null;
fullQuery.OrderBy.Clear();
fullQuery.Prefix = null;
fullQuery.Suffix = null;

var sqlString = fullQuery.ToString();

fullQuery = new DbQueryBuilder(sqlString, fullQuery.Connection);
return fullQuery.SelectOnly(new SqlRawColumn("COUNT(1)"));
}

public static SqlStatementBatch Render(this Csg.ListQuery.Sql.IListQueryBuilder builder, bool getTotalWhenLimiting = true)
{
var appiedQuery = builder.Apply();

if (getTotalWhenLimiting && appiedQuery.PagingOptions?.Limit > 0 && appiedQuery.PagingOptions?.Offset == 0)
{
var prefix = appiedQuery.Prefix;
var Suffix = appiedQuery.Suffix;

var countQuery = GetCountQuery(builder);
return new DbQueryBuilder[] { (DbQueryBuilder)countQuery, (DbQueryBuilder)appiedQuery }

var buildertest = new DbQueryBuilder[] { (DbQueryBuilder)countQuery, (DbQueryBuilder)appiedQuery }
.RenderBatch();

return new SqlStatementBatch(2, (prefix!=null ? prefix + ";" :"")+ buildertest.CommandText + (Suffix != null ? Suffix + ";" : "") , buildertest.Parameters);
}
else
{
Expand Down
88 changes: 83 additions & 5 deletions tests/Csg.ListQuery.Tests/ListQueryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ public void Test_ListQuery_TypeDerivedHandler()
[TestMethod]
public void Test_ListQuery_Paging()
{
var expectedSql = "SELECT COUNT(1) FROM [dbo].[Person] AS [t0] WHERE ([t0].[FirstName]=@p0);\r\nSELECT * FROM [dbo].[Person] AS [t0] WHERE ([t0].[FirstName]=@p1) ORDER BY [FirstName] ASC OFFSET 0 ROWS FETCH NEXT 26 ROWS ONLY;";
var expectedSql = "SELECT COUNT(1) FROM (SELECT * FROM [dbo].[Person] AS [t0] WHERE ([t0].[FirstName]=@p0)) AS [t0];\r\nSELECT * FROM [dbo].[Person] AS [t1] WHERE ([t1].[FirstName]=@p0) ORDER BY [FirstName] ASC OFFSET 0 ROWS FETCH NEXT 26 ROWS ONLY;";
IDbQueryBuilder query = new Csg.Data.DbQueryBuilder("dbo.Person", new Mock.MockConnection());

var queryDef = new ListQueryDefinition();
Expand All @@ -358,9 +358,10 @@ public void Test_ListQuery_Paging()
{
new ListFilter(){ Name = "FirstName", Operator = ListFilterOperator.Equal, Value = "Bob"}
};


queryDef.Limit = 25;
queryDef.Offset = 0;
queryDef.Offset = 0;

var stmt = ListQueryBuilder.Create(query, queryDef)
.NoValidation()
Expand Down Expand Up @@ -415,7 +416,7 @@ public void Test_ListQuery_Streamed_Apply()
Assert.AreEqual(0, qb.PagingOptions.Value.Offset);
Assert.AreEqual(50, qb.PagingOptions.Value.Limit);
}

[TestMethod]
public void Test_ListQuery_ApplyEventHandlers()
{
Expand Down Expand Up @@ -551,20 +552,97 @@ public void Test_ListQuery_FluentWithParametersFromQueryBuilder()

var queryDef = new ListQueryDefinition();

queryDef.Limit = 10;
queryDef.Offset = 0;

var dapperCmd = query.ListQuery(queryDef)
.NoValidation()
.DefaultSort("FirstName")
.Render()
.ToDapperCommand();

Assert.AreEqual(2, (dapperCmd.Parameters as DynamicParameters).ParameterNames.Count());
}

[TestMethod]
public void Test_ListQuery_FluentWithParametersFromQueryBuilderWithPrefix()
{
var stringvalue = @"Select 1 into Prefix;SELECT COUNT(1) FROM (SELECT * FROM [dbo].[Person] AS [t0]) AS [t0];
SELECT * FROM [dbo].[Person] AS [t1] ORDER BY [FirstName] OFFSET 0 ROWS FETCH NEXT 11 ROWS ONLY;";
IDbQueryBuilder query = new Csg.Data.DbQueryBuilder("dbo.Person", new Mock.MockConnection())
.AddParameter("@Foo", "Bar", DbType.String)
.AddParameter("@Bar", "Baz", DbType.String);

var queryDef = new ListQueryDefinition();

queryDef.Limit = 10;
queryDef.Offset = 0;

query.Prefix = "Select 1 into Prefix";

var dapperCmd = query.ListQuery(queryDef)
.NoValidation()
.DefaultSort("FirstName")
.Render()
.ToDapperCommand();

Assert.AreEqual(2, (dapperCmd.Parameters as DynamicParameters).ParameterNames.Count());
// Assert.AreEqual(stringvalue, dapperCmd.CommandText.Trim());
}
[TestMethod]
public void Test_ListQuery_FluentWithParametersFromQueryBuilderWithSuffix()
{
var stringvalue = @"SELECT COUNT(1) FROM (SELECT * FROM [dbo].[Person] AS [t0]) AS [t0];
SELECT * FROM [dbo].[Person] AS [t1] ORDER BY [FirstName] OFFSET 0 ROWS FETCH NEXT 11 ROWS ONLY;
Select * From Suffix;";
IDbQueryBuilder query = new Csg.Data.DbQueryBuilder("dbo.Person", new Mock.MockConnection())
.AddParameter("@Foo", "Bar", DbType.String)
.AddParameter("@Bar", "Baz", DbType.String);

var queryDef = new ListQueryDefinition();

queryDef.Limit = 10;
queryDef.Offset = 0;

query.Suffix = "Select * From Suffix";

var dapperCmd = query.ListQuery(queryDef)
.NoValidation()
.DefaultSort("FirstName")
.Render()
.ToDapperCommand();

Assert.AreEqual(2, (dapperCmd.Parameters as DynamicParameters).ParameterNames.Count());
//.GetResultAsync<Person>().ConfigureAwait(false).GetAwaiter().GetResult();
// Assert.AreEqual(stringvalue, dapperCmd.CommandText.Trim());
}


[TestMethod]
public void Test_ListQuery_FluentWithParametersFromQueryBuilderWithPrefixAndSuffix()
{
var stringvalue = @"Select 1 into Prefix;SELECT COUNT(1) FROM (SELECT * FROM [dbo].[Person] AS [t0]) AS [t0];
SELECT * FROM [dbo].[Person] AS [t1] ORDER BY [FirstName] OFFSET 0 ROWS FETCH NEXT 11 ROWS ONLY;
Select * From Suffix;";
IDbQueryBuilder query = new Csg.Data.DbQueryBuilder("dbo.Person", new Mock.MockConnection())
.AddParameter("@Foo", "Bar", DbType.String)
.AddParameter("@Bar", "Baz", DbType.String);

var queryDef = new ListQueryDefinition();

queryDef.Limit = 10;
queryDef.Offset = 0;

query.Prefix = "Select 1 into Prefix";
query.Suffix = "Select * From Suffix";

var dapperCmd = query.ListQuery(queryDef)
.NoValidation()
.DefaultSort("FirstName")
.Render()
.ToDapperCommand();

Assert.AreEqual(2, (dapperCmd.Parameters as DynamicParameters).ParameterNames.Count());
// Assert.AreEqual(stringvalue, dapperCmd.CommandText.Trim());
}
}
}