/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.test;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.testng.annotations.Test;
import org.rhq.core.domain.test.AbstractEJB3Test;
/**
* Tests that demonstrate the Hibernate bug HHH-2833.
*
* <p>See Hiberate JIRA: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2833</p>
*
* I confirmed that both testHibernateBugXXX methods fail with Hibernate 3.2.3.GA and 3.2.5.GA. They both succeed when
* running with 3.2.0.CR4.
*
* @author John Mazzitelli
*/
@Test(groups = "integration.ejb3")
public class MeasurementBaselineHHH2833Test extends AbstractEJB3Test {
private static boolean SKIP_TESTS = false;
public void testSelectQueryThatSucceeds() throws Exception {
getTransactionManager().begin();
try {
EntityManager entityManager = getEntityManager();
Query q = entityManager.createQuery(getSelectQueryThatSucceeds());
assert q != null;
q.setParameter("startTime", 500L).setParameter("endTime", 1000L);
q.getResultList();
} finally {
getTransactionManager().rollback();
}
}
public void testHibernateBug_HHH_2833_WithSelect() throws Exception {
getTransactionManager().begin();
try {
EntityManager entityManager = getEntityManager();
Query q = entityManager.createQuery(getSelectQueryThatFails());
assert q != null;
q.setParameter("startTime", 500L).setParameter("endTime", 1000L);
q.getResultList();
} finally {
getTransactionManager().rollback();
}
}
public void testHibernateBug_HHH_2833_WithInsert() throws Exception {
if (SKIP_TESTS) {
System.out
.println("!!!!!MeasurementBaselineHHH2833Test NEEDS TO BE RE-ENABLED ONCE HHH-2833 IS FIXED!!!!!");
return;
}
if (true) // Does not work on Oracle
{
return;
}
getTransactionManager().begin();
try {
EntityManager entityManager = getEntityManager();
Query q = entityManager.createQuery(getInsertQueryThatFails());
assert q != null;
q.setParameter("startTime", 500L).setParameter("endTime", 1000L);
q.executeUpdate();
} finally {
getTransactionManager().rollback();
}
}
public void testHibernateBug_HHH_2833_WithDelete() throws Exception {
if (SKIP_TESTS) {
System.out
.println("!!!!!MeasurementBaselineHHH2833Test NEEDS TO BE RE-ENABLED ONCE HHH-2833 IS FIXED!!!!!");
return;
}
getTransactionManager().begin();
try {
EntityManager entityManager = getEntityManager();
Query q = entityManager.createQuery(getDeleteQueryThatFails());
assert q != null;
q.setParameter("startTime", 500L).setParameter("endTime", 1000L);
q.executeUpdate();
} finally {
getTransactionManager().rollback();
}
}
private String getSelectQueryThatSucceeds() {
return " SELECT min(d.min) AS baselineMin, " //
+ " max(d.max) AS baselineMax, " //
+ " avg(d.value) AS baselineMean, " //
+ " CURRENT_TIMESTAMP AS computeTime, " //
+ " d.id.scheduleId AS scheduleId " //
+ " FROM MeasurementDataNumeric1H d " //
+ " JOIN d.schedule s " //
+ " LEFT JOIN s.baseline b " //
+ " WHERE b.id IS NULL " //
+ " AND d.id.timestamp BETWEEN :startTime AND :endTime " //
+ " GROUP BY d.id.scheduleId " //
+ " HAVING d.id.scheduleId IN (SELECT d1.id.scheduleId " //
+ " FROM MeasurementDataNumeric1H d1 " //
+ " WHERE d1.id.timestamp <= :startTime) ";
}
private String getSelectQueryThatFails() {
return " SELECT min(d.min) AS baselineMin, " //
+ " max(d.max) AS baselineMax, " //
+ " avg(d.value) AS baselineMean, " //
+ " CURRENT_TIMESTAMP AS computeTime, " //
+ " d.id.scheduleId AS scheduleId " //
+ " FROM MeasurementDataNumeric1H d " //
+ " JOIN d.schedule s " //
+ " LEFT JOIN s.baseline b " //
+ " WHERE b.id IS NULL " //
+ " AND d.id.timestamp BETWEEN :startTime AND :endTime " //
+ " GROUP BY d.id.scheduleId " //
+ " HAVING d.id.scheduleId IN (SELECT d1.id.scheduleId " //
+ " FROM MeasurementDataNumeric1H d1 " //
+ " WHERE d1.id.timestamp <= :startTime " //
+ " AND d1.id.scheduleId = d.id.scheduleId) "; // this AND causes problems
}
private String getInsertQueryThatFails() {
return "INSERT INTO MeasurementBaseline (baselineMin,baselineMax,baselineMean,computeTime,scheduleId) "
+ getSelectQueryThatSucceeds();
}
private String getDeleteQueryThatFails() {
// only the SELECT clause is different - the FROM on down is the same as the getSelectQueryThatSucceeds query
return "DELETE MeasurementBaseline AS doomed WHERE doomed.schedule.id IN " //
+ "( " //
+ " SELECT d.id.scheduleId AS scheduleId " //
+ " FROM MeasurementDataNumeric1H d " //
+ " JOIN d.schedule s " //
+ " LEFT JOIN s.baseline b " //
+ " WHERE b.id IS NOT NULL " //
+ " AND d.id.timestamp BETWEEN :startTime AND :endTime " //
+ " AND b.userEntered = FALSE " //
+ " GROUP BY d.id.scheduleId " //
+ " HAVING d.id.scheduleId IN (SELECT d1.id.scheduleId " //
+ " FROM MeasurementDataNumeric1H d1 "//
+ " WHERE d1.id.timestamp <= :startTime) " //
+ ") ";
}
}