diff --git a/java/monasca-common-hibernate/pom.xml b/java/monasca-common-hibernate/pom.xml
index 82f99536..02920189 100644
--- a/java/monasca-common-hibernate/pom.xml
+++ b/java/monasca-common-hibernate/pom.xml
@@ -24,6 +24,12 @@
hibernate-core
${hibernate-core.version}
+
+ monasca-common
+ monasca-common-testing
+ ${project.version}
+ test
+
diff --git a/java/monasca-common-hibernate/src/main/java/monasca/common/hibernate/db/SubAlarmDb.java b/java/monasca-common-hibernate/src/main/java/monasca/common/hibernate/db/SubAlarmDb.java
index 07235076..749fe2e8 100644
--- a/java/monasca-common-hibernate/src/main/java/monasca/common/hibernate/db/SubAlarmDb.java
+++ b/java/monasca-common-hibernate/src/main/java/monasca/common/hibernate/db/SubAlarmDb.java
@@ -1,5 +1,6 @@
/*
* Copyright 2015 FUJITSU LIMITED
+ * (C) Copyright 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
@@ -14,10 +15,14 @@
*/
package monasca.common.hibernate.db;
+import monasca.common.model.alarm.AlarmState;
+
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
@@ -67,30 +72,54 @@ public class SubAlarmDb
@Column(name = "expression", nullable = false, length = 16777215)
private String expression = DEFAULT_EXPRESSION;
+ @Column(name = "state")
+ @Enumerated(EnumType.STRING)
+ private AlarmState state;
+
public SubAlarmDb() {
super();
}
+ /** This constructor will be deleted once the API tests have changed to no longer use it */
public SubAlarmDb(String id,
AlarmDb alarm,
String expression,
DateTime created_at,
DateTime updated_at) {
- this(id, alarm, null, expression, created_at, updated_at);
- this.alarm = alarm;
- this.expression = expression;
+ this(id, alarm, null, expression, AlarmState.OK, created_at, updated_at);
}
+ public SubAlarmDb(String id,
+ AlarmDb alarm,
+ String expression,
+ AlarmState state,
+ DateTime created_at,
+ DateTime updated_at) {
+ this(id, alarm, null, expression, state, created_at, updated_at);
+ }
+
+ /** This constructor will be deleted once the API tests have changed to no longer use it */
public SubAlarmDb(String id,
AlarmDb alarm,
SubAlarmDefinitionDb subExpression,
String expression,
DateTime created_at,
DateTime updated_at) {
+ this(id, alarm, subExpression, expression, AlarmState.OK, created_at, updated_at);
+ }
+
+ public SubAlarmDb(String id,
+ AlarmDb alarm,
+ SubAlarmDefinitionDb subExpression,
+ String expression,
+ AlarmState state,
+ DateTime created_at,
+ DateTime updated_at) {
super(id, created_at, updated_at);
this.alarm = alarm;
this.subExpression = subExpression;
this.expression = expression;
+ this.state = state;
}
public SubAlarmDb setExpression(final String expression) {
@@ -125,6 +154,15 @@ public class SubAlarmDb
return this.expression;
}
+ public AlarmState getState() {
+ return state;
+ }
+
+ public SubAlarmDb setState(AlarmState state) {
+ this.state = state;
+ return this;
+ }
+
public interface Queries {
String BY_ALARMDEFINITION_ID = "SubAlarm.byAlarmDefinitionId";
String BY_ALARM_ID = "SubAlarm.byAlarmId";
diff --git a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AggregateFunction.java b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AggregateFunction.java
index 3fe6beda..0d89f982 100644
--- a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AggregateFunction.java
+++ b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AggregateFunction.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014, 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,15 +17,17 @@
package monasca.common.model.alarm;
import com.fasterxml.jackson.annotation.JsonCreator;
+
import monasca.common.util.stats.Statistic;
import monasca.common.util.stats.Statistics.Average;
import monasca.common.util.stats.Statistics.Count;
+import monasca.common.util.stats.Statistics.Last;
import monasca.common.util.stats.Statistics.Max;
import monasca.common.util.stats.Statistics.Min;
import monasca.common.util.stats.Statistics.Sum;
public enum AggregateFunction {
- MIN, MAX, SUM, COUNT, AVG;
+ MIN, MAX, SUM, COUNT, AVG, LAST;
@JsonCreator
public static AggregateFunction fromJson(String text) {
@@ -48,6 +50,8 @@ public enum AggregateFunction {
return Min.class;
if (AggregateFunction.MAX.equals(this))
return Max.class;
+ if (AggregateFunction.LAST.equals(this))
+ return Last.class;
return null;
}
}
diff --git a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmExpression.java b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmExpression.java
index 23980580..c50aaed7 100644
--- a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmExpression.java
+++ b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmExpression.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014, 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
diff --git a/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4 b/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4
index 97f2ab65..ade3f3a9 100644
--- a/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4
+++ b/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014-2016 Hewlett Packard Enterprise Development LP
* Copyright 2016 FUJITSU LIMITED
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -22,7 +22,7 @@ start
: expression EOF
;
-expression
+expression
: compoundIdentifier relational_operator literal # relationalExprFwd
| function relational_operator literal ('times' repeat)? # relationalExprFuncFwd
| expression and expression # andExpr
@@ -78,6 +78,7 @@ functionType
| SUM
| CNT
| AVG
+ | LAST
;
primary
@@ -113,6 +114,7 @@ keyword
| SUM
| CNT
| AVG
+ | LAST
;
period
@@ -135,7 +137,7 @@ repeat
txt
: TXT
| keyword
- | INTEGER
+ | INTEGER
| STRING
;
@@ -166,19 +168,19 @@ GT_S
GTE
: [gG][tT][eE]
;
-
+
GTE_S
: '>='
;
-
+
AND
- : [aA][nN][dD]
+ : [aA][nN][dD]
;
-
+
AND_S
: '&&'
;
-
+
OR
: [oO][rR]
;
@@ -207,11 +209,15 @@ AVG
: [aA][vV][gG]
;
+LAST
+ : [lL][aA][sS][tT]
+ ;
+
INTEGER
: DIGIT+
;
-
-DECIMAL
+
+DECIMAL
: '-'?DIGIT+('.'DIGIT+)?
;
diff --git a/java/monasca-common-util/src/main/java/monasca/common/util/stats/SlidingWindowStats.java b/java/monasca-common-util/src/main/java/monasca/common/util/stats/SlidingWindowStats.java
index afde2bd9..96e19753 100644
--- a/java/monasca-common-util/src/main/java/monasca/common/util/stats/SlidingWindowStats.java
+++ b/java/monasca-common-util/src/main/java/monasca/common/util/stats/SlidingWindowStats.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014-2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -97,20 +97,36 @@ public class SlidingWindowStats {
/**
* Adds the {@code value} to the statistics for the slot associated with the {@code timestamp} and
- * returns true, else returns false if the {@code timestamp} is outside of the window.
+ * returns true, else returns false if the {@code timestamp} is outside of the window and
+ * {@code force} is false. If {@code force} is true, always add value
*
* @param value to add
* @param timestamp to add value for
+ * @param force if true, add value to first window even if timestamp is outside of all windows
* @return true if the value was added else false if it the {@code timestamp} was outside the
- * window
+ * window and force was false
+ */
+ public boolean addValue(double value, long timestamp, boolean force) {
+ int index = indexOfTime(timescale.adjust(timestamp));
+ if (index == -1) {
+ if (force) {
+ index = 0;
+ } else {
+ return false;
+ }
+ }
+ slots[index].stat.addValue(value, timestamp);
+ return true;
+ }
+
+ /**
+ * This will be deleted when all uses have changed to use the above method
+ * @param value
+ * @param timestamp
+ * @return
*/
public boolean addValue(double value, long timestamp) {
- timestamp = timescale.adjust(timestamp);
- int index = indexOfTime(timestamp);
- if (index == -1)
- return false;
- slots[index].stat.addValue(value);
- return true;
+ return addValue(value, timestamp, false);
}
/** Returns the number of slots in the window. */
diff --git a/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistic.java b/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistic.java
index 8769d894..a78412cc 100644
--- a/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistic.java
+++ b/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistic.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014, 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ package monasca.common.util.stats;
*/
public interface Statistic {
/** Adds the {@code value} to the statistic. */
- void addValue(double value);
+ void addValue(double value, double timestamp);
/** Returns true if the statistic has been initialized with a value, else false. */
boolean isInitialized();
diff --git a/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistics.java b/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistics.java
index ec7aa650..7ada2564 100644
--- a/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistics.java
+++ b/java/monasca-common-util/src/main/java/monasca/common/util/stats/Statistics.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014, 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -50,8 +50,8 @@ public final class Statistics {
protected int count;
@Override
- public void addValue(double value) {
- super.addValue(value);
+ public void addValue(double value, double timestamp) {
+ super.addValue(value, timestamp);
this.count++;
}
@@ -69,7 +69,7 @@ public final class Statistics {
public static class Count extends AbstractStatistic {
@Override
- public void addValue(double value) {
+ public void addValue(double value, double timestamp) {
initialized = true;
this.value++;
}
@@ -77,7 +77,7 @@ public final class Statistics {
public static class Max extends AbstractStatistic {
@Override
- public void addValue(double value) {
+ public void addValue(double value, double timestamp) {
if (!initialized) {
initialized = true;
this.value = value;
@@ -88,7 +88,7 @@ public final class Statistics {
public static class Min extends AbstractStatistic {
@Override
- public void addValue(double value) {
+ public void addValue(double value, double timestamp) {
if (!initialized) {
initialized = true;
this.value = value;
@@ -99,12 +99,26 @@ public final class Statistics {
public static class Sum extends AbstractStatistic {
@Override
- public void addValue(double value) {
+ public void addValue(double value, double timestamp) {
initialized = true;
this.value += value;
}
}
+ public static class Last extends AbstractStatistic {
+ protected double lastTimestamp;
+
+ @Override
+ public void addValue(double value, double timestamp) {
+ initialized = true;
+ // Ensure older measurements don't change value
+ if (timestamp > this.lastTimestamp) {
+ this.value = value;
+ this.lastTimestamp = timestamp;
+ }
+ }
+ }
+
private Statistics() {
}
}
diff --git a/java/monasca-common-util/src/test/java/monasca/common/util/stats/SlidingWindowStatsTest.java b/java/monasca-common-util/src/test/java/monasca/common/util/stats/SlidingWindowStatsTest.java
index a5cb62be..6a582da8 100644
--- a/java/monasca-common-util/src/test/java/monasca/common/util/stats/SlidingWindowStatsTest.java
+++ b/java/monasca-common-util/src/test/java/monasca/common/util/stats/SlidingWindowStatsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014-2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
@@ -104,46 +104,46 @@ public class SlidingWindowStatsTest {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Average.class,
TimeResolution.ABSOLUTE, 60, 1, 2, 0);
- assertTrue(window.addValue(1.0, 20));
+ assertTrue(window.addValue(1.0, 20, false));
window.slideViewTo(20, 30);
- assertTrue(window.addValue(1.0, 0));
+ assertTrue(window.addValue(1.0, 0, false));
window.slideViewTo(100, 30);
- assertFalse(window.addValue(1.0, 0));
- assertTrue(window.addValue(1.0, 61));
+ assertFalse(window.addValue(1.0, 0, false));
+ assertTrue(window.addValue(1.0, 61, false));
window.slideViewTo(121, 30);
- assertTrue(window.addValue(1.0, 61));
- assertTrue(window.addValue(1.0, 121));
+ assertTrue(window.addValue(1.0, 61, false));
+ assertTrue(window.addValue(1.0, 121, false));
window.slideViewTo(180, 30);
- assertFalse(window.addValue(1.0, 61));
- assertTrue(window.addValue(1.0, 121));
- assertTrue(window.addValue(1.0, 181));
+ assertFalse(window.addValue(1.0, 61, false));
+ assertTrue(window.addValue(1.0, 121, false));
+ assertTrue(window.addValue(1.0, 181, false));
window.slideViewTo(241, 30);
- assertFalse(window.addValue(1.0, 121));
- assertTrue(window.addValue(1.0, 181));
- assertTrue(window.addValue(1.0, 241));
+ assertFalse(window.addValue(1.0, 121, false));
+ assertTrue(window.addValue(1.0, 181, false));
+ assertTrue(window.addValue(1.0, 241, false));
window.slideViewTo(360, 30);
- assertFalse(window.addValue(1.0, 241));
- assertTrue(window.addValue(1.0, 300));
- assertTrue(window.addValue(1.0, 361));
+ assertFalse(window.addValue(1.0, 241, false));
+ assertTrue(window.addValue(1.0, 300, false));
+ assertTrue(window.addValue(1.0, 361, false));
}
public void shouldAddValueAndGetWindowValues() {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Average.class,
TimeResolution.ABSOLUTE, 3, 3, 2, 9);
for (int i = 0; i < 5; i++)
- window.addValue(999, i * 3);
+ window.addValue(999, i * 3, false);
assertEquals(window.getWindowValues(), new double[] { 999, 999, 999, 999, 999 });
window.slideViewTo(12, 1);
assertEquals(window.getWindowValues(), new double[] { 999, 999, 999, 999, Double.NaN });
- window.addValue(888, 17);
+ window.addValue(888, 17, false);
assertEquals(window.getWindowValues(), new double[] { 999, 999, 999, 999, 888 });
}
@@ -151,20 +151,42 @@ public class SlidingWindowStatsTest {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Average.class,
TimeResolution.ABSOLUTE, 3, 3, 2, 9);
for (int i = 0; i < 5; i++)
- window.addValue(999, i * 3);
+ window.addValue(999, i * 3, false);
assertEquals(window.getViewValues(), new double[] { 999, 999, 999 });
window.slideViewTo(15, 1);
assertEquals(window.getViewValues(), new double[] { 999, 999, 999 });
- window.addValue(777, 15);
- window.addValue(888, 18);
+ window.addValue(777, 15, false);
+ window.addValue(888, 18, false);
assertEquals(window.getViewValues(), new double[] { 999, 999, 999 });
window.slideViewTo(21, 1);
assertEquals(window.getViewValues(), new double[] { 999, 777, 888 });
}
+ public void shouldAddOutOfWindowValueWithForce() {
+ SlidingWindowStats window = new SlidingWindowStats(Statistics.Last.class,
+ TimeResolution.ABSOLUTE, 3, 1, 2, 9);
+ window.addValue(999, 3, true);
+ assertEquals(window.getViewValues(), new double[] { 999 });
+ }
+
+ public void shouldNotAddOutOfWindowValueWithoutForce() {
+ SlidingWindowStats window = new SlidingWindowStats(Statistics.Average.class,
+ TimeResolution.ABSOLUTE, 3, 1, 2, 9);
+ window.addValue(999, 3, false);
+ assertEquals(window.getViewValues(), new double[] { Double.NaN });
+ }
+
+ public void shouldIgnoreOutOfOrderValue() {
+ SlidingWindowStats window = new SlidingWindowStats(Statistics.Last.class,
+ TimeResolution.ABSOLUTE, 3, 1, 2, 9);
+ window.addValue(999, 3, true);
+ window.addValue(998, 2, true);
+ assertEquals(window.getViewValues(), new double[] { 999 });
+ }
+
public void testIndexOfTime() {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Average.class,
TimeResolution.ABSOLUTE, 3, 3, 2, 15);
@@ -208,9 +230,9 @@ public class SlidingWindowStatsTest {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Sum.class,
TimeResolution.ABSOLUTE, 5, 3, 2, 20);
// Logical window is 5 10 15
- window.addValue(2, 5);
- window.addValue(3, 10);
- window.addValue(4, 15);
+ window.addValue(2, 5, false);
+ window.addValue(3, 10, false);
+ window.addValue(4, 15, false);
assertEquals(window.getValue(5), 2.0);
assertEquals(window.getValue(10), 3.0);
@@ -218,7 +240,7 @@ public class SlidingWindowStatsTest {
// Slide logical window to 10 15 20
window.slideViewTo(25, 1);
- window.addValue(5, 24);
+ window.addValue(5, 24, false);
assertEquals(window.getValue(10), 3.0);
assertEquals(window.getValue(15), 4.0);
@@ -264,9 +286,9 @@ public class SlidingWindowStatsTest {
SlidingWindowStats window = new SlidingWindowStats(Statistics.Sum.class,
TimeResolution.ABSOLUTE, 5, 3, 2, 20);
// Window is 5 10 15 20 25
- window.addValue(2, 5);
- window.addValue(3, 10);
- window.addValue(4, 15);
+ window.addValue(2, 5, false);
+ window.addValue(3, 10, false);
+ window.addValue(4, 15, false);
assertEquals(window.getValuesUpTo(20), new double[] { 2, 3, 4, Double.NaN });
assertEquals(window.getValuesUpTo(18), new double[] { 2, 3, 4 });
@@ -275,14 +297,14 @@ public class SlidingWindowStatsTest {
// Window is 30 10 15 20 25
window.slideViewTo(22, 1);
- window.addValue(5, 22);
+ window.addValue(5, 22, false);
assertEquals(window.getValuesUpTo(22), new double[] { 3, 4, 5 });
assertEquals(window.getValuesUpTo(15), new double[] { 3, 4 });
assertEquals(window.getValuesUpTo(12), new double[] { 3 });
// Window is 30 35 15 20 25
window.slideViewTo(27, 1);
- window.addValue(6, 26);
+ window.addValue(6, 26, false);
assertEquals(window.getValuesUpTo(27), new double[] { 4, 5, 6 });
assertEquals(window.getValuesUpTo(24), new double[] { 4, 5 });
assertEquals(window.getValuesUpTo(18), new double[] { 4 });
diff --git a/java/monasca-common-util/src/test/java/monasca/common/util/stats/StatisticsTest.java b/java/monasca-common-util/src/test/java/monasca/common/util/stats/StatisticsTest.java
index e545c584..01b07b4f 100644
--- a/java/monasca-common-util/src/test/java/monasca/common/util/stats/StatisticsTest.java
+++ b/java/monasca-common-util/src/test/java/monasca/common/util/stats/StatisticsTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
+ * (C) Copyright 2014, 2016 Hewlett Packard Enterprise Development LP
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
@@ -20,6 +20,7 @@ import org.testng.annotations.Test;
import monasca.common.util.stats.Statistics.Average;
import monasca.common.util.stats.Statistics.Count;
+import monasca.common.util.stats.Statistics.Last;
import monasca.common.util.stats.Statistics.Max;
import monasca.common.util.stats.Statistics.Min;
import monasca.common.util.stats.Statistics.Sum;
@@ -29,13 +30,13 @@ public class StatisticsTest {
@DataProvider(name = "metricTypes")
public Object[][] createData1() {
return new Object[][] { { new Average(), 3 }, { new Sum(), 6 }, { new Min(), 2 },
- { new Max(), 4 }, { new Count(), 2 }, };
+ { new Max(), 4 }, { new Count(), 2 }, { new Last(), 4 }};
}
@Test(dataProvider = "metricTypes")
public void testStat(Statistic stat, double expectedValue) {
- stat.addValue(2);
- stat.addValue(4);
+ stat.addValue(2, 1);
+ stat.addValue(4, 2);
assertEquals(stat.value(), expectedValue, stat.getClass().getName());
}
}