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 }