001
014
015 package com.liferay.portlet.social.service.persistence.impl;
016
017 import com.liferay.portal.kernel.cache.MultiVMPoolUtil;
018 import com.liferay.portal.kernel.cache.PortalCache;
019 import com.liferay.portal.kernel.dao.orm.QueryPos;
020 import com.liferay.portal.kernel.dao.orm.QueryUtil;
021 import com.liferay.portal.kernel.dao.orm.SQLQuery;
022 import com.liferay.portal.kernel.dao.orm.Session;
023 import com.liferay.portal.kernel.dao.orm.Type;
024 import com.liferay.portal.kernel.exception.SystemException;
025 import com.liferay.portal.kernel.util.ArrayUtil;
026 import com.liferay.portal.kernel.util.GetterUtil;
027 import com.liferay.portal.kernel.util.StringBundler;
028 import com.liferay.portal.kernel.util.StringPool;
029 import com.liferay.portal.kernel.util.StringUtil;
030 import com.liferay.portal.model.User;
031 import com.liferay.portal.util.PortalUtil;
032 import com.liferay.portlet.social.model.SocialActivityCounter;
033 import com.liferay.portlet.social.model.impl.SocialActivityCounterImpl;
034 import com.liferay.portlet.social.service.persistence.SocialActivityCounterFinder;
035 import com.liferay.portlet.social.util.SocialCounterPeriodUtil;
036 import com.liferay.util.dao.orm.CustomSQLUtil;
037
038 import java.io.Serializable;
039
040 import java.util.ArrayList;
041 import java.util.Iterator;
042 import java.util.List;
043
044
047 public class SocialActivityCounterFinderImpl
048 extends SocialActivityCounterFinderBaseImpl
049 implements SocialActivityCounterFinder {
050
051 public static final String COUNT_U_BY_G_C_N_S_E =
052 SocialActivityCounterFinder.class.getName() + ".countU_ByG_C_N_S_E";
053
054 public static final String FIND_AC_BY_G_N_S_E_1 =
055 SocialActivityCounterFinder.class.getName() + ".findAC_ByG_N_S_E_1";
056
057 public static final String FIND_AC_BY_G_N_S_E_2 =
058 SocialActivityCounterFinder.class.getName() + ".findAC_ByG_N_S_E_2";
059
060 public static final String FIND_AC_BY_G_C_C_N_S_E =
061 SocialActivityCounterFinder.class.getName() + ".findAC_By_G_C_C_N_S_E";
062
063 public static final String FIND_U_BY_G_C_N_S_E =
064 SocialActivityCounterFinder.class.getName() + ".findU_ByG_C_N_S_E";
065
066 @Override
067 public int countU_ByG_N(long groupId, String[] names) {
068 Session session = null;
069
070 try {
071 session = openSession();
072
073 String sql = CustomSQLUtil.get(COUNT_U_BY_G_C_N_S_E);
074
075 sql = StringUtil.replace(sql, "[$NAME$]", getNames(names));
076
077 SQLQuery q = session.createSynchronizedSQLQuery(sql);
078
079 q.addScalar(COUNT_COLUMN_NAME, Type.LONG);
080
081 QueryPos qPos = QueryPos.getInstance(q);
082
083 qPos.add(groupId);
084 qPos.add(PortalUtil.getClassNameId(User.class.getName()));
085
086 setNames(qPos, names);
087
088 qPos.add(SocialCounterPeriodUtil.getPeriodLength());
089 qPos.add(SocialCounterPeriodUtil.getActivityDay());
090
091 Iterator<Long> itr = q.iterate();
092
093 if (itr.hasNext()) {
094 Long count = itr.next();
095
096 if (count != null) {
097 return count.intValue();
098 }
099 }
100
101 return 0;
102 }
103 catch (Exception e) {
104 throw new SystemException(e);
105 }
106 finally {
107 closeSession(session);
108 }
109 }
110
111 @Override
112 public List<SocialActivityCounter> findAC_ByG_N_S_E_1(
113 long groupId, String name, int startPeriod, int endPeriod,
114 int periodLength) {
115
116 StringBundler sb = new StringBundler(9);
117
118 sb.append(groupId);
119 sb.append(StringPool.POUND);
120 sb.append(name);
121 sb.append(StringPool.POUND);
122 sb.append(startPeriod);
123 sb.append(StringPool.POUND);
124 sb.append(endPeriod);
125 sb.append(StringPool.POUND);
126 sb.append(periodLength);
127
128 String key = sb.toString();
129
130 List<SocialActivityCounter> activityCounters = null;
131
132 if (endPeriod < SocialCounterPeriodUtil.getActivityDay()) {
133 activityCounters =
134 (List<SocialActivityCounter>)_activityCounters.get(key);
135 }
136
137 if (activityCounters != null) {
138 return activityCounters;
139 }
140
141 Session session = null;
142
143 try {
144 session = openSession();
145
146 String sql = CustomSQLUtil.get(FIND_AC_BY_G_N_S_E_1);
147
148 SQLQuery q = session.createSynchronizedSQLQuery(sql);
149
150 QueryPos qPos = QueryPos.getInstance(q);
151
152 qPos.add(groupId);
153 qPos.add(name);
154 qPos.add(startPeriod);
155 qPos.add(endPeriod);
156 qPos.add(periodLength);
157 qPos.add(endPeriod);
158
159 activityCounters = new ArrayList<>();
160
161 Iterator<Object[]> itr = q.iterate();
162
163 while (itr.hasNext()) {
164 Object[] array = itr.next();
165
166 SocialActivityCounter activityCounter =
167 new SocialActivityCounterImpl();
168
169 activityCounter.setName(GetterUtil.getString(array[0]));
170 activityCounter.setCurrentValue(
171 GetterUtil.getInteger(array[1]));
172 activityCounter.setStartPeriod(GetterUtil.getInteger(array[2]));
173 activityCounter.setEndPeriod(GetterUtil.getInteger(array[3]));
174
175 activityCounters.add(activityCounter);
176 }
177 }
178 catch (Exception e) {
179 throw new SystemException(e);
180 }
181 finally {
182 if (activityCounters == null) {
183 _activityCounters.remove(key);
184 }
185 else {
186 if (endPeriod < SocialCounterPeriodUtil.getActivityDay()) {
187 _activityCounters.put(key, (Serializable)activityCounters);
188 }
189 }
190
191 closeSession(session);
192 }
193
194 return activityCounters;
195 }
196
197 @Override
198 public List<SocialActivityCounter> findAC_ByG_N_S_E_2(
199 long groupId, String counterName, int startPeriod, int endPeriod,
200 int periodLength) {
201
202 Session session = null;
203
204 try {
205 session = openSession();
206
207 String sql = CustomSQLUtil.get(FIND_AC_BY_G_N_S_E_2);
208
209 SQLQuery q = session.createSynchronizedSQLQuery(sql);
210
211 QueryPos qPos = QueryPos.getInstance(q);
212
213 qPos.add(groupId);
214 qPos.add(counterName);
215 qPos.add(startPeriod);
216 qPos.add(endPeriod);
217 qPos.add(periodLength);
218 qPos.add(endPeriod);
219
220 List<SocialActivityCounter> activityCounters = new ArrayList<>();
221
222 Iterator<Object[]> itr = q.iterate();
223
224 while (itr.hasNext()) {
225 Object[] array = itr.next();
226
227 SocialActivityCounter activityCounter =
228 new SocialActivityCounterImpl();
229
230 activityCounter.setClassNameId(GetterUtil.getLong(array[0]));
231 activityCounter.setName(GetterUtil.getString(array[1]));
232 activityCounter.setCurrentValue(
233 GetterUtil.getInteger(array[2]));
234
235 activityCounters.add(activityCounter);
236 }
237
238 return activityCounters;
239 }
240 catch (Exception e) {
241 throw new SystemException(e);
242 }
243 finally {
244 closeSession(session);
245 }
246 }
247
248 @Override
249 public List<SocialActivityCounter> findAC_By_G_C_C_N_S_E(
250 long groupId, List<Long> userIds, String[] names, int start, int end) {
251
252 if (names.length == 0) {
253 return null;
254 }
255
256 Session session = null;
257
258 try {
259 session = openSession();
260
261 String sql = CustomSQLUtil.get(FIND_AC_BY_G_C_C_N_S_E);
262
263 sql = StringUtil.replace(
264 sql, new String[] {"[$CLASS_PK$]", "[$NAME$]"},
265 new String[] {StringUtil.merge(userIds), getNames(names)});
266
267 SQLQuery q = session.createSynchronizedSQLQuery(sql);
268
269 q.addEntity(
270 "SocialActivityCounter", SocialActivityCounterImpl.class);
271
272 QueryPos qPos = QueryPos.getInstance(q);
273
274 qPos.add(groupId);
275 qPos.add(PortalUtil.getClassNameId(User.class.getName()));
276
277 setNames(qPos, names);
278
279 return (List<SocialActivityCounter>)QueryUtil.list(
280 q, getDialect(), start, end);
281 }
282 catch (Exception e) {
283 throw new SystemException(e);
284 }
285 finally {
286 closeSession(session);
287 }
288 }
289
290 @Override
291 public List<Long> findU_ByG_N(
292 long groupId, String[] names, int start, int end) {
293
294 if (names.length == 0) {
295 return null;
296 }
297
298 Session session = null;
299
300 try {
301 session = openSession();
302
303 String sql = CustomSQLUtil.get(FIND_U_BY_G_C_N_S_E);
304
305 sql = StringUtil.replace(sql, "[$NAME$]", getNames(names));
306
307 SQLQuery q = session.createSynchronizedSQLQuery(sql);
308
309 q.addScalar("classPK", Type.LONG);
310
311 QueryPos qPos = QueryPos.getInstance(q);
312
313 qPos.add(groupId);
314 qPos.add(PortalUtil.getClassNameId(User.class.getName()));
315
316 setNames(qPos, names);
317
318 qPos.add(SocialCounterPeriodUtil.getStartPeriod());
319
320 return (List<Long>)QueryUtil.list(q, getDialect(), start, end);
321 }
322 catch (Exception e) {
323 throw new SystemException(e);
324 }
325 finally {
326 closeSession(session);
327 }
328 }
329
330 protected String getNames(String[] names) {
331 if (names.length == 0) {
332 return StringPool.BLANK;
333 }
334
335 StringBundler sb = new StringBundler(names.length * 2 - 1);
336
337 for (int i = 0; i < names.length; i++) {
338 sb.append(StringPool.QUESTION);
339
340 if ((i + 1) < names.length) {
341 sb.append(StringPool.COMMA);
342 }
343 }
344
345 return sb.toString();
346 }
347
348 protected void setNames(QueryPos qPos, String[] names) {
349 if (ArrayUtil.isNotEmpty(names)) {
350 for (String name : names) {
351 qPos.add(name);
352 }
353 }
354 }
355
356 private static final PortalCache<String, Serializable> _activityCounters =
357 MultiVMPoolUtil.getPortalCache(
358 SocialActivityCounterFinder.class.getName());
359
360 }