/** * JBoss, Home of Professional Open Source * Copyright Red Hat, Inc., and individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jboss.aerogear.unifiedpush.jpa.dao.impl; import java.util.Date; import java.util.List; import javax.persistence.Query; import javax.persistence.TypedQuery; import org.jboss.aerogear.unifiedpush.api.PushMessageInformation; import org.jboss.aerogear.unifiedpush.dao.PageResult; import org.jboss.aerogear.unifiedpush.dao.PushMessageInformationDao; import org.jboss.aerogear.unifiedpush.dto.MessageMetrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JPAPushMessageInformationDao extends JPABaseDao<PushMessageInformation, String> implements PushMessageInformationDao { private static final String ASC = "ASC"; private static final String DESC = "DESC"; private final Logger logger = LoggerFactory.getLogger(JPAPushMessageInformationDao.class); @Override public List<PushMessageInformation> findAllForPushApplication(String pushApplicationId, boolean ascending) { return findAllForPushApplicationByParams(pushApplicationId, null, ascending, null, null); } @Override public List<PushMessageInformation> findAllForPushApplicationByParams(String pushApplicationId, String search, boolean ascending, Integer page, Integer pageSize) { String baseQuery = "from PushMessageInformation pmi where pmi.pushApplicationId = :pushApplicationId"; if (search != null) { baseQuery += " AND pmi.rawJsonMessage LIKE :search"; } final String queryJPQL = "select pmi " + baseQuery + " ORDER BY pmi.submitDate " + ascendingOrDescending(ascending); TypedQuery<PushMessageInformation> typedQuery = createQuery(queryJPQL) .setParameter("pushApplicationId", pushApplicationId); if (search != null) { typedQuery.setParameter("search", "%" + search + "%"); } if (pageSize != null) { typedQuery.setFirstResult(page * pageSize).setMaxResults(pageSize); } return typedQuery.getResultList(); } @Override public long getNumberOfPushMessagesForPushApplication(String pushApplicationId) { return createQuery("select count(*) from PushMessageInformation pmi where pmi.pushApplicationId = :pushApplicationId", Long.class) .setParameter("pushApplicationId", pushApplicationId).getSingleResult(); } @Override public long getNumberOfPushMessagesForVariant(String variantID) { return createQuery("select count(*) from VariantMetricInformation vmi where vmi.variantID = :variantID", Long.class) .setParameter("variantID", variantID).getSingleResult(); } public MessageMetrics findMessageMetricsForPushApplicationByParams(String pushApplicationId, String search, boolean ascending, Integer page, Integer pageSize) { String metricsJPQL = "select new org.jboss.aerogear.unifiedpush.dto.MessageMetrics(count(*), sum(totalReceivers), sum(appOpenCounter)) from PushMessageInformation pmi where pmi.pushApplicationId = :pushApplicationId"; if (search != null) { metricsJPQL += " AND pmi.rawJsonMessage LIKE :search"; } final Query metricsQuery = createUntypedQuery(metricsJPQL).setParameter("pushApplicationId", pushApplicationId); if (search != null) { metricsQuery.setParameter("search", "%" + search + "%"); } return (MessageMetrics) metricsQuery.getSingleResult(); } @Override public PageResult<PushMessageInformation, MessageMetrics> findAllForPushApplication(String pushApplicationId, String search, boolean ascending, Integer page, Integer pageSize) { final List<PushMessageInformation> pushMessageInformationList = findAllForPushApplicationByParams(pushApplicationId, search, ascending, page, pageSize); final MessageMetrics messageMetrics = findMessageMetricsForPushApplicationByParams(pushApplicationId, search, ascending, page, pageSize); return new PageResult<>(pushMessageInformationList, messageMetrics); } @Override public long getNumberOfPushMessagesForLoginName(String loginName) { return createQuery("select count(pmi) from PushMessageInformation pmi, PushApplication pa " + "where pmi.pushApplicationId = pa.pushApplicationID and pa.developer = :developer)", Long.class) .setParameter("developer", loginName).getSingleResult(); } @Override public List<String> findVariantIDsWithWarnings(String loginName) { return createQuery("select distinct vmi.variantID from VariantMetricInformation vmi, Variant va " + " WHERE vmi.variantID = va.variantID AND va.developer = :developer)" + " and vmi.deliveryStatus = false", String.class) .setParameter("developer", loginName) .getResultList(); } @Override public List<PushMessageInformation> findLatestActivity(String loginName, int maxResults) { return createQuery("select pmi from PushMessageInformation pmi, PushApplication pa" + " WHERE pmi.pushApplicationId = pa.pushApplicationID AND pa.developer = :developer)" + " ORDER BY pmi.submitDate " + DESC) .setParameter("developer", loginName) .setMaxResults(maxResults) .getResultList(); } @Override public void deletePushInformationOlderThan(Date oldest) { // TODO: use criteria API... entityManager.createQuery("delete from VariantMetricInformation vmi where vmi.pushMessageInformation.id in (select pmi FROM PushMessageInformation pmi WHERE pmi.submitDate < :oldest)") .setParameter("oldest", oldest) .executeUpdate(); int affectedRows = entityManager.createQuery("delete FROM PushMessageInformation pmi WHERE pmi.submitDate < :oldest") .setParameter("oldest", oldest) .executeUpdate(); logger.info("Deleting ['{}'] outdated PushMessageInformation objects", affectedRows); } //Admin queries @Override public List<String> findVariantIDsWithWarnings() { return createQuery("select distinct vmi.variantID from VariantMetricInformation vmi" + " where vmi.deliveryStatus = false", String.class) .getResultList(); } @Override public List<PushMessageInformation> findLatestActivity(int maxResults) { return createQuery("select pmi from PushMessageInformation pmi" + " ORDER BY pmi.submitDate " + DESC) .setMaxResults(maxResults) .getResultList(); } @Override public long getNumberOfPushMessagesForApplications() { return createQuery("select count(pmi) from PushMessageInformation pmi", Long.class).getSingleResult(); } /** * Helper that returns 'ASC' when true and 'DESC' when false. */ private static String ascendingOrDescending(boolean asc) { if (asc) { return ASC; } else { return DESC; } } @Override public Class<PushMessageInformation> getType() { return PushMessageInformation.class; } }