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 }