001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2009 SonarSource SA
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.api.database.daos;
021
022 import org.sonar.api.database.DatabaseSession;
023 import org.sonar.api.database.model.AsyncMeasureSnapshot;
024 import org.sonar.api.database.model.MeasureModel;
025 import org.sonar.api.database.model.ResourceModel;
026 import org.sonar.api.database.model.Snapshot;
027
028 import java.util.Date;
029 import java.util.List;
030 import javax.persistence.NoResultException;
031 import javax.persistence.Query;
032
033 public class AsyncMeasuresDao extends BaseDao {
034
035 public AsyncMeasuresDao(DatabaseSession session) {
036 super(session);
037 }
038
039 public MeasureModel getAsyncMeasure(Long asyncMeasureId) {
040 return getSession().getEntityManager().find(MeasureModel.class, asyncMeasureId);
041 }
042
043 public void deleteAsyncMeasure(MeasureModel asyncMeasure) {
044 deleteAsyncMeasureSnapshots(asyncMeasure.getId());
045 getSession().remove(asyncMeasure);
046 }
047
048 public Snapshot getPreviousSnapshot(Snapshot s) {
049 try {
050 return (Snapshot) getSession().createQuery(
051 "SELECT s FROM Snapshot s " +
052 "WHERE s.createdAt<:date " +
053 "AND s.scope=:scope " +
054 "AND s.resourceId=:resourceId " +
055 "ORDER BY s.createdAt DESC")
056 .setParameter("date", s.getCreatedAt())
057 .setParameter("scope", s.getScope())
058 .setParameter("resourceId", s.getResourceId())
059 .setMaxResults(1)
060 .getSingleResult();
061 } catch (NoResultException ex) {
062 return null;
063 }
064 }
065
066 public List<Snapshot> getNextSnapshotsUntilDate(MeasureModel measure, Date date) {
067 Query query = getSession().createQuery(
068 "SELECT s FROM Snapshot s " +
069 "WHERE s.resourceId=:projectId " +
070 "AND s.createdAt>=:beginDate " +
071 (date != null ? "AND s.createdAt<:endDate " : "") +
072 "AND s.scope=:scope " +
073 "ORDER BY s.createdAt ASC ")
074 .setParameter("projectId", measure.getProjectId())
075 .setParameter("beginDate", measure.getMeasureDate())
076 .setParameter("scope", ResourceModel.SCOPE_PROJECT);
077 if (date != null) {
078 query.setParameter("endDate", date);
079 }
080 return query.getResultList();
081 }
082
083 public AsyncMeasureSnapshot createAsyncMeasureSnapshot(Long asyncMeasureId, Integer snapshotId, Date AsyncMeasureDate, Date snapshotDate, Integer metricId, Integer projectId) {
084 AsyncMeasureSnapshot asyncMeasureSnapshot = new AsyncMeasureSnapshot(asyncMeasureId, snapshotId, AsyncMeasureDate, snapshotDate, metricId, projectId);
085 getSession().save(asyncMeasureSnapshot);
086 return asyncMeasureSnapshot;
087 }
088
089 public void updateAsyncMeasureSnapshot(AsyncMeasureSnapshot asyncMeasureSnapshot, Snapshot snapshot) {
090 if (snapshot != null) {
091 asyncMeasureSnapshot.setSnapshotId(snapshot.getId());
092 asyncMeasureSnapshot.setSnapshotDate(snapshot.getCreatedAt());
093 } else {
094 asyncMeasureSnapshot.setSnapshotId(null);
095 asyncMeasureSnapshot.setSnapshotDate(null);
096 }
097 getSession().merge(asyncMeasureSnapshot);
098 }
099
100 public void removeSnapshotFromAsyncMeasureSnapshot(AsyncMeasureSnapshot asyncMeasureSnapshot) {
101 asyncMeasureSnapshot.setSnapshotId(null);
102 asyncMeasureSnapshot.setSnapshotDate(null);
103 getSession().merge(asyncMeasureSnapshot);
104 }
105
106
107 public AsyncMeasureSnapshot getNextAsyncMeasureSnapshot(Integer projetcId, Integer metricId, Date date) {
108 try {
109 return (AsyncMeasureSnapshot) getSession().createQuery(
110 "SELECT ams FROM AsyncMeasureSnapshot ams " +
111 "WHERE ams.projectId=:projectId " +
112 "AND ams.metricId=:metricId " +
113 "AND ams.measureDate>:date " +
114 "ORDER BY ams.measureDate ASC")
115 .setParameter("projectId", projetcId)
116 .setParameter("metricId", metricId)
117 .setParameter("date", date)
118 .setMaxResults(1)
119 .getSingleResult();
120 } catch (NoResultException ex) {
121 return null;
122 }
123 }
124
125 public List<AsyncMeasureSnapshot> getNextAsyncMeasureSnapshotsUntilDate(MeasureModel asyncMeasure, Date endDate) {
126 Query query = getSession().createQuery(
127 "SELECT ams FROM AsyncMeasureSnapshot ams " +
128 "WHERE ams.projectId=:projectId " +
129 "AND ams.metricId=:metricId " +
130 (endDate != null ? "AND ams.measureDate<:endDate " : "") +
131 "AND ams.snapshotDate>=:measureDate " +
132 "ORDER BY ams.snapshotDate ASC ")
133 .setParameter("projectId", asyncMeasure.getProjectId())
134 .setParameter("metricId", asyncMeasure.getMetric().getId())
135 .setParameter("measureDate", asyncMeasure.getMeasureDate());
136 if (endDate != null) {
137 query.setParameter("endDate", endDate);
138 }
139 return query.getResultList();
140 }
141
142 public List<AsyncMeasureSnapshot> getPreviousAsyncMeasureSnapshots(Integer projectId, Date beginDate, Date endDate) {
143 Query query = getSession().createQuery(
144 "SELECT ams FROM AsyncMeasureSnapshot ams " +
145 "WHERE ams.projectId=:projectId " +
146 "AND ams.measureDate<=:endDate " +
147 (beginDate != null ? "AND ams.measureDate>:beginDate " : "") +
148 "AND ams.snapshotId IS NULL " +
149 "ORDER BY ams.measureDate ASC")
150 .setParameter("projectId", projectId)
151 .setParameter("endDate", endDate);
152 if (beginDate != null) {
153 query.setParameter("beginDate", beginDate);
154 }
155 return query.getResultList();
156 }
157
158 public List<AsyncMeasureSnapshot> getAsyncMeasureSnapshotsFromSnapshotId(Integer snapshotId, List<Integer> metricIdsToExclude) {
159 Query query = getSession().createQuery(
160 "SELECT ams FROM AsyncMeasureSnapshot ams " +
161 "WHERE ams.snapshotId=:snapshotId " +
162 (!metricIdsToExclude.isEmpty() ? "AND ams.metricId NOT IN (:metricIdsToExclude) " : "") +
163 "ORDER BY ams.measureDate ASC")
164 .setParameter("snapshotId", snapshotId);
165 if (!metricIdsToExclude.isEmpty()) {
166 query.setParameter("metricIdsToExclude", metricIdsToExclude);
167 }
168 return query.getResultList();
169 }
170
171 public AsyncMeasureSnapshot getLastAsyncMeasureSnapshot(Integer projetcId, Integer metricId, Date date) {
172 try {
173 return (AsyncMeasureSnapshot) getSession().createQuery(
174 "SELECT ams FROM AsyncMeasureSnapshot ams " +
175 "WHERE ams.projectId=:projectId " +
176 "AND ams.metricId=:metricId " +
177 "AND ams.measureDate<:date " +
178 "ORDER BY ams.measureDate DESC")
179 .setParameter("projectId", projetcId)
180 .setParameter("metricId", metricId)
181 .setParameter("date", date)
182 .setMaxResults(1)
183 .getSingleResult();
184 } catch (NoResultException ex) {
185 return null;
186 }
187 }
188
189 public void deleteAsyncMeasureSnapshots(Long asyncMeasureId) {
190 getSession().createQuery(
191 "DELETE FROM AsyncMeasureSnapshot ams WHERE ams.measureId=:measureId")
192 .setParameter("measureId", asyncMeasureId)
193 .executeUpdate();
194 }
195
196 }