1 /*
2  * Entity - Entity is an object-relational mapping tool for the D programming language. Referring to the design idea of JPA.
3  *
4  * Copyright (C) 2015-2018  Shanghai Putao Technology Co., Ltd
5  *
6  * Developer: HuntLabs.cn
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11  
12 module hunt.entity.criteria.CriteriaQuery;
13 
14 import hunt.entity;
15 import hunt.logging;
16 
17 import std.format;
18 
19 interface ICriteriaQuery {
20 
21 }
22 
23 class CriteriaQuery (T : Object, F : Object = T) : CriteriaBase!(T,F), ICriteriaQuery
24 {
25     this(CriteriaBuilder criteriaBuilder)
26     {
27         super(criteriaBuilder);
28     }
29 
30     public CriteriaQuery!(T,F) select(Root!(T,F) root)
31     {
32         string[] selectColumn = root.getAllSelectColumn();
33         foreach(JoinSqlBuild value; root.getJoins()) {
34             version(HUNT_ENTITY_DEBUG) {
35                 logDebug("####join sql : %s".format(value));
36             }
37 
38             if (value.joinType == JoinType.INNER) {
39                 _sqlBuidler.innerJoin(value.tableName, value.joinWhere);
40                 foreach(v; value.columnNames) {
41                     if (v != "")
42                         selectColumn ~= v;
43                 }
44             }
45             else if (value.joinType == JoinType.LEFT) {
46                 _sqlBuidler.leftJoin(value.tableName, value.joinWhere);
47                 foreach(v; value.columnNames) {
48                     if (v != "")
49                         selectColumn ~= v;
50                 }
51             }
52             else {
53                 _sqlBuidler.rightJoin(value.tableName, value.joinWhere);
54                 foreach(v; value.columnNames) {
55                     if (v != "")
56                         selectColumn ~= v;
57                 }
58             } 
59         }
60         _sqlBuidler.select(selectColumn);
61         return this;
62     }
63 
64     public CriteriaQuery!(T,F) select(EntityExpression info) {
65         _sqlBuidler.select([info.getSelectColumn()]);
66         return this;
67     }
68     //Comparison
69     public CriteriaQuery!(T,F) where(R)(Comparison!R cond) {
70         return cast(CriteriaQuery!(T,F))super.where(cond);
71     }
72     //P = Predicate
73     public CriteriaQuery!(T,F) where(P...)(P predicates) {
74         return cast(CriteriaQuery!(T,F))super.where(predicates);
75     }
76     //O = Order
77     public CriteriaQuery!(T,F) orderBy(O...)(O orders) {
78         foreach(v; orders) {
79             _sqlBuidler.orderBy(v.getColumn() ~ " " ~ v.getOrderType());
80         }
81         return this;
82     }
83     //E = EntityFieldInfo
84     public CriteriaQuery!(T,F) groupBy(E...)(E entityFieldInfos) {
85         foreach(v; entityFieldInfos) {
86             _sqlBuidler.groupBy(v.getFullColumn());
87         }
88         return this;
89     }
90     //P = Predicate
91     public CriteriaQuery!(T,F) having(P...)(P predicates) { 
92         string s;
93         foreach(k, v; predicates) {
94             s ~= v.toString();
95             if (k != predicates.length-1) 
96                 s ~= " AND ";
97         }
98         _sqlBuidler.having(s);
99         return this;
100     }
101     //E = EntityFieldInfo
102     public CriteriaQuery!(T,F) multiselect(E...)(E entityExpressions) {
103         string[] columns;
104         foreach(v; entityExpressions) {
105             columns ~= v.getSelectColumn();
106         }
107         _sqlBuidler.select(columns);
108         return this;
109     }
110 
111     public CriteriaQuery!(T,F) distinct(bool distinct) {
112         _sqlBuidler.setDistinct(distinct);
113         return this;
114     }
115     
116     public QueryBuilder getQueryBuilder()
117     {
118         return _sqlBuidler;
119     }
120 }