/*
* RHQ Management Platform
* Copyright (C) 2005-2014 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.domain.measurement;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
@Entity
@NamedQueries({
@NamedQuery(name = MeasurementDataTrait.FIND_CURRENT_FOR_RESOURCE_AND_DISPLAY_TYPE, query = "SELECT trait, d.displayName "
+ "FROM MeasurementDataTrait trait JOIN trait.schedule s join s.definition d JOIN s.resource r"
+ " WHERE r.id = :resourceId "
+ " AND trait.id.timestamp = "
+ " (SELECT max(mdt.id.timestamp) "
+ " FROM MeasurementDataTrait mdt "
+ " WHERE s.id = mdt.schedule.id "
+ " ) "
+ " AND d.displayType = :displayType "),
@NamedQuery(name = MeasurementDataTrait.FIND_CURRENT_FOR_RESOURCE, query = "SELECT trait, d.displayName "
+ "FROM MeasurementDataTrait trait JOIN trait.schedule s join s.definition d JOIN s.resource r"
+ " WHERE r.id = :resourceId " + " AND trait.id.timestamp = " + " (SELECT max(mdt.id.timestamp) "
+ " FROM MeasurementDataTrait mdt " + " WHERE s.id = mdt.schedule.id) "),
@NamedQuery(name = MeasurementDataTrait.FIND_CURRENT_FOR_SCHEDULES, query = "SELECT mdt, d.displayName FROM MeasurementDataTrait mdt JOIN mdt.schedule s JOIN s.definition d "
+ "WHERE mdt.id.scheduleId IN ( :scheduleIds ) "
+ " AND mdt.id.timestamp = "
+ " ( SELECT MAX(x.id.timestamp) "
+ " FROM MeasurementDataTrait x "
+ " WHERE x.id.scheduleId = mdt.id.scheduleId" + " ) "),
@NamedQuery(name = MeasurementDataTrait.FIND_ALL_FOR_RESOURCE_AND_DEFINITION, query = "SELECT trait, d.displayName "
+ "FROM MeasurementDataTrait trait JOIN trait.schedule s JOIN s.definition d JOIN s.resource r "
+ " WHERE r.id = :resourceId " + " AND d.id = :definitionId " + "ORDER BY trait.id.timestamp DESC "),
@NamedQuery(name = MeasurementDataTrait.QUERY_DELETE_BY_RESOURCES, query = "DELETE MeasurementDataTrait t WHERE t.schedule IN ( SELECT ms FROM MeasurementSchedule ms WHERE ms.resource.id IN ( :resourceIds ) )") })
@Table(name = "RHQ_MEASUREMENT_DATA_TRAIT")
public class MeasurementDataTrait extends MeasurementData {
/**
* Find current traits for a Resource in :resourceId that have a certain displayType in :displayType
*/
public static final String FIND_CURRENT_FOR_RESOURCE_AND_DISPLAY_TYPE = "MeasurementDataTrait.FindCurrentForResourceAndDislayType";
/**
* Find all current traits for a Resource in :resourceId
*/
public static final String FIND_CURRENT_FOR_RESOURCE = "MeasurementDataTrait.FindCurrentForResource";
/**
* Find the current traits for the schedule ids passed in :scheduleIds
*/
public static final String FIND_CURRENT_FOR_SCHEDULES = "MeasurementDataTrait.FIND_CURRENT_FOR_SCHEDULES";
/**
* Find all trait data for the provided resource id and definition id resource id is first parameter definition id
* is second parameter
*/
public static final String FIND_ALL_FOR_RESOURCE_AND_DEFINITION = "MeasurementDataTrait.FIND_ALL_FOR_RESOURCE_AND_DEFINITION";
public static final String QUERY_DELETE_BY_RESOURCES = "MeasurementDataTrait.deleteByResources";
/**
* @deprecated as of RHQ 4.13, no longer used
*/
@Deprecated
public static final String NATIVE_QUERY_PURGE = "" //
+ "DELETE FROM rhq_measurement_data_trait " // SQL Server doesn't like aliases, use full table name
+ "WHERE EXISTS " // rewritten as exists because H2 doesn't support multi-column conditions
+ " (SELECT t2.schedule_id, t2.time_stamp " //
+ " FROM rhq_measurement_data_trait t2, " //
+ " (SELECT max(t4.time_stamp) as mx, t4.schedule_id as schedule_id " //
+ " FROM rhq_measurement_data_trait t4 " //
+ " WHERE t4.time_stamp < ? " //
+ " GROUP BY t4.schedule_id) t3 " //
+ " WHERE t2.schedule_id = t3.schedule_id " //
+ " AND t2.time_stamp < t3.mx " //
+ " AND rhq_measurement_data_trait.time_stamp = t2.time_stamp " // rewrote multi-column conditions as additional
+ " AND rhq_measurement_data_trait.schedule_id = t2.schedule_id) "; // correlated restrictions to the delete table
private static final long serialVersionUID = 1L;
private String value;
/**
* Create a new trait object with the current system time for the timestamp.
*
* @param request basically the {@link MeasurementSchedule} for this trait
* @param value the metric value of this trait
*/
public MeasurementDataTrait(MeasurementScheduleRequest request, String value) {
super(request);
this.value = value;
}
/**
* Create a new Trait object.
*
* @param timestamp time when the measurement was taken
* @param request basically the {@link MeasurementSchedule} for this trait
* @param value the metric value of this trait
*/
public MeasurementDataTrait(long timestamp, MeasurementScheduleRequest request, String value) {
super(timestamp, request);
this.value = value;
}
/**
* Create a new Trait object. MeasurementSchedule and timestamp are given in the passed pk.
*
* @param pk primary key
* @param value the measurement value for this trait
*/
public MeasurementDataTrait(MeasurementDataPK pk, String value) {
super(pk);
this.value = value;
}
protected MeasurementDataTrait() {
/* JPA use only */
}
@Override
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "MeasurementDataTrait[name=" + getName() + ", value=\"" + this.value + "\", scheduleId="
+ this.id.scheduleId + ", timestamp=" + this.id.timestamp + "]";
}
}