mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 21:20:45 +00:00
CE-881 - Update aggregates to include dates, plus product, variance, and standard deviation
This commit is contained in:
@ -23,6 +23,9 @@ package com.kingsrook.qqq.backend.core.utils.aggregates;
|
||||
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.Month;
|
||||
import com.kingsrook.qqq.backend.core.BaseTest;
|
||||
import org.assertj.core.data.Offset;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@ -78,6 +81,12 @@ class AggregatesTest extends BaseTest
|
||||
assertEquals(15, aggregates.getMax());
|
||||
assertEquals(30, aggregates.getSum());
|
||||
assertThat(aggregates.getAverage()).isCloseTo(new BigDecimal("10"), Offset.offset(BigDecimal.ZERO));
|
||||
|
||||
assertEquals(new BigDecimal("750"), aggregates.getProduct());
|
||||
assertEquals(new BigDecimal("25.0000"), aggregates.getVariance());
|
||||
assertEquals(new BigDecimal("5.0000"), aggregates.getStandardDeviation());
|
||||
assertThat(aggregates.getVarP()).isCloseTo(new BigDecimal("16.6667"), Offset.offset(new BigDecimal(".0001")));
|
||||
assertThat(aggregates.getStdDevP()).isCloseTo(new BigDecimal("4.0824"), Offset.offset(new BigDecimal(".0001")));
|
||||
}
|
||||
|
||||
|
||||
@ -89,6 +98,7 @@ class AggregatesTest extends BaseTest
|
||||
void testBigDecimal()
|
||||
{
|
||||
BigDecimalAggregates aggregates = new BigDecimalAggregates();
|
||||
aggregates.add(null);
|
||||
|
||||
assertEquals(0, aggregates.getCount());
|
||||
assertNull(aggregates.getMin());
|
||||
@ -114,13 +124,117 @@ class AggregatesTest extends BaseTest
|
||||
|
||||
BigDecimal bd148 = new BigDecimal("14.8");
|
||||
aggregates.add(bd148);
|
||||
|
||||
aggregates.add(null);
|
||||
assertEquals(3, aggregates.getCount());
|
||||
assertEquals(bd51, aggregates.getMin());
|
||||
assertEquals(bd148, aggregates.getMax());
|
||||
assertEquals(new BigDecimal("30.0"), aggregates.getSum());
|
||||
assertThat(aggregates.getAverage()).isCloseTo(new BigDecimal("10.0"), Offset.offset(BigDecimal.ZERO));
|
||||
|
||||
assertEquals(new BigDecimal("762.348"), aggregates.getProduct());
|
||||
assertEquals(new BigDecimal("23.5300"), aggregates.getVariance());
|
||||
assertEquals(new BigDecimal("4.8508"), aggregates.getStandardDeviation());
|
||||
assertThat(aggregates.getVarP()).isCloseTo(new BigDecimal("15.6867"), Offset.offset(new BigDecimal(".0001")));
|
||||
assertThat(aggregates.getStdDevP()).isCloseTo(new BigDecimal("3.9606"), Offset.offset(new BigDecimal(".0001")));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testInstant()
|
||||
{
|
||||
InstantAggregates aggregates = new InstantAggregates();
|
||||
|
||||
assertEquals(0, aggregates.getCount());
|
||||
assertNull(aggregates.getMin());
|
||||
assertNull(aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertNull(aggregates.getAverage());
|
||||
|
||||
Instant i1970 = Instant.parse("1970-01-01T00:00:00Z");
|
||||
aggregates.add(i1970);
|
||||
assertEquals(1, aggregates.getCount());
|
||||
assertEquals(i1970, aggregates.getMin());
|
||||
assertEquals(i1970, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(i1970, aggregates.getAverage());
|
||||
|
||||
Instant i1980 = Instant.parse("1980-01-01T00:00:00Z");
|
||||
aggregates.add(i1980);
|
||||
assertEquals(2, aggregates.getCount());
|
||||
assertEquals(i1970, aggregates.getMin());
|
||||
assertEquals(i1980, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(Instant.parse("1975-01-01T00:00:00Z"), aggregates.getAverage());
|
||||
|
||||
Instant i1990 = Instant.parse("1990-01-01T00:00:00Z");
|
||||
aggregates.add(i1990);
|
||||
assertEquals(3, aggregates.getCount());
|
||||
assertEquals(i1970, aggregates.getMin());
|
||||
assertEquals(i1990, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(Instant.parse("1980-01-01T08:00:00Z"), aggregates.getAverage()); // a leap day throws this off by 8 hours :)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// assert we gracefully return null for these ops we don't support //
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
assertNull(aggregates.getProduct());
|
||||
assertNull(aggregates.getVariance());
|
||||
assertNull(aggregates.getStandardDeviation());
|
||||
assertNull(aggregates.getVarP());
|
||||
assertNull(aggregates.getStdDevP());
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
**
|
||||
*******************************************************************************/
|
||||
@Test
|
||||
void testLocalDate()
|
||||
{
|
||||
LocalDateAggregates aggregates = new LocalDateAggregates();
|
||||
|
||||
assertEquals(0, aggregates.getCount());
|
||||
assertNull(aggregates.getMin());
|
||||
assertNull(aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertNull(aggregates.getAverage());
|
||||
|
||||
LocalDate ld1970 = LocalDate.of(1970, Month.JANUARY, 1);
|
||||
aggregates.add(ld1970);
|
||||
assertEquals(1, aggregates.getCount());
|
||||
assertEquals(ld1970, aggregates.getMin());
|
||||
assertEquals(ld1970, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(ld1970, aggregates.getAverage());
|
||||
|
||||
LocalDate ld1980 = LocalDate.of(1980, Month.JANUARY, 1);
|
||||
aggregates.add(ld1980);
|
||||
assertEquals(2, aggregates.getCount());
|
||||
assertEquals(ld1970, aggregates.getMin());
|
||||
assertEquals(ld1980, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(LocalDate.of(1975, Month.JANUARY, 1), aggregates.getAverage());
|
||||
|
||||
LocalDate ld1990 = LocalDate.of(1990, Month.JANUARY, 1);
|
||||
aggregates.add(ld1990);
|
||||
assertEquals(3, aggregates.getCount());
|
||||
assertEquals(ld1970, aggregates.getMin());
|
||||
assertEquals(ld1990, aggregates.getMax());
|
||||
assertNull(aggregates.getSum());
|
||||
assertEquals(ld1980, aggregates.getAverage());
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// assert we gracefully return null for these ops we don't support //
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
assertNull(aggregates.getProduct());
|
||||
assertNull(aggregates.getVariance());
|
||||
assertNull(aggregates.getStandardDeviation());
|
||||
assertNull(aggregates.getVarP());
|
||||
assertNull(aggregates.getStdDevP());
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user