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    }