Skip to content

Commit 04c127f

Browse files
authored
Merge pull request #3329 from tynanford/total_array_formula
Add new formula function - arrayTotal
2 parents af8d0fd + f6d8942 commit 04c127f

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

core/formula/doc/index.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ element is defined as pow(array[x], exponent).
126126
**arraySum(VNumberArray array, VNumber offset)** - Returns a VNumberArray where each
127127
element is defined as array[x] + offset. To subtract, use negative offset.
128128

129+
**arrayTotal(VNumberArray array)** - Returns the sum of all elements in the input array.
130+
129131
**elementAt([VNumberArray | VStringArray] array , VNumber index)** - Returns a VNumber
130132
or VString at the specified index of the input array. If the index is invalid, a NaN or
131133
empty string is returned.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.csstudio.apputil.formula.array;
2+
3+
import org.epics.util.array.ListNumber;
4+
import org.epics.vtype.Alarm;
5+
import org.epics.vtype.Display;
6+
import org.epics.vtype.Time;
7+
import org.epics.vtype.VNumber;
8+
import org.epics.vtype.VNumberArray;
9+
import org.epics.vtype.VType;
10+
import org.phoebus.core.vtypes.VTypeHelper;
11+
12+
import java.util.List;
13+
14+
/**
15+
* Sums all elements in an array and returns a single number.
16+
*/
17+
public class ArrayTotalFunction extends BaseArrayFunction {
18+
19+
@Override
20+
public String getName() {
21+
return "arrayTotal";
22+
}
23+
24+
@Override
25+
public String getDescription() {
26+
return "Returns the sum of all elements in the array.";
27+
}
28+
29+
@Override
30+
public List<String> getArguments() {
31+
return List.of("array");
32+
}
33+
34+
@Override
35+
public VType compute(VType... args) {
36+
if (VTypeHelper.isNumericArray(args[0])) {
37+
VNumberArray array = (VNumberArray) args[0];
38+
ListNumber data = array.getData();
39+
double sum = 0.0;
40+
for (int i = 0; i < data.size(); i++) {
41+
sum += data.getDouble(i);
42+
}
43+
return VNumber.of(sum, Alarm.none(), Time.now(), Display.none());
44+
}
45+
else {
46+
return DEFAULT_NAN_DOUBLE;
47+
}
48+
}
49+
}

core/formula/src/main/resources/META-INF/services/org.csstudio.apputil.formula.spi.FormulaFunction

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ org.csstudio.apputil.formula.array.SubArrayFunction
5151
org.csstudio.apputil.formula.array.ElementAtNumberFunction
5252
org.csstudio.apputil.formula.array.HistogramOfFunction
5353
org.csstudio.apputil.formula.array.ArraySumFunction
54+
org.csstudio.apputil.formula.array.ArrayTotalFunction
5455
org.csstudio.apputil.formula.array.ArrayPowFunction
5556
org.csstudio.apputil.formula.array.ArrayMultiplicationFunction
5657
org.csstudio.apputil.formula.array.ArrayDivisionFunction
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.csstudio.apputil.formula.array;
2+
3+
import org.epics.util.array.ArrayDouble;
4+
import org.epics.vtype.Alarm;
5+
import org.epics.vtype.Display;
6+
import org.epics.vtype.Time;
7+
import org.epics.vtype.VNumberArray;
8+
import org.epics.vtype.VNumber;
9+
import org.epics.vtype.VType;
10+
import org.junit.jupiter.api.Test;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class ArrayTotalFunctionTest {
15+
16+
@Test
17+
public void compute() {
18+
ArrayTotalFunction totalArrayFunction = new ArrayTotalFunction();
19+
20+
assertEquals("arrayTotal", totalArrayFunction.getName());
21+
assertEquals("array", totalArrayFunction.getCategory());
22+
23+
VType array = VNumberArray.of(ArrayDouble.of(1.0, 2.0, 3.0), Alarm.none(), Time.now(), Display.none());
24+
25+
VNumber result = (VNumber)totalArrayFunction.compute(array);
26+
assertEquals(6.0, result.getValue());
27+
28+
array = VNumberArray.of(ArrayDouble.of(1.0, 2.0, 3.0, Double.NaN), Alarm.none(), Time.now(), Display.none());
29+
result = (VNumber)totalArrayFunction.compute(array);
30+
assertEquals(Double.NaN, result.getValue());
31+
32+
array = VNumberArray.of(ArrayDouble.of(1.0, 2.0, 3.0, -6.0), Alarm.none(), Time.now(), Display.none());
33+
result = (VNumber)totalArrayFunction.compute(array);
34+
assertEquals(0.0, result.getValue());
35+
}
36+
}

0 commit comments

Comments
 (0)