Skip to content
This repository has been archived by the owner on Oct 8, 2020. It is now read-only.

Commit

Permalink
Added refactoring friendly NamedQueries.
Browse files Browse the repository at this point in the history
  • Loading branch information
danielwertheim committed Apr 14, 2012
1 parent fb3f7cf commit 41b4262
Show file tree
Hide file tree
Showing 15 changed files with 299 additions and 57 deletions.
16 changes: 11 additions & 5 deletions Source/Projects/SisoDb.Sql2008/Sql2008ProviderFactory.cs
Expand Up @@ -7,6 +7,7 @@
using SisoDb.DbSchema; using SisoDb.DbSchema;
using SisoDb.Querying; using SisoDb.Querying;
using SisoDb.Querying.Lambdas.Parsers; using SisoDb.Querying.Lambdas.Parsers;
using SisoDb.Querying.Sql;
using SisoDb.Sql2008.Dac; using SisoDb.Sql2008.Dac;
using SisoDb.Structures; using SisoDb.Structures;


Expand Down Expand Up @@ -104,11 +105,6 @@ public IIdentityStructureIdGenerator GetIdentityStructureIdGenerator(CheckOutAng
return new DbIdentityStructureIdGenerator(action); return new DbIdentityStructureIdGenerator(action);
} }


public virtual IDbQueryGenerator GetDbQueryGenerator()
{
return new Sql2008QueryGenerator(_sqlStatements);
}

public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas) public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas)
{ {
return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers()); return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers());
Expand All @@ -119,6 +115,16 @@ public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchem
return new QueryBuilder<T>(structureSchemas, new ExpressionParsers()); return new QueryBuilder<T>(structureSchemas, new ExpressionParsers());
} }


public virtual ISqlExpressionBuilder GetSqlExpressionBuilder()
{
return new SqlExpressionBuilder();
}

public virtual IDbQueryGenerator GetDbQueryGenerator()
{
return new Sql2008QueryGenerator(_sqlStatements, GetSqlExpressionBuilder());
}

public virtual INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class public virtual INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class
{ {
return new NamedQueryGenerator<T>(GetQueryBuilder<T>(structureSchemas), GetDbQueryGenerator(), new DbDataTypeTranslator()); return new NamedQueryGenerator<T>(GetQueryBuilder<T>(structureSchemas), GetDbQueryGenerator(), new DbDataTypeTranslator());
Expand Down
3 changes: 2 additions & 1 deletion Source/Projects/SisoDb.Sql2008/Sql2008QueryGenerator.cs
Expand Up @@ -9,7 +9,8 @@ namespace SisoDb.Sql2008
{ {
public class Sql2008QueryGenerator : DbQueryGenerator public class Sql2008QueryGenerator : DbQueryGenerator
{ {
public Sql2008QueryGenerator(ISqlStatements sqlStatements) : base(sqlStatements) {} public Sql2008QueryGenerator(ISqlStatements sqlStatements, ISqlExpressionBuilder sqlExpressionBuilder)
: base(sqlStatements, sqlExpressionBuilder) {}


protected override SqlQueryFormatter CreateSqlQueryFormatter(IQuery query, ISqlExpression sqlExpression) protected override SqlQueryFormatter CreateSqlQueryFormatter(IQuery query, ISqlExpression sqlExpression)
{ {
Expand Down
20 changes: 13 additions & 7 deletions Source/Projects/SisoDb.Sql2012/Sql2012ProviderFactory.cs
Expand Up @@ -7,6 +7,7 @@
using SisoDb.DbSchema; using SisoDb.DbSchema;
using SisoDb.Querying; using SisoDb.Querying;
using SisoDb.Querying.Lambdas.Parsers; using SisoDb.Querying.Lambdas.Parsers;
using SisoDb.Querying.Sql;
using SisoDb.Sql2012.Dac; using SisoDb.Sql2012.Dac;
using SisoDb.Structures; using SisoDb.Structures;


Expand Down Expand Up @@ -104,22 +105,27 @@ public virtual IIdentityStructureIdGenerator GetIdentityStructureIdGenerator(Che
return new DbIdentityStructureIdGenerator(action); return new DbIdentityStructureIdGenerator(action);
} }


public virtual IDbQueryGenerator GetDbQueryGenerator() public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas)
{ {
return new Sql2012QueryGenerator(_sqlStatements); return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers());
} }


public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas) public virtual IQueryBuilder<T> GetQueryBuilder<T>(IStructureSchemas structureSchemas) where T : class
{ {
return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers()); return new QueryBuilder<T>(structureSchemas, new ExpressionParsers());
} }


public virtual IQueryBuilder<T> GetQueryBuilder<T>(IStructureSchemas structureSchemas) where T : class public virtual ISqlExpressionBuilder GetSqlExpressionBuilder()
{ {
return new QueryBuilder<T>(structureSchemas, new ExpressionParsers()); return new SqlExpressionBuilder();
} }


public virtual INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class public virtual IDbQueryGenerator GetDbQueryGenerator()
{
return new Sql2012QueryGenerator(_sqlStatements, GetSqlExpressionBuilder());
}

public virtual INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class
{ {
return new NamedQueryGenerator<T>(GetQueryBuilder<T>(structureSchemas), GetDbQueryGenerator(), new DbDataTypeTranslator()); return new NamedQueryGenerator<T>(GetQueryBuilder<T>(structureSchemas), GetDbQueryGenerator(), new DbDataTypeTranslator());
} }
Expand Down
4 changes: 3 additions & 1 deletion Source/Projects/SisoDb.Sql2012/Sql2012QueryGenerator.cs
@@ -1,10 +1,12 @@
using SisoDb.Dac; using SisoDb.Dac;
using SisoDb.Querying; using SisoDb.Querying;
using SisoDb.Querying.Sql;


namespace SisoDb.Sql2012 namespace SisoDb.Sql2012
{ {
public class Sql2012QueryGenerator : DbQueryGenerator public class Sql2012QueryGenerator : DbQueryGenerator
{ {
public Sql2012QueryGenerator(ISqlStatements sqlStatements) : base(sqlStatements) {} public Sql2012QueryGenerator(ISqlStatements sqlStatements, ISqlExpressionBuilder sqlExpressionBuilder)
: base(sqlStatements, sqlExpressionBuilder) {}
} }
} }
18 changes: 12 additions & 6 deletions Source/Projects/SisoDb.SqlCe4/SqlCe4ProviderFactory.cs
Expand Up @@ -7,6 +7,7 @@
using SisoDb.DbSchema; using SisoDb.DbSchema;
using SisoDb.Querying; using SisoDb.Querying;
using SisoDb.Querying.Lambdas.Parsers; using SisoDb.Querying.Lambdas.Parsers;
using SisoDb.Querying.Sql;
using SisoDb.SqlCe4.Dac; using SisoDb.SqlCe4.Dac;
using SisoDb.Structures; using SisoDb.Structures;


Expand Down Expand Up @@ -104,12 +105,7 @@ public virtual IIdentityStructureIdGenerator GetIdentityStructureIdGenerator(Che
return new DbIdentityStructureIdGenerator(action); return new DbIdentityStructureIdGenerator(action);
} }


public virtual IDbQueryGenerator GetDbQueryGenerator() public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas)
{
return new SqlCe4QueryGenerator(_sqlStatements);
}

public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchemas structureSchemas)
{ {
return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers()); return new QueryBuilder(structureType, structureSchemas, new ExpressionParsers());
} }
Expand All @@ -119,6 +115,16 @@ public virtual IQueryBuilder GetQueryBuilder(Type structureType, IStructureSchem
return new QueryBuilder<T>(structureSchemas, new ExpressionParsers()); return new QueryBuilder<T>(structureSchemas, new ExpressionParsers());
} }


public virtual ISqlExpressionBuilder GetSqlExpressionBuilder()
{
return new SqlExpressionBuilder();
}

public virtual IDbQueryGenerator GetDbQueryGenerator()
{
return new SqlCe4QueryGenerator(_sqlStatements, GetSqlExpressionBuilder());
}

public INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class public INamedQueryGenerator<T> GetNamedQueryGenerator<T>(IStructureSchemas structureSchemas) where T : class
{ {
throw new NotSupportedException("SQL CE4 does not support Stored procedures."); throw new NotSupportedException("SQL CE4 does not support Stored procedures.");
Expand Down
3 changes: 2 additions & 1 deletion Source/Projects/SisoDb.SqlCe4/SqlCe4QueryGenerator.cs
Expand Up @@ -6,6 +6,7 @@ namespace SisoDb.SqlCe4
{ {
public class SqlCe4QueryGenerator : DbQueryGenerator public class SqlCe4QueryGenerator : DbQueryGenerator
{ {
public SqlCe4QueryGenerator(ISqlStatements sqlStatements) : base(sqlStatements) {} public SqlCe4QueryGenerator(ISqlStatements sqlStatements, ISqlExpressionBuilder sqlExpressionBuilder)
: base(sqlStatements, sqlExpressionBuilder) { }
} }
} }
80 changes: 70 additions & 10 deletions Source/Projects/SisoDb/DbSession.cs
Expand Up @@ -11,6 +11,7 @@
using SisoDb.Core; using SisoDb.Core;
using SisoDb.Dac; using SisoDb.Dac;
using SisoDb.Querying; using SisoDb.Querying;
using SisoDb.Querying.Sql;
using SisoDb.Resources; using SisoDb.Resources;


namespace SisoDb namespace SisoDb
Expand All @@ -20,6 +21,7 @@ public abstract class DbSession : ISession, IQueryEngine, IAdvanced
{ {
private readonly ISisoDatabase _db; private readonly ISisoDatabase _db;
protected readonly IDbQueryGenerator QueryGenerator; protected readonly IDbQueryGenerator QueryGenerator;
protected readonly ISqlExpressionBuilder SqlExpressionBuilder;
protected readonly ISqlStatements SqlStatements; protected readonly ISqlStatements SqlStatements;
protected ITransactionalDbClient TransactionalDbClient; protected ITransactionalDbClient TransactionalDbClient;
protected IDbClient NonTransactionalDbClient; protected IDbClient NonTransactionalDbClient;
Expand Down Expand Up @@ -47,6 +49,7 @@ protected DbSession(ISisoDatabase db)
_db = db; _db = db;
SqlStatements = Db.ProviderFactory.GetSqlStatements(); SqlStatements = Db.ProviderFactory.GetSqlStatements();
QueryGenerator = Db.ProviderFactory.GetDbQueryGenerator(); QueryGenerator = Db.ProviderFactory.GetDbQueryGenerator();
SqlExpressionBuilder = Db.ProviderFactory.GetSqlExpressionBuilder();


NonTransactionalDbClient = Db.ProviderFactory.GetNonTransactionalDbClient(Db.ConnectionInfo); NonTransactionalDbClient = Db.ProviderFactory.GetNonTransactionalDbClient(Db.ConnectionInfo);
TransactionalDbClient = Db.ProviderFactory.GetTransactionalDbClient(Db.ConnectionInfo); TransactionalDbClient = Db.ProviderFactory.GetTransactionalDbClient(Db.ConnectionInfo);
Expand Down Expand Up @@ -169,34 +172,91 @@ void IAdvanced.UpsertNamedQuery<T>(string name, Action<IQueryBuilder<T>> spec)
} }


IEnumerable<T> IAdvanced.NamedQuery<T>(INamedQuery query) IEnumerable<T> IAdvanced.NamedQuery<T>(INamedQuery query)
{
return Try(() => OnNamedQuery<T>(query));
}

IEnumerable<T> IAdvanced.NamedQuery<T>(string name, Expression<Func<T, bool>> predicate)
{ {
return Try(() => return Try(() =>
{ {
Ensure.That(query, "query").IsNotNull(); var queryBuilder = Db.ProviderFactory.GetQueryBuilder<T>(Db.StructureSchemas);
queryBuilder.Where(predicate);
var query = queryBuilder.Build();
var sqlExpression = SqlExpressionBuilder.Process(query);
var namedQuery = new NamedQuery(name);
namedQuery.Add(sqlExpression.WhereCriteria.Parameters);
OnUpsertStructureSchema<T>(); return OnNamedQuery<T>(namedQuery);
});
}

protected virtual IEnumerable<T> OnNamedQuery<T>(INamedQuery query) where T : class
{
Ensure.That(query, "query").IsNotNull();


var sourceData = TransactionalDbClient.YieldJsonBySp(query.Name, query.Parameters.ToArray()); OnUpsertStructureSchema<T>();


return Db.Serializer.DeserializeMany<T>(sourceData.ToArray()); var sourceData = TransactionalDbClient.YieldJsonBySp(query.Name, query.Parameters.ToArray());
});
return Db.Serializer.DeserializeMany<T>(sourceData.ToArray());
} }


IEnumerable<TOut> IAdvanced.NamedQueryAs<TContract, TOut>(INamedQuery query) IEnumerable<TOut> IAdvanced.NamedQueryAs<TContract, TOut>(INamedQuery query)
{
return Try(() => OnNamedQueryAs<TContract, TOut>(query));
}

IEnumerable<TOut> IAdvanced.NamedQueryAs<TContract, TOut>(string name, Expression<Func<TContract, bool>> predicate)
{ {
return Try(() => return Try(() =>
{ {
Ensure.That(query, "query").IsNotNull(); var queryBuilder = Db.ProviderFactory.GetQueryBuilder<TContract>(Db.StructureSchemas);
queryBuilder.Where(predicate);
OnUpsertStructureSchema<TContract>(); var query = queryBuilder.Build();
var sqlExpression = SqlExpressionBuilder.Process(query);
var sourceData = TransactionalDbClient.YieldJsonBySp(query.Name, query.Parameters.ToArray()); var namedQuery = new NamedQuery(name);
namedQuery.Add(sqlExpression.WhereCriteria.Parameters);
return Db.Serializer.DeserializeMany<TOut>(sourceData.ToArray()); return OnNamedQueryAs<TContract, TOut>(namedQuery);
}); });
} }


protected virtual IEnumerable<TOut> OnNamedQueryAs<TContract, TOut>(INamedQuery query) where TContract : class where TOut : class
{
Ensure.That(query, "query").IsNotNull();

OnUpsertStructureSchema<TContract>();

var sourceData = TransactionalDbClient.YieldJsonBySp(query.Name, query.Parameters.ToArray());

return Db.Serializer.DeserializeMany<TOut>(sourceData.ToArray());
}

IEnumerable<string> IAdvanced.NamedQueryAsJson<T>(INamedQuery query) IEnumerable<string> IAdvanced.NamedQueryAsJson<T>(INamedQuery query)
{
return Try(() => OnNamedQueryAsJson<T>(query));
}

IEnumerable<string> IAdvanced.NamedQueryAsJson<T>(string name, Expression<Func<T, bool>> predicate)
{
return Try(() =>
{
var queryBuilder = Db.ProviderFactory.GetQueryBuilder<T>(Db.StructureSchemas);
queryBuilder.Where(predicate);
var query = queryBuilder.Build();
var sqlExpression = SqlExpressionBuilder.Process(query);
var namedQuery = new NamedQuery(name);
namedQuery.Add(sqlExpression.WhereCriteria.Parameters);
return OnNamedQueryAsJson<T>(namedQuery);
});
}

protected virtual IEnumerable<string> OnNamedQueryAsJson<T>(INamedQuery query) where T : class
{ {
return Try(() => return Try(() =>
{ {
Expand Down
56 changes: 50 additions & 6 deletions Source/Projects/SisoDb/IAdvanced.cs
Expand Up @@ -37,7 +37,7 @@ public interface IAdvanced
void DeleteByQuery<T>(Expression<Func<T, bool>> predicate) where T : class; void DeleteByQuery<T>(Expression<Func<T, bool>> predicate) where T : class;


/// <summary> /// <summary>
/// Lets you invoke stored procedures that returns Json, /// Lets you invoke a stored procedures that returns Json,
/// which will get deserialized to <typeparamref name="T"/>. /// which will get deserialized to <typeparamref name="T"/>.
/// </summary> /// </summary>
/// <typeparam name="T"> /// <typeparam name="T">
Expand All @@ -48,7 +48,19 @@ public interface IAdvanced
IEnumerable<T> NamedQuery<T>(INamedQuery query) where T : class; IEnumerable<T> NamedQuery<T>(INamedQuery query) where T : class;


/// <summary> /// <summary>
/// Lets you invoke stored procedures that returns Json, /// Lets you invoke a stored procedures that returns Json,
/// which will get deserialized to <typeparamref name="T"/>.
/// </summary>
/// <typeparam name="T">
/// Structure type, used as a contract defining the scheme.</typeparam>
/// <param name="name">Name of the Stored procedure</param>
/// <param name="predicate">Used to populate the arguments of the underlying <see cref="INamedQuery"/>.</param>
/// <returns>Empty or populated IEnumerable of <typeparamref name="T"/>.</returns>
/// <remarks>Does not consume the cache provider.</remarks>
IEnumerable<T> NamedQuery<T>(string name, Expression<Func<T, bool>> predicate) where T : class;

/// <summary>
/// Lets you invoke a stored procedures that returns Json,
/// which will get deserialized to <typeparamref name="TOut"/>. /// which will get deserialized to <typeparamref name="TOut"/>.
/// </summary> /// </summary>
/// <typeparam name="TContract"> /// <typeparam name="TContract">
Expand All @@ -58,10 +70,28 @@ public interface IAdvanced
/// <param name="query"></param> /// <param name="query"></param>
/// <returns>Empty or populated IEnumerable of <typeparamref name="TOut"/>.</returns> /// <returns>Empty or populated IEnumerable of <typeparamref name="TOut"/>.</returns>
/// <remarks>Does not consume the cache provider.</remarks> /// <remarks>Does not consume the cache provider.</remarks>
IEnumerable<TOut> NamedQueryAs<TContract, TOut>(INamedQuery query) where TContract : class where TOut : class; IEnumerable<TOut> NamedQueryAs<TContract, TOut>(INamedQuery query)
where TContract : class
where TOut : class;

/// <summary>
/// Lets you invoke a stored procedures that returns Json,
/// which will get deserialized to <typeparamref name="TOut"/>.
/// </summary>
/// <typeparam name="TContract">
/// Structure type, used as a contract defining the scheme.</typeparam>
/// <typeparam name="TOut">
/// Determines the type you want your structure deserialized to and returned as.</typeparam>
/// <param name="name">Name of the Stored procedure</param>
/// <param name="predicate">Used to populate the arguments of the underlying <see cref="INamedQuery"/>.</param>
/// <returns>Empty or populated IEnumerable of <typeparamref name="TOut"/>.</returns>
/// <remarks>Does not consume the cache provider.</remarks>
IEnumerable<TOut> NamedQueryAs<TContract, TOut>(string name, Expression<Func<TContract, bool>> predicate)
where TContract : class
where TOut : class;


/// <summary> /// <summary>
/// Lets you invoke stored procedures that returns Json. /// Lets you invoke a stored procedures that returns Json.
/// This is the most effective return type, since the Json is stored in the database, /// This is the most effective return type, since the Json is stored in the database,
/// no deserialization will take place. /// no deserialization will take place.
/// </summary> /// </summary>
Expand All @@ -73,8 +103,22 @@ public interface IAdvanced
/// <remarks>Does not consume the cache provider.</remarks> /// <remarks>Does not consume the cache provider.</remarks>
IEnumerable<string> NamedQueryAsJson<T>(INamedQuery query) where T : class; IEnumerable<string> NamedQueryAsJson<T>(INamedQuery query) where T : class;


/// <summary>
/// Lets you invoke a stored procedures that returns Json.
/// This is the most effective return type, since the Json is stored in the database,
/// no deserialization will take place.
/// </summary>
/// <typeparam name="T">
/// Structure type, used as a contract defining the scheme.</typeparam>
/// <param name="name">Name of the Stored procedure</param>
/// <param name="predicate">Used to populate the arguments of the underlying <see cref="INamedQuery"/>.</param>
/// <returns>Json representation of structures (<typeparamref name="T"/>)
/// or empty IEnumerable of <see cref="string"/>.</returns>
/// <remarks>Does not consume the cache provider.</remarks>
IEnumerable<string> NamedQueryAsJson<T>(string name, Expression<Func<T, bool>> predicate) where T : class;

/// <summary> /// <summary>
/// Lets you invoke raw query, e.g using SQL, that returns Json, /// Lets you invoke a raw query, e.g using SQL, that returns Json,
/// which will get deserialized to <typeparamref name="T"/>. /// which will get deserialized to <typeparamref name="T"/>.
/// </summary> /// </summary>
/// <typeparam name="T"> /// <typeparam name="T">
Expand All @@ -85,7 +129,7 @@ public interface IAdvanced
IEnumerable<T> RawQuery<T>(IRawQuery query) where T : class; IEnumerable<T> RawQuery<T>(IRawQuery query) where T : class;


/// <summary> /// <summary>
/// Lets you invoke raw query, e.g using SQL, that returns Json, /// Lets you invoke a raw query, e.g using SQL, that returns Json,
/// which will get deserialized to <typeparamref name="TOut"/>. /// which will get deserialized to <typeparamref name="TOut"/>.
/// </summary> /// </summary>
/// <typeparam name="TContract"> /// <typeparam name="TContract">
Expand Down

0 comments on commit 41b4262

Please sign in to comment.