Line data Source code
1 : using System;
2 : using System.Collections.Generic;
3 : using System.Reflection;
4 :
5 : namespace Cqrs.Repositories.Queries
6 : {
7 : public abstract class QueryStrategy : IQueryStrategy
8 0 : {
9 : #region Implementation of IQueryStrategy
10 :
11 : public IQueryPredicate QueryPredicate { get; protected set; }
12 :
13 : #endregion
14 :
15 0 : public virtual IQueryPredicate IsNotLogicallyDeleted()
16 : {
17 : return BuildQueryPredicate(IsNotLogicallyDeleted);
18 : }
19 :
20 0 : public virtual IQueryPredicate WithPermissionScopeAny<TAuthenticationToken>(TAuthenticationToken authenticationToken)
21 : {
22 : return BuildQueryPredicate(WithPermissionScopeAny, authenticationToken);
23 : }
24 :
25 0 : public virtual IQueryPredicate WithPermissionScopeUser<TAuthenticationToken>(TAuthenticationToken authenticationToken)
26 : {
27 : return BuildQueryPredicate(WithPermissionScopeUser, authenticationToken);
28 : }
29 :
30 0 : public virtual IQueryPredicate WithPermissionScopeCompany<TAuthenticationToken>(TAuthenticationToken authenticationToken)
31 : {
32 : return BuildQueryPredicate(WithPermissionScopeCompany, authenticationToken);
33 : }
34 :
35 0 : public virtual IQueryPredicate WithPermissionScopeCompanyAndUser<TAuthenticationToken>(TAuthenticationToken authenticationToken)
36 : {
37 : return BuildQueryPredicate(WithPermissionScopeCompanyAndUser, authenticationToken);
38 : }
39 :
40 0 : protected virtual IQueryPredicate BuildQueryPredicate<TData>(Func<TData> func)
41 : {
42 : var queryPredicate = new QueryPredicate
43 : {
44 : Name = func.Method.Name,
45 : Parameters = new SortedSet<QueryParameter>()
46 : };
47 :
48 : return queryPredicate;
49 : }
50 :
51 0 : protected virtual IQueryPredicate BuildQueryPredicate<TParameter1, TData>(Func<TParameter1, TData> func, TParameter1 parameter1)
52 : {
53 : var queryPredicate = new QueryPredicate
54 : {
55 : Name = func.Method.Name,
56 : Parameters = new SortedSet<QueryParameter>()
57 : };
58 :
59 : foreach (ParameterInfo parameterInfo in func.Method.GetParameters())
60 : {
61 : queryPredicate.Parameters.Add(new QueryParameter(parameterInfo.Name, parameter1));
62 : }
63 :
64 : return queryPredicate;
65 : }
66 :
67 0 : protected virtual IQueryPredicate BuildQueryPredicate<TParameter1, TParameter2, TData>(Func<TParameter1, TParameter2, TData> func, TParameter1 parameter1, TParameter2 parameter2)
68 : {
69 : var queryPredicate = new QueryPredicate
70 : {
71 : Name = func.Method.Name,
72 : Parameters = new SortedSet<QueryParameter>()
73 : };
74 :
75 : int parameterIndex = 1;
76 : foreach (ParameterInfo parameterInfo in func.Method.GetParameters())
77 : {
78 : object parameter;
79 : switch (parameterIndex)
80 : {
81 : case 1:
82 : parameter = parameter1;
83 : break;
84 : case 2:
85 : parameter = parameter2;
86 : break;
87 : default:
88 : throw new InvalidOperationException();
89 : }
90 : queryPredicate.Parameters.Add(new QueryParameter(parameterInfo.Name, parameter));
91 : parameterIndex++;
92 : }
93 :
94 : return queryPredicate;
95 : }
96 :
97 0 : protected virtual IQueryPredicate And(IQueryPredicate queryPredicate)
98 : {
99 : if (QueryPredicate == null)
100 : return queryPredicate;
101 :
102 : return new AndQueryPredicate
103 : {
104 : LeftQueryPredicate = QueryPredicate,
105 : RightQueryPredicate = queryPredicate
106 : };
107 : }
108 :
109 0 : protected virtual IQueryPredicate Or(IQueryPredicate queryPredicate)
110 : {
111 : return new OrQueryPredicate
112 : {
113 : LeftQueryPredicate = QueryPredicate,
114 : RightQueryPredicate = queryPredicate
115 : };
116 : }
117 : }
118 : }
|