Skip to content

Commit

Permalink
Fix group calculations to use GroupItem's system unit (#4563)
Browse files Browse the repository at this point in the history
* QuantityType improve group calculations
* support inverse units, extend tests
* refactoring
* javadoc and code simplification
* use streams; make sums absolute

Signed-off-by: Andrew Fiddian-Green <software@whitebear.ch>
  • Loading branch information
andrewfg authored Feb 15, 2025
1 parent 3a30c7a commit 5b28e6f
Show file tree
Hide file tree
Showing 3 changed files with 343 additions and 183 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import java.util.ArrayList;
import java.util.List;

import javax.measure.Quantity;
import javax.measure.Unit;

import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
Expand Down Expand Up @@ -48,13 +48,12 @@ public class GroupFunctionHelper {
* arithmetic group function will take unit conversion into account.
*
* @param function the {@link GroupFunctionDTO} describing the group function.
* @param baseItem an optional {@link Item} defining the dimension for unit conversion.
* @param baseItem an optional {@link Item} defining the dimension/unit for unit conversion.
* @return a {@link GroupFunction} according to the given parameters.
*/
public GroupFunction createGroupFunction(GroupFunctionDTO function, @Nullable Item baseItem) {
Class<? extends Quantity<?>> dimension = getDimension(baseItem);
if (dimension != null) {
return createDimensionGroupFunction(function, baseItem, dimension);
if (baseItem instanceof NumberItem baseNumberItem && baseNumberItem.getDimension() != null) {
return createDimensionGroupFunction(function, baseNumberItem);
}
return createDefaultGroupFunction(function, baseItem);
}
Expand All @@ -78,30 +77,25 @@ private List<State> parseStates(@Nullable Item baseItem, String @Nullable [] par
return states;
}

private @Nullable Class<? extends Quantity<?>> getDimension(@Nullable Item baseItem) {
if (baseItem instanceof NumberItem numberItem) {
return numberItem.getDimension();
}
return null;
}

private GroupFunction createDimensionGroupFunction(GroupFunctionDTO function, @Nullable Item baseItem,
Class<? extends Quantity<?>> dimension) {
private GroupFunction createDimensionGroupFunction(GroupFunctionDTO function, NumberItem baseItem) {
final String functionName = function.name;
switch (functionName.toUpperCase()) {
case "AVG":
return new QuantityTypeArithmeticGroupFunction.Avg(dimension);
case "MEDIAN":
return new QuantityTypeArithmeticGroupFunction.Median(dimension, baseItem);
case "SUM":
return new QuantityTypeArithmeticGroupFunction.Sum(dimension);
case "MIN":
return new QuantityTypeArithmeticGroupFunction.Min(dimension);
case "MAX":
return new QuantityTypeArithmeticGroupFunction.Max(dimension);
default:
return createDefaultGroupFunction(function, baseItem);
Unit<?> baseItemUnit = baseItem.getUnit();
if (baseItemUnit != null) {
switch (functionName.toUpperCase()) {
case "AVG":
return new QuantityTypeArithmeticGroupFunction.Avg(baseItemUnit);
case "MEDIAN":
return new QuantityTypeArithmeticGroupFunction.Median(baseItemUnit);
case "SUM":
return new QuantityTypeArithmeticGroupFunction.Sum(baseItemUnit);
case "MIN":
return new QuantityTypeArithmeticGroupFunction.Min(baseItemUnit);
case "MAX":
return new QuantityTypeArithmeticGroupFunction.Max(baseItemUnit);
default:
}
}
return createDefaultGroupFunction(function, baseItem);
}

private GroupFunction createDefaultGroupFunction(GroupFunctionDTO function, @Nullable Item baseItem) {
Expand Down
Loading

0 comments on commit 5b28e6f

Please sign in to comment.