1
22
23 package com.liferay.util.dao.hibernate;
24
25 import com.liferay.portal.kernel.util.OrderByComparator;
26 import com.liferay.portal.kernel.util.Randomizer;
27
28 import java.util.ArrayList;
29 import java.util.Iterator;
30 import java.util.List;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34
35 import org.hibernate.Query;
36 import org.hibernate.ScrollableResults;
37 import org.hibernate.dialect.Dialect;
38
39
45 public class QueryUtil {
46
47 public static final int ALL_POS = -1;
48
49 public static Iterator iterate(
50 Query query, Dialect dialect, int begin, int end) {
51
52 return list(query, dialect, begin, end).iterator();
53 }
54
55 public static List list(Query query, Dialect dialect, int begin, int end) {
56 if ((begin == ALL_POS) && (end == ALL_POS)) {
57 return query.list();
58 }
59 else {
60 if (dialect.supportsLimit()) {
61 query.setMaxResults(end - begin);
62 query.setFirstResult(begin);
63
64 return query.list();
65 }
66 else {
67 List list = new ArrayList();
68
69 ScrollableResults sr = query.scroll();
70
71 if (sr.first() && sr.scroll(begin)) {
72 for (int i = begin; i < end; i++) {
73 Object obj = sr.get(0);
74
75 list.add(obj);
76
77 if (!sr.next()) {
78 break;
79 }
80 }
81 }
82
83 return list;
84 }
85 }
86 }
87
88 public static List randomList(
89 Query query, Dialect dialect, int total, int num) {
90
91 if ((total == 0) || (num == 0)) {
92 return new ArrayList();
93 }
94
95 if (num >= total) {
96 return list(query, dialect, ALL_POS, ALL_POS);
97 }
98
99 int[] scrollIds = Randomizer.getInstance().nextInt(total, num);
100
101 List list = new ArrayList();
102
103 ScrollableResults sr = query.scroll();
104
105 for (int i = 0; i < scrollIds.length; i++) {
106 if (sr.scroll(scrollIds[i])) {
107 Object obj = sr.get(0);
108
109 list.add(obj);
110
111 sr.first();
112 }
113 }
114
115 return list;
116 }
117
118 public static Comparable[] getPrevAndNext(
119 Query query, int count, OrderByComparator obc, Comparable comparable) {
120
121 Comparable[] array = new Comparable[3];
122
123 ScrollableResults sr = query.scroll();
124
125 if (sr.first()) {
126 while (true) {
127 Object obj = sr.get(0);
128
129 if (obj == null) {
130 if (_log.isWarnEnabled()) {
131 _log.warn("Object is null");
132 }
133
134 break;
135 }
136
137 Comparable curComparable = (Comparable)obj;
138
139 int value = obc.compare(comparable, curComparable);
140
141 if (_log.isDebugEnabled()) {
142 _log.debug("Comparison result is " + value);
143 }
144
145 if (value == 0) {
146 if (!comparable.equals(curComparable)) {
147 break;
148 }
149
150 array[1] = curComparable;
151
152 if (sr.previous()) {
153 array[0] = (Comparable)sr.get(0);
154 }
155
156 sr.next();
157
158 if (sr.next()) {
159 array[2] = (Comparable)sr.get(0);
160 }
161
162 break;
163 }
164
165 if (count == 1) {
166 if (_log.isDebugEnabled()) {
167 _log.debug("Scroll count is 1");
168 }
169
170 break;
171 }
172
173 count = (int)Math.ceil(count / 2.0);
174
175 int scrollPos = count;
176
177 if (value < 0) {
178 scrollPos = scrollPos * -1;
179 }
180
181 if (_log.isDebugEnabled()) {
182 _log.debug("Scroll " + scrollPos);
183 }
184
185 if (!sr.scroll(scrollPos)) {
186 if (value < 0) {
187 if (!sr.scroll(1)) {
188 break;
189 }
190 }
191 else {
192 if (!sr.scroll(-1)) {
193 break;
194 }
195 }
196 }
197 }
198 }
199
200 return array;
201 }
202
203 private static Log _log = LogFactory.getLog(QueryUtil.class);
204
205 }