Merge "Pagination fix for ORM"

This commit is contained in:
Jenkins 2016-06-22 10:28:41 +00:00 committed by Gerrit Code Review
commit ef8a2c1ca4
3 changed files with 118 additions and 24 deletions

View File

@ -251,6 +251,7 @@ public class AlarmDefinitionSqlRepoImpl
+ "LEFT OUTER JOIN alarm_action AS aa ON t.id = aa.alarm_definition_id ORDER BY t.id, t.created_at";
StringBuilder sbWhere = new StringBuilder();
StringBuilder limitOffset = new StringBuilder();
if (name != null) {
sbWhere.append(" and ad.name = :name");
@ -271,16 +272,15 @@ public class AlarmDefinitionSqlRepoImpl
}
}
if (offset != null && !offset.equals("0")) {
sbWhere.append(" and ad.id > :offset");
}
String limitPart = "";
if (limit > 0) {
limitPart = " limit :limit";
limitOffset.append(" limit :limit");
}
String sql = String.format(query, SubAlarmDefinitionQueries.buildJoinClauseFor(dimensions), sbWhere, limitPart);
if (offset != null) {
limitOffset.append(" offset :offset ");
}
String sql = String.format(query, SubAlarmDefinitionQueries.buildJoinClauseFor(dimensions), sbWhere, limitOffset);
try {
session = sessionFactory.openSession();
@ -288,6 +288,7 @@ public class AlarmDefinitionSqlRepoImpl
final Query qAlarmDefinition = session
.createSQLQuery(sql)
.setString("tenantId", tenantId)
.setReadOnly(true)
.setResultTransformer(ALARM_DEF_RESULT_TRANSFORMER);
if (name != null) {
@ -304,14 +305,14 @@ public class AlarmDefinitionSqlRepoImpl
}
}
if (offset != null && !offset.equals("0")) {
qAlarmDefinition.setString("offset", offset);
}
if (limit > 0) {
qAlarmDefinition.setInteger("limit", limit + 1);
}
if (offset != null) {
qAlarmDefinition.setInteger("offset", Integer.parseInt(offset));
}
this.bindDimensionsToQuery(qAlarmDefinition, dimensions);
final List<Map<?,?>> alarmDefinitionDbList = qAlarmDefinition.list();

View File

@ -27,6 +27,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import monasca.api.domain.exception.EntityNotFoundException;
@ -34,9 +38,11 @@ import monasca.api.domain.model.alarmdefinition.AlarmDefinition;
import monasca.api.domain.model.alarmdefinition.AlarmDefinitionRepo;
import monasca.common.hibernate.db.AlarmActionDb;
import monasca.common.hibernate.db.AlarmDefinitionDb;
import monasca.common.hibernate.db.NotificationMethodDb;
import monasca.common.hibernate.db.SubAlarmDefinitionDb;
import monasca.common.hibernate.db.SubAlarmDefinitionDimensionDb;
import monasca.common.model.alarm.AggregateFunction;
import monasca.common.model.alarm.AlarmNotificationMethodType;
import monasca.common.model.alarm.AlarmOperator;
import monasca.common.model.alarm.AlarmSeverity;
import monasca.common.model.alarm.AlarmState;
@ -51,6 +57,7 @@ import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.annotation.Nullable;
import javax.ws.rs.WebApplicationException;
@Test(groups = "orm")
@ -127,6 +134,22 @@ public class AlarmDefinitionSqlRepositoryImplTest {
session.save(subAlarmDefinitionDimensionFlavorMetricNameCpu.setSubExpression(subAlarmDefinition111));
session.save(subAlarmDefinitionDimensionDevice1.setSubExpression(subAlarmDefinition111));
final NotificationMethodDb notificationMethodDb29387234 = new NotificationMethodDb()
.setAddress("root@localhost")
.setName("root2938723")
.setTenantId("bob")
.setType(AlarmNotificationMethodType.EMAIL)
.setPeriod(60);
final NotificationMethodDb notificationMethodDb77778687 = new NotificationMethodDb()
.setAddress("root@localhost")
.setName("root77778687")
.setTenantId("bob")
.setType(AlarmNotificationMethodType.EMAIL)
.setPeriod(60);
session.save(notificationMethodDb29387234.setId("29387234"));
session.save(notificationMethodDb77778687.setId("77778687"));
final AlarmActionDb alarmAction29387234 = new AlarmActionDb()
.setActionId("29387234")
.setAlarmDefinition(alarmDefinition123)
@ -380,20 +403,90 @@ public class AlarmDefinitionSqlRepositoryImplTest {
}
public void shouldFilterBySeverity() {
List<AlarmDefinition> alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, 1);
AlarmDefinition alarmDefinition;
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH), null, null, 1),
this.alarmDef_123);
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, 1),
this.alarmDef_234);
checkList(repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.HIGH, AlarmSeverity.LOW), null, null, 1),
this.alarmDef_123, this.alarmDef_234);
}
assertEquals(1, alarmDefinitions.size());
alarmDefinition = alarmDefinitions.get(0);
public void shouldFindWithOffset() {
// create more alarm definition for this test
final AlarmDefinition localAd1 = new AlarmDefinition("999", "60% CPU", null, "LOW",
"avg(hpcs.compute{flavor_id=888, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 100",
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
Collections.<String>emptyList());
final AlarmDefinition localAd2 = new AlarmDefinition("9999", "70% CPU", null, "LOW",
"avg(hpcs.compute{flavor_id=999, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 99",
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
Collections.<String>emptyList());
final AlarmDefinition localAd3 = new AlarmDefinition("99999", "80% CPU", null, "LOW",
"avg(hpcs.compute{flavor_id=1111, image_id=888, metric_name=mem}) > 20 and avg(hpcs.compute) < 88",
Arrays.asList("flavor_id", "image_id"), true, Arrays.asList("29387234", "77778687"), Collections.<String>emptyList(),
Collections.<String>emptyList());
assertEquals(this.alarmDef_123, alarmDefinition);
final Session session = sessionFactory.openSession();
session.beginTransaction();
alarmDefinitions = repo.find("bob", null, null, Lists.newArrayList(AlarmSeverity.LOW), null, null, 1);
for (final AlarmDefinition ad : Lists.newArrayList(localAd1, localAd2, localAd3)) {
final AlarmDefinitionDb adDb = new AlarmDefinitionDb()
.setTenantId("bob")
.setName(ad.getName())
.setSeverity(AlarmSeverity.valueOf(ad.getSeverity()))
.setExpression(ad.getExpression())
.setMatchBy(Joiner.on(",").join(ad.getMatchBy()))
.setActionsEnabled(ad.isActionsEnabled());
assertEquals(1, alarmDefinitions.size());
alarmDefinition = alarmDefinitions.get(0);
session.save(adDb.setId(ad.getId()));
for (final String alarmActionId : ad.getAlarmActions()) {
session.save(new AlarmActionDb()
.setActionId(alarmActionId)
.setAlarmDefinition(adDb)
.setAlarmState(AlarmState.ALARM)
);
}
}
session.getTransaction().commit();
session.close();
// run tests
checkList(repo.find("bob", null, null, null, null, null, 1), this.alarmDef_123, this.alarmDef_234);
checkList(repo.find("bob", null, null, null, null, "1", 1), this.alarmDef_234, localAd1);
checkList(repo.find("bob", null, null, null, null, "2", 1), localAd1, localAd2);
checkList(repo.find("bob", null, null, null, null, "3", 1), localAd2, localAd3);
checkList(repo.find("bob", null, null, null, null, "4", 1), localAd3);
checkList(repo.find("bob", null, null, null, null, "5", 1));
checkList(repo.find("bob", null, null, null, null, null, 0),
this.alarmDef_123, this.alarmDef_234, localAd1, localAd2, localAd3);
checkList(repo.find("bob", null, null, null, null, null, 6),
this.alarmDef_123, this.alarmDef_234, localAd1, localAd2, localAd3);
checkList(repo.find("bob", null, null, null, null, "2", 3),
localAd1, localAd2, localAd3);
}
private void checkList(List<AlarmDefinition> found, AlarmDefinition... expected) {
assertEquals(found.size(), expected.length);
AlarmDefinition actual;
for (final AlarmDefinition alarmDefinition : expected) {
final Optional<AlarmDefinition> alarmOptional = FluentIterable
.from(found)
.firstMatch(new Predicate<AlarmDefinition>() {
@Override
public boolean apply(@Nullable final AlarmDefinition input) {
assert input != null;
return input.getId().equals(alarmDefinition.getId());
}
});
assertTrue(alarmOptional.isPresent());
actual = alarmOptional.get();
assertEquals(actual, alarmDefinition, String.format("%s not equal to %s", actual, alarmDefinition));
}
assertEquals(this.alarmDef_234, alarmDefinition);
}
}

View File

@ -83,13 +83,13 @@ class HibernateUtil {
private static Properties getHikariMySqlProperties() {
Properties properties = new Properties();
properties.put("hibernate.connection.provider_class", "com.zaxxer.hikari.hibernate.HikariConnectionProvider");
properties.put("hibernate.hbm2ddl.auto", "create-drop");
properties.put("hibernate.hbm2ddl.auto", "validate");
properties.put("show_sql", true);
properties.put("hibernate.hikari.dataSourceClassName", "com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
properties.put("hibernate.hikari.dataSource.url",
"jdbc:mysql://localhost:3306/mon?useLegacyDatetimeCode=false&serverTimezone=UTC");
properties.put("hibernate.hikari.dataSource.user", "root");
properties.put("hibernate.hikari.dataSource.password", "");
"jdbc:mysql://192.168.10.4:3306/mon?useLegacyDatetimeCode=false&serverTimezone=UTC");
properties.put("hibernate.hikari.dataSource.user", "monapi");
properties.put("hibernate.hikari.dataSource.password", "password");
return properties;
}