-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathQueryBuilder.cls
128 lines (107 loc) · 3.7 KB
/
QueryBuilder.cls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
public class QueryBuilder {
private List<String> selectCommands;
private List<String> fromCommands;
private List<Map<String, String>> whereCommands;
private String sortByField;
private String sortDirection;
private String queryType;
private static final String dirASC = 'ASC';
private static final String dirDESC = 'DESC';
private static final String typeSOQL = 'SOQL';
private static final String typeSOSL = 'SOSL';
public QueryBuilder() {
reset();
}
public void reset() {
selectCommands = new List<String>();
fromCommands = new List<String>();
whereCommands = new List<Map<String, String>>();
// Set default sort direction.
sortDirection = dirASC;
// Set default query type.
queryType = typeSOQL;
}
public void addSelectField(String field) {
selectCommands.add(field);
}
public void addSelectField(QueryBuilder subquery) {
selectCommands.add('(' + subquery.getQuery() + ')');
}
public void addFromObject(String obj) {
fromCommands.add(obj);
}
public void addWhereClause(String clause) {
addWhereClause(clause, 'AND');
}
public void addWhereClause(String clause, String delimiter) {
Map<String, String> whereClause = new Map<String, String>();
whereClause.put(delimiter, clause);
whereCommands.add(whereClause);
}
public void addSortByField(String field) {
sortByField = field;
}
public void setSOSL() {
reset();
queryType = typeSOSL;
}
public void setSOQL() {
reset();
}
public void setSortASC() {
sortDirection = dirASC;
}
public void setSortDESC() {
sortDirection = dirDESC;
}
public String getQuery() {
if (queryType == typeSOQL) {
return getQuerySOQL();
}
return getQuerySOSL();
}
private String getQuerySOQL() {
String whereClause = '';
Boolean isFirst = true;
String query = 'SELECT ' + String.join(selectCommands, ', ');
query += ' FROM ' + String.join(fromCommands, ', ');
if (whereCommands.size() > 0) {
for ( Map<String, String> whereCommandSet : whereCommands ) {
for ( String whereCommand : whereCommandSet.keySet() ) {
// Add where clause delimiter.
if (isFirst == true) {
isFirst = false;
} else {
whereClause += ' ' + whereCommand + ' ';
}
whereClause += whereCommandSet.get(whereCommand);
}
}
query += ' WHERE ' + whereClause;
}
if (sortByField != null) {
query += ' SORT BY ' + sortByField + ' ' + sortDirection;
}
return query;
}
private String getQuerySOSL() {
String whereClause = '';
Boolean isFirst = true;
String query = 'FIND {';
if (whereCommands.size() > 0) {
for ( Map<String, String> whereCommandSet : whereCommands ) {
for ( String whereCommand : whereCommandSet.keySet() ) {
// Add where clause delimiter.
if (isFirst == true) {
isFirst = false;
} else {
whereClause += ' ' + whereCommand + ' ';
}
whereClause += whereCommandSet.get(whereCommand);
}
}
query += whereClause + '} IN ALL FIELDS RETURNING ' + String.join(fromCommands, ', ') + ' (' + String.join(selectCommands, ', ') + ')';
}
Return query;
}
}