Add project files.

This commit is contained in:
David Lebee 2018-10-17 18:30:55 -05:00
parent d906a5e7d4
commit d2d28a9a45
17 changed files with 358 additions and 0 deletions

37
DynamicQuery.sln Normal file
View File

@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28010.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicQuery.Core", "PoweredSoft.DynamicQuery.Core\PoweredSoft.DynamicQuery.Core.csproj", "{E614658D-6852-4405-B5BE-3695C3E96B13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicQuery", "PoweredSoft.DynamicQuery\PoweredSoft.DynamicQuery.csproj", "{A9F74387-6B09-423A-96BC-F8FF345193EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PoweredSoft.DynamicQuery.Cli", "PoweredSoft.DynamicQuery.Cli\PoweredSoft.DynamicQuery.Cli.csproj", "{7FC0F790-A8B9-4335-8D72-09797DEB0359}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E614658D-6852-4405-B5BE-3695C3E96B13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E614658D-6852-4405-B5BE-3695C3E96B13}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E614658D-6852-4405-B5BE-3695C3E96B13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E614658D-6852-4405-B5BE-3695C3E96B13}.Release|Any CPU.Build.0 = Release|Any CPU
{A9F74387-6B09-423A-96BC-F8FF345193EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9F74387-6B09-423A-96BC-F8FF345193EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9F74387-6B09-423A-96BC-F8FF345193EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9F74387-6B09-423A-96BC-F8FF345193EE}.Release|Any CPU.Build.0 = Release|Any CPU
{7FC0F790-A8B9-4335-8D72-09797DEB0359}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7FC0F790-A8B9-4335-8D72-09797DEB0359}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7FC0F790-A8B9-4335-8D72-09797DEB0359}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7FC0F790-A8B9-4335-8D72-09797DEB0359}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3770CB3C-28E4-4C15-A537-4DA38CFBA4F3}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\PoweredSoft.DynamicQuery.Core\PoweredSoft.DynamicQuery.Core.csproj" />
<ProjectReference Include="..\PoweredSoft.DynamicQuery\PoweredSoft.DynamicQuery.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,47 @@
using PoweredSoft.DynamicQuery.Core;
using System;
using System.Collections.Generic;
using System.Linq;
namespace PoweredSoft.DynamicQuery.Cli
{
public class PersonQueryInterceptor : IBeforeQueryAlteredInterceptor<Person>
{
public IQueryable<Person> InterceptQueryBeforeAltered(IQueryCriteria criteria, IQueryable<Person> queryable) => queryable.Where(t => t.FirstName == "David");
}
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Program
{
static void Main(string[] args)
{
Play1();
}
private static void Play1()
{
var list = new List<Person>()
{
new Person{ Id = 1, FirstName = "David", LastName = "Lebee "},
new Person{ Id = 2, FirstName = "Michaela", LastName = "Lebee "},
new Person{ Id = 3, FirstName = "Zohra", LastName = "Lebee "},
new Person{ Id = 4, FirstName = "Eric", LastName = "Vickar "},
new Person{ Id = 5, FirstName = "Susan", LastName = "Vickar "},
};
var queryable = list.AsQueryable();
var qb = new QueryBuilder();
qb.AddInterceptor(new PersonQueryInterceptor());
qb.Execute(queryable, null);
}
}
}

View File

@ -0,0 +1,11 @@
namespace PoweredSoft.DynamicQuery.Core
{
public enum AggregateType
{
Count,
Sum,
Avg,
Max,
Min
}
}

View File

@ -0,0 +1,11 @@
namespace PoweredSoft.DynamicQuery.Core
{
public enum FilterType
{
Equals,
Contains,
StartsWith,
EndsWith,
Composite
}
}

View File

@ -0,0 +1,8 @@
namespace PoweredSoft.DynamicQuery.Core
{
public interface IAggregate
{
string Path { get; set; }
AggregateType Type { get; set; }
}
}

View File

@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace PoweredSoft.DynamicQuery.Core
{
public interface ICompositeFilter : IFilter
{
List<IFilter> Filters { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace PoweredSoft.DynamicQuery.Core
{
public interface IFilter
{
bool? And { get; set; }
FilterType Type { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace PoweredSoft.DynamicQuery.Core
{
public interface IGroup
{
string Path { get; set; }
bool? Ascending { get; set; }
}
}

View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PoweredSoft.DynamicQuery.Core
{
public interface IQueryBuilder
{
IQueryResult Execute(IQueryable queryable, IQueryCriteria criteria);
Task<IQueryResult> ExecuteAsync(IQueryable queryable, IQueryCriteria criteria);
void AddInterceptor(IQueryInterceptor interceptor);
}
public interface IQueryInterceptor
{
}
public interface IBeforeQueryAlteredInterceptor : IQueryInterceptor
{
IQueryable InterceptQueryBeforeAltered(IQueryCriteria criteria, IQueryable queryable);
}
public interface IBeforeQueryAlteredInterceptor<T> : IQueryInterceptor
{
IQueryable<T> InterceptQueryBeforeAltered(IQueryCriteria criteria, IQueryable<T> queryable);
}
public interface IFilterInteceptor : IQueryInterceptor
{
IEnumerable<IFilter> InterceptFilter(IFilter filter);
}
public interface IGroupingInteceptor : IQueryInterceptor
{
IGroup InterceptGroup(IGroup group);
}
public interface ISortInteceptor : IQueryInterceptor
{
IEnumerable<ISort> InterceptSort(ISort sort);
}
public interface IBeforeQueryExecuteInterceptor : IQueryInterceptor
{
IQueryable InterceptBeforeQuery(IQueryCriteria criteria, IQueryable queryable);
}
public interface IBeforeQueryExecuteInterceptor<T> : IQueryInterceptor
{
IQueryable<T> InterceptBeforeQuery(IQueryCriteria criteria, IQueryable<T> queryable);
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace PoweredSoft.DynamicQuery.Core
{
public interface IQueryCriteria
{
int? Page { get; set; }
int? PageSize { get; set; }
List<ISort> Sorts { get; set; }
List<IFilter> Filters { get; set; }
List<IGroup> Groups { get; set; }
List<IAggregate> Aggregates { get; set; }
}
}

View File

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace PoweredSoft.DynamicQuery.Core
{
public interface IAggregateResult
{
string Path { get; set; }
AggregateType Type { get; set; }
object Value { get; set; }
}
public interface IQueryResult
{
long Count { get; }
List<IAggregateResult> Aggregates { get; }
}
public interface IQueryResultSimple : IQueryResult
{
List<object> Data { get; }
}
public interface IQueryResultGrouped : IQueryResult
{
List<IQueryResult> Data { get; }
}
}

View File

@ -0,0 +1,8 @@
namespace PoweredSoft.DynamicQuery.Core
{
public interface ISimpleFilter : IFilter
{
string Path { get; set; }
object Value { get; set; }
}
}

View File

@ -0,0 +1,8 @@
namespace PoweredSoft.DynamicQuery.Core
{
public interface ISort
{
string Path { get; set; }
bool? Ascending { get; set; }
}
}

View File

@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\PoweredSoft.DynamicQuery.Core\PoweredSoft.DynamicQuery.Core.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,72 @@
using PoweredSoft.DynamicQuery.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace PoweredSoft.DynamicQuery
{
public class QueryBuilder : IQueryBuilder
{
protected List<IQueryInterceptor> Interceptors { get; } = new List<IQueryInterceptor>();
protected IQueryCriteria Criteria { get; set; }
protected IQueryable QueryableAtStart { get; private set; }
protected IQueryable CurrentQueryable { get; set; }
protected Type QueryableUnderlyingType => QueryableAtStart.ElementType;
private MethodInfo ApplyInterceptorsAndCriteriaMethod { get; } = typeof(QueryBuilder).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).First(t => t.Name == "ApplyInterceptorsAndCriteria" && t.IsGenericMethod);
protected virtual void Reset(IQueryable queryable, IQueryCriteria criteria)
{
//Criteria = criteria ?? throw new ArgumentNullException("criteria");
QueryableAtStart = queryable ?? throw new ArgumentNullException("queryable");
CurrentQueryable = QueryableAtStart;
}
public virtual void AddInterceptor(IQueryInterceptor interceptor)
{
if (interceptor == null) throw new ArgumentNullException("interceptor");
if (!Interceptors.Contains(interceptor))
Interceptors.Add(interceptor);
}
protected virtual void ApplyInterceptorsAndCriteria<T>()
{
ApplySimpleBeforeAlterInterceptors();
ApplyGenericBeforeAlterInterceptors<T>();
}
private void ApplyInterceptorsAndCriteria()
{
var genericMethod = ApplyInterceptorsAndCriteriaMethod.MakeGenericMethod(QueryableUnderlyingType);
genericMethod.Invoke(this, null);
}
protected virtual void ApplyGenericBeforeAlterInterceptors<T>()
{
var interceptors = Interceptors.Where(t => t is IBeforeQueryAlteredInterceptor<T>).Cast<IBeforeQueryAlteredInterceptor<T>>().ToList();
interceptors.ForEach(i => CurrentQueryable = i.InterceptQueryBeforeAltered(Criteria, (IQueryable<T>)CurrentQueryable));
}
protected virtual void ApplySimpleBeforeAlterInterceptors()
{
var beforeAlterInterceptors = Interceptors.Where(t => t is IBeforeQueryAlteredInterceptor).Cast<IBeforeQueryAlteredInterceptor>().ToList();
beforeAlterInterceptors.ForEach(i => CurrentQueryable = i.InterceptQueryBeforeAltered(Criteria, CurrentQueryable));
}
public virtual IQueryResult Execute(IQueryable queryable, IQueryCriteria criteria)
{
Reset(queryable, criteria);
ApplyInterceptorsAndCriteria();
return null;
}
public virtual Task<IQueryResult> ExecuteAsync(IQueryable queryable, IQueryCriteria criteria)
{
throw new NotImplementedException();
}
}
}