mirror of
https://github.com/Kingsrook/qqq.git
synced 2025-07-18 05:01:07 +00:00
Update RDBMS Aggregates to return INTEGER for COUNT on temporal field types
This commit is contained in:
@ -120,6 +120,16 @@ public enum QFieldType
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
public boolean isTemporal()
|
||||||
|
{
|
||||||
|
return this == QFieldType.DATE || this == QFieldType.DATE_TIME || this == QFieldType.TIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
@ -159,6 +159,10 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega
|
|||||||
{
|
{
|
||||||
fieldType = QFieldType.DECIMAL;
|
fieldType = QFieldType.DECIMAL;
|
||||||
}
|
}
|
||||||
|
else if(field.getType().isTemporal() && (aggregate.getOperator().equals(AggregateOperator.COUNT)) || aggregate.getOperator().equals(AggregateOperator.COUNT_DISTINCT))
|
||||||
|
{
|
||||||
|
fieldType = QFieldType.INTEGER;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fieldType != null)
|
if(fieldType != null)
|
||||||
|
@ -23,6 +23,7 @@ package com.kingsrook.qqq.backend.module.rdbms.actions;
|
|||||||
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
|
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
|
||||||
@ -42,13 +43,16 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy;
|
|||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
|
||||||
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin;
|
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin;
|
||||||
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
import com.kingsrook.qqq.backend.core.model.data.QRecord;
|
||||||
|
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
|
||||||
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
|
||||||
import com.kingsrook.qqq.backend.core.model.session.QSession;
|
import com.kingsrook.qqq.backend.core.model.session.QSession;
|
||||||
|
import com.kingsrook.qqq.backend.core.utils.ExceptionUtils;
|
||||||
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
|
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
|
||||||
import org.junit.jupiter.api.Assertions;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Disabled;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertNull;
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
@ -83,20 +87,56 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
Aggregate averageOfDaysWorked = new Aggregate("daysWorked", AggregateOperator.AVG);
|
Aggregate averageOfDaysWorked = new Aggregate("daysWorked", AggregateOperator.AVG);
|
||||||
Aggregate maxAnnualSalary = new Aggregate("annualSalary", AggregateOperator.MAX);
|
Aggregate maxAnnualSalary = new Aggregate("annualSalary", AggregateOperator.MAX);
|
||||||
Aggregate minFirstName = new Aggregate("firstName", AggregateOperator.MIN);
|
Aggregate minFirstName = new Aggregate("firstName", AggregateOperator.MIN);
|
||||||
|
Aggregate countOfBirthDate = new Aggregate("birthDate", AggregateOperator.COUNT);
|
||||||
aggregateInput.withAggregate(countOfId);
|
aggregateInput.withAggregate(countOfId);
|
||||||
aggregateInput.withAggregate(sumOfId);
|
aggregateInput.withAggregate(sumOfId);
|
||||||
aggregateInput.withAggregate(averageOfDaysWorked);
|
aggregateInput.withAggregate(averageOfDaysWorked);
|
||||||
aggregateInput.withAggregate(maxAnnualSalary);
|
aggregateInput.withAggregate(maxAnnualSalary);
|
||||||
aggregateInput.withAggregate(minFirstName);
|
aggregateInput.withAggregate(minFirstName);
|
||||||
|
aggregateInput.withAggregate(countOfBirthDate);
|
||||||
|
|
||||||
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
|
|
||||||
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals(5, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(5, aggregateResult.getAggregateValue(countOfId));
|
||||||
Assertions.assertEquals(15, aggregateResult.getAggregateValue(sumOfId));
|
assertEquals(15, aggregateResult.getAggregateValue(sumOfId));
|
||||||
Assertions.assertEquals(new BigDecimal("96.4"), aggregateResult.getAggregateValue(averageOfDaysWorked));
|
assertEquals(new BigDecimal("96.4"), aggregateResult.getAggregateValue(averageOfDaysWorked));
|
||||||
Assertions.assertEquals(new BigDecimal("1000000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
|
assertEquals(new BigDecimal("1000000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
|
||||||
Assertions.assertEquals("Darin", aggregateResult.getAggregateValue(minFirstName));
|
assertEquals("Darin", aggregateResult.getAggregateValue(minFirstName));
|
||||||
|
assertEquals(4, aggregateResult.getAggregateValue(countOfBirthDate));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
@Test
|
||||||
|
@Disabled("Interesting to see effects of all operators on all types, but failures are expected (e.g., avg(string), so not for CI.")
|
||||||
|
void testOperatorsCrossTypes()
|
||||||
|
{
|
||||||
|
List<String> failures = new ArrayList<>();
|
||||||
|
for(QFieldMetaData field : QContext.getQInstance().getTable(TestUtils.TABLE_NAME_PERSON).getFields().values())
|
||||||
|
{
|
||||||
|
for(AggregateOperator aggregateOperator : AggregateOperator.values())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
AggregateInput aggregateInput = initAggregateRequest();
|
||||||
|
Aggregate aggregate = new Aggregate(field.getName(), aggregateOperator);
|
||||||
|
aggregateInput.withAggregate(aggregate);
|
||||||
|
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
|
assertNotNull(aggregateResult.getAggregateValue(aggregate));
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
failures.add(ExceptionUtils.getRootException(e).getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
failures.forEach(System.out::println);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -123,11 +163,11 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
|
|
||||||
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
||||||
Assertions.assertEquals(5, aggregateResult.getAggregateValue(sumOfId));
|
assertEquals(5, aggregateResult.getAggregateValue(sumOfId));
|
||||||
Assertions.assertEquals(new BigDecimal("62.0"), aggregateResult.getAggregateValue(averageOfDaysWorked));
|
assertEquals(new BigDecimal("62.0"), aggregateResult.getAggregateValue(averageOfDaysWorked));
|
||||||
Assertions.assertEquals(new BigDecimal("26000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
|
assertEquals(new BigDecimal("26000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
|
||||||
Assertions.assertEquals("James", aggregateResult.getAggregateValue(minFirstName));
|
assertEquals("James", aggregateResult.getAggregateValue(minFirstName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -156,15 +196,15 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
{
|
{
|
||||||
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
||||||
Assertions.assertEquals(17, aggregateResult.getAggregateValue(sumOfDaysWorked));
|
assertEquals(17, aggregateResult.getAggregateValue(sumOfDaysWorked));
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
AggregateResult aggregateResult = aggregateOutput.getResults().get(1);
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(1);
|
||||||
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(4, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(4, aggregateResult.getAggregateValue(countOfId));
|
||||||
Assertions.assertEquals(11364, aggregateResult.getAggregateValue(sumOfDaysWorked));
|
assertEquals(11364, aggregateResult.getAggregateValue(sumOfDaysWorked));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,29 +241,29 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
AggregateResult aggregateResult;
|
AggregateResult aggregateResult;
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals("Donny", aggregateResult.getGroupByValue(firstNameGroupBy));
|
assertEquals("Donny", aggregateResult.getGroupByValue(firstNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals("Tim", aggregateResult.getGroupByValue(firstNameGroupBy));
|
assertEquals("Tim", aggregateResult.getGroupByValue(firstNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals("Aaron", aggregateResult.getGroupByValue(firstNameGroupBy));
|
assertEquals("Aaron", aggregateResult.getGroupByValue(firstNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals("Darin", aggregateResult.getGroupByValue(firstNameGroupBy));
|
assertEquals("Darin", aggregateResult.getGroupByValue(firstNameGroupBy));
|
||||||
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals("Trevor", aggregateResult.getGroupByValue(firstNameGroupBy));
|
assertEquals("Trevor", aggregateResult.getGroupByValue(firstNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -255,24 +295,24 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
AggregateResult aggregateResult;
|
AggregateResult aggregateResult;
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(4, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(4, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Richardson", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Richardson", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Maes", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Maes", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Samples", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Samples", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
aggregateResult = iterator.next();
|
aggregateResult = iterator.next();
|
||||||
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
|
||||||
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -293,7 +333,7 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals(0, aggregateResult.getAggregateValue(countOfId));
|
assertEquals(0, aggregateResult.getAggregateValue(countOfId));
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// but re-run w/ a group-by -- then, if no rows are found, there are 0 result objects. //
|
// but re-run w/ a group-by -- then, if no rows are found, there are 0 result objects. //
|
||||||
@ -324,12 +364,12 @@ public class RDBMSAggregateActionTest extends RDBMSActionTest
|
|||||||
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_STORE_ALL_ACCESS, true));
|
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_STORE_ALL_ACCESS, true));
|
||||||
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
aggregateResult = aggregateOutput.getResults().get(0);
|
aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals(43, aggregateResult.getAggregateValue(sumOfQuantity));
|
assertEquals(43, aggregateResult.getAggregateValue(sumOfQuantity));
|
||||||
|
|
||||||
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.TABLE_NAME_STORE, 1));
|
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.TABLE_NAME_STORE, 1));
|
||||||
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
|
||||||
aggregateResult = aggregateOutput.getResults().get(0);
|
aggregateResult = aggregateOutput.getResults().get(0);
|
||||||
Assertions.assertEquals(33, aggregateResult.getAggregateValue(sumOfQuantity));
|
assertEquals(33, aggregateResult.getAggregateValue(sumOfQuantity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user