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 package info.magnolia.cms.util;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.ItemType;
38 import info.magnolia.context.MgnlContext;
39 import info.magnolia.jcr.util.NodeUtil;
40
41 import org.apache.commons.lang.StringUtils;
42 import org.apache.commons.lang.time.DateUtils;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 import javax.jcr.LoginException;
47 import javax.jcr.NodeIterator;
48 import javax.jcr.RepositoryException;
49 import javax.jcr.Session;
50 import javax.jcr.query.InvalidQueryException;
51 import javax.jcr.query.Query;
52 import javax.jcr.query.QueryManager;
53 import javax.jcr.query.qom.QueryObjectModel;
54
55 import java.util.ArrayList;
56 import java.util.Arrays;
57 import java.util.Calendar;
58 import java.util.Collection;
59 import java.util.Collections;
60 import java.util.HashSet;
61 import java.util.Iterator;
62 import java.util.Set;
63
64
65
66
67
68
69 public class QueryUtil {
70
71 private static Logger log = LoggerFactory.getLogger(QueryUtil.class);
72
73
74
75
76
77 public static Collection<Content> query(String repository, String statement) {
78 return query(repository, statement, "sql");
79 }
80
81
82
83
84
85 public static Collection<Content> query(String repository, String statement, String language) {
86 return query(repository, statement, language, ItemType.NT_BASE);
87 }
88
89
90
91
92 public static Collection<Content> exceptionThrowingQuery(String repository, String statement, String language, String returnItemType) throws RepositoryException {
93 return exceptionThrowingQuery(repository, statement, language, returnItemType, Long.MAX_VALUE);
94 }
95
96
97
98
99
100 public static Collection<Content> exceptionThrowingQuery(String repository, String statement, String language, String returnItemType,
101 long maxResultSize) throws RepositoryException {
102 Collection<Content> results = new ArrayList<Content>();
103 if(maxResultSize <= 0){
104 maxResultSize = Long.MAX_VALUE;
105 }
106 NodeIterator iterator = search(repository, statement, language, returnItemType);
107
108 long count = 1;
109 while(iterator.hasNext() && count <= maxResultSize){
110 results.add(ContentUtil.getContent(repository, iterator.nextNode().getPath()));
111 count++;
112 }
113 return results;
114 }
115
116
117
118
119 public static Collection<Content> query(String repository, String statement, String language, String returnItemType) {
120 return query(repository, statement, language, returnItemType, Long.MAX_VALUE);
121 }
122
123
124
125
126
127
128 @SuppressWarnings("unchecked")
129
130 public static Collection<Content> query(String repository, String statement, String language, String returnItemType, long maxResultSize) {
131 try {
132 return exceptionThrowingQuery(repository, statement, language, returnItemType, maxResultSize);
133 }
134 catch (Exception e) {
135 log.error("can't execute query [" + statement + "], will return empty collection", e);
136 }
137 return Collections.EMPTY_LIST;
138 }
139
140
141
142
143
144 public static String createDateExpression(int year, int month, int day) {
145 Calendar cal = Calendar.getInstance();
146 cal.set(year, month - 1, day);
147 return createDateExpression(cal);
148 }
149
150
151
152
153
154 public static String createDateExpression(Calendar calendar) {
155 return DateUtil.createDateExpression(calendar);
156 }
157
158
159
160
161
162 public static String createDateTimeExpression(int year, int month, int day, int hour, int minutes, int seconds) {
163 Calendar cal = Calendar.getInstance();
164 cal.set(year, month - 1, day, hour, minutes, seconds);
165 return createDateTimeExpression(cal);
166 }
167
168
169
170
171
172 public static String createDateTimeExpression(Calendar calendar) {
173 return DateUtil.createDateTimeExpression(calendar);
174 }
175
176
177
178
179
180 public static String createDateTimeExpressionIgnoreTimeZone(int year, int month, int day, int hour, int minutes, int seconds) {
181 Calendar cal = Calendar.getInstance(DateUtils.UTC_TIME_ZONE);
182 cal.set(year, month - 1, day, hour, minutes, seconds);
183 return createDateTimeExpression(cal);
184 }
185
186
187
188
189
190 public static String createDateTimeExpressionIgnoreTimeZone(Calendar calendar) {
191 return DateUtil.createDateTimeExpressionIgnoreTimeZone(calendar);
192 }
193
194
195
196
197
198
199
200
201
202
203
204
205 public static NodeIterator search(QueryObjectModel model, String returnItemType) throws InvalidQueryException, RepositoryException{
206 return NodeUtil.filterDuplicates(NodeUtil.filterParentNodeType(model.execute().getNodes(), returnItemType));
207 }
208
209
210
211
212
213
214
215
216
217
218
219
220
221 public static NodeIterator search(String workspace, String statement, String language) throws InvalidQueryException, RepositoryException{
222 Session session = MgnlContext.getJCRSession(workspace);
223 QueryManager manager = session.getWorkspace().getQueryManager();
224 Query query = manager.createQuery(statement, language);
225
226 return NodeUtil.filterDuplicates(query.execute().getNodes());
227 }
228
229
230
231
232
233
234
235
236
237
238
239
240
241 public static NodeIterator search(String workspace, String statement) throws InvalidQueryException, RepositoryException{
242 return search(workspace, statement, javax.jcr.query.Query.JCR_SQL2);
243 }
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258 public static NodeIterator search(String workspace, String statement, String language, String returnItemType) throws LoginException, RepositoryException{
259 NodeIterator resultIterator = search(workspace, statement, language);
260
261 return NodeUtil.filterDuplicates(NodeUtil.filterParentNodeType(resultIterator, returnItemType));
262 }
263
264
265
266
267
268
269
270 public static String buildQuery (String statement, String startPath){
271 Set<String> arguments = new HashSet<String>(Arrays.asList(StringUtils.splitByWholeSeparator(statement, ",")));
272
273 Iterator<String> argIt = arguments.iterator();
274 String queryString = "select * from [nt:base] as t where ISDESCENDANTNODE(["+startPath+"])";
275 while(argIt.hasNext()){
276 queryString = queryString + " AND contains(t.*, '"+argIt.next()+"')";
277 }
278 log.debug("query string: " + queryString);
279 return queryString;
280 }
281 }