Skip to content

Commit f9cd437

Browse files
committed
Update RDBMS Aggregates to return INTEGER for COUNT on temporal field types
1 parent b028187 commit f9cd437

File tree

3 files changed

+99
-45
lines changed

3 files changed

+99
-45
lines changed

qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldType.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,16 @@ public boolean isNumeric()
120120

121121

122122

123+
/*******************************************************************************
124+
**
125+
*******************************************************************************/
126+
public boolean isTemporal()
127+
{
128+
return this == QFieldType.DATE || this == QFieldType.DATE_TIME || this == QFieldType.TIME;
129+
}
130+
131+
132+
123133
/*******************************************************************************
124134
**
125135
*******************************************************************************/

qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,10 @@ public AggregateOutput execute(AggregateInput aggregateInput) throws QException
159159
{
160160
fieldType = QFieldType.DECIMAL;
161161
}
162+
else if(field.getType().isTemporal() && (aggregate.getOperator().equals(AggregateOperator.COUNT)) || aggregate.getOperator().equals(AggregateOperator.COUNT_DISTINCT))
163+
{
164+
fieldType = QFieldType.INTEGER;
165+
}
162166
}
163167

164168
if(fieldType != null)

qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateActionTest.java

Lines changed: 85 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424

2525
import java.math.BigDecimal;
26+
import java.util.ArrayList;
2627
import java.util.Iterator;
2728
import java.util.List;
2829
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
@@ -42,13 +43,16 @@
4243
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
4344
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin;
4445
import com.kingsrook.qqq.backend.core.model.data.QRecord;
46+
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData;
4547
import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType;
4648
import com.kingsrook.qqq.backend.core.model.session.QSession;
49+
import com.kingsrook.qqq.backend.core.utils.ExceptionUtils;
4750
import com.kingsrook.qqq.backend.module.rdbms.TestUtils;
48-
import org.junit.jupiter.api.Assertions;
4951
import org.junit.jupiter.api.BeforeEach;
52+
import org.junit.jupiter.api.Disabled;
5053
import org.junit.jupiter.api.Test;
5154
import static org.junit.jupiter.api.Assertions.assertEquals;
55+
import static org.junit.jupiter.api.Assertions.assertNotNull;
5256
import static org.junit.jupiter.api.Assertions.assertNull;
5357
import static org.junit.jupiter.api.Assertions.assertTrue;
5458
import static org.junit.jupiter.api.Assertions.fail;
@@ -83,20 +87,56 @@ public void testUnfilteredNoGroupBy() throws QException
8387
Aggregate averageOfDaysWorked = new Aggregate("daysWorked", AggregateOperator.AVG);
8488
Aggregate maxAnnualSalary = new Aggregate("annualSalary", AggregateOperator.MAX);
8589
Aggregate minFirstName = new Aggregate("firstName", AggregateOperator.MIN);
90+
Aggregate countOfBirthDate = new Aggregate("birthDate", AggregateOperator.COUNT);
8691
aggregateInput.withAggregate(countOfId);
8792
aggregateInput.withAggregate(sumOfId);
8893
aggregateInput.withAggregate(averageOfDaysWorked);
8994
aggregateInput.withAggregate(maxAnnualSalary);
9095
aggregateInput.withAggregate(minFirstName);
96+
aggregateInput.withAggregate(countOfBirthDate);
9197

9298
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
9399

94100
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
95-
Assertions.assertEquals(5, aggregateResult.getAggregateValue(countOfId));
96-
Assertions.assertEquals(15, aggregateResult.getAggregateValue(sumOfId));
97-
Assertions.assertEquals(new BigDecimal("96.4"), aggregateResult.getAggregateValue(averageOfDaysWorked));
98-
Assertions.assertEquals(new BigDecimal("1000000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
99-
Assertions.assertEquals("Darin", aggregateResult.getAggregateValue(minFirstName));
101+
assertEquals(5, aggregateResult.getAggregateValue(countOfId));
102+
assertEquals(15, aggregateResult.getAggregateValue(sumOfId));
103+
assertEquals(new BigDecimal("96.4"), aggregateResult.getAggregateValue(averageOfDaysWorked));
104+
assertEquals(new BigDecimal("1000000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
105+
assertEquals("Darin", aggregateResult.getAggregateValue(minFirstName));
106+
assertEquals(4, aggregateResult.getAggregateValue(countOfBirthDate));
107+
}
108+
109+
110+
111+
/*******************************************************************************
112+
**
113+
*******************************************************************************/
114+
@Test
115+
@Disabled("Interesting to see effects of all operators on all types, but failures are expected (e.g., avg(string), so not for CI.")
116+
void testOperatorsCrossTypes()
117+
{
118+
List<String> failures = new ArrayList<>();
119+
for(QFieldMetaData field : QContext.getQInstance().getTable(TestUtils.TABLE_NAME_PERSON).getFields().values())
120+
{
121+
for(AggregateOperator aggregateOperator : AggregateOperator.values())
122+
{
123+
try
124+
{
125+
AggregateInput aggregateInput = initAggregateRequest();
126+
Aggregate aggregate = new Aggregate(field.getName(), aggregateOperator);
127+
aggregateInput.withAggregate(aggregate);
128+
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
129+
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
130+
assertNotNull(aggregateResult.getAggregateValue(aggregate));
131+
}
132+
catch(Exception e)
133+
{
134+
failures.add(ExceptionUtils.getRootException(e).getMessage());
135+
}
136+
}
137+
}
138+
139+
failures.forEach(System.out::println);
100140
}
101141

102142

@@ -123,11 +163,11 @@ public void testFilteredNoGroupBy() throws QException
123163
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
124164

125165
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
126-
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
127-
Assertions.assertEquals(5, aggregateResult.getAggregateValue(sumOfId));
128-
Assertions.assertEquals(new BigDecimal("62.0"), aggregateResult.getAggregateValue(averageOfDaysWorked));
129-
Assertions.assertEquals(new BigDecimal("26000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
130-
Assertions.assertEquals("James", aggregateResult.getAggregateValue(minFirstName));
166+
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
167+
assertEquals(5, aggregateResult.getAggregateValue(sumOfId));
168+
assertEquals(new BigDecimal("62.0"), aggregateResult.getAggregateValue(averageOfDaysWorked));
169+
assertEquals(new BigDecimal("26000.00"), aggregateResult.getAggregateValue(maxAnnualSalary));
170+
assertEquals("James", aggregateResult.getAggregateValue(minFirstName));
131171
}
132172

133173

@@ -156,15 +196,15 @@ public void testUnfilteredWithGroupBy() throws QException
156196
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
157197
{
158198
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
159-
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
160-
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
161-
Assertions.assertEquals(17, aggregateResult.getAggregateValue(sumOfDaysWorked));
199+
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
200+
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
201+
assertEquals(17, aggregateResult.getAggregateValue(sumOfDaysWorked));
162202
}
163203
{
164204
AggregateResult aggregateResult = aggregateOutput.getResults().get(1);
165-
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
166-
Assertions.assertEquals(4, aggregateResult.getAggregateValue(countOfId));
167-
Assertions.assertEquals(11364, aggregateResult.getAggregateValue(sumOfDaysWorked));
205+
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
206+
assertEquals(4, aggregateResult.getAggregateValue(countOfId));
207+
assertEquals(11364, aggregateResult.getAggregateValue(sumOfDaysWorked));
168208
}
169209
}
170210

@@ -201,29 +241,29 @@ public void testUnfilteredWithMultiGroupBy() throws QException
201241
AggregateResult aggregateResult;
202242

203243
aggregateResult = iterator.next();
204-
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
205-
Assertions.assertEquals("Donny", aggregateResult.getGroupByValue(firstNameGroupBy));
206-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
244+
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
245+
assertEquals("Donny", aggregateResult.getGroupByValue(firstNameGroupBy));
246+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
207247

208248
aggregateResult = iterator.next();
209-
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
210-
Assertions.assertEquals("Tim", aggregateResult.getGroupByValue(firstNameGroupBy));
211-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
249+
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
250+
assertEquals("Tim", aggregateResult.getGroupByValue(firstNameGroupBy));
251+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
212252

213253
aggregateResult = iterator.next();
214-
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
215-
Assertions.assertEquals("Aaron", aggregateResult.getGroupByValue(firstNameGroupBy));
216-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
254+
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
255+
assertEquals("Aaron", aggregateResult.getGroupByValue(firstNameGroupBy));
256+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
217257

218258
aggregateResult = iterator.next();
219-
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
220-
Assertions.assertEquals("Darin", aggregateResult.getGroupByValue(firstNameGroupBy));
221-
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
259+
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
260+
assertEquals("Darin", aggregateResult.getGroupByValue(firstNameGroupBy));
261+
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
222262

223263
aggregateResult = iterator.next();
224-
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
225-
Assertions.assertEquals("Trevor", aggregateResult.getGroupByValue(firstNameGroupBy));
226-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
264+
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
265+
assertEquals("Trevor", aggregateResult.getGroupByValue(firstNameGroupBy));
266+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
227267
}
228268

229269

@@ -255,24 +295,24 @@ public void testOrderByAggregate() throws QException
255295
AggregateResult aggregateResult;
256296

257297
aggregateResult = iterator.next();
258-
Assertions.assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
259-
Assertions.assertEquals(4, aggregateResult.getAggregateValue(countOfId));
298+
assertEquals("Kelkhoff", aggregateResult.getGroupByValue(lastNameGroupBy));
299+
assertEquals(4, aggregateResult.getAggregateValue(countOfId));
260300

261301
aggregateResult = iterator.next();
262-
Assertions.assertEquals("Richardson", aggregateResult.getGroupByValue(lastNameGroupBy));
263-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
302+
assertEquals("Richardson", aggregateResult.getGroupByValue(lastNameGroupBy));
303+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
264304

265305
aggregateResult = iterator.next();
266-
Assertions.assertEquals("Maes", aggregateResult.getGroupByValue(lastNameGroupBy));
267-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
306+
assertEquals("Maes", aggregateResult.getGroupByValue(lastNameGroupBy));
307+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
268308

269309
aggregateResult = iterator.next();
270-
Assertions.assertEquals("Samples", aggregateResult.getGroupByValue(lastNameGroupBy));
271-
Assertions.assertEquals(1, aggregateResult.getAggregateValue(countOfId));
310+
assertEquals("Samples", aggregateResult.getGroupByValue(lastNameGroupBy));
311+
assertEquals(1, aggregateResult.getAggregateValue(countOfId));
272312

273313
aggregateResult = iterator.next();
274-
Assertions.assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
275-
Assertions.assertEquals(2, aggregateResult.getAggregateValue(countOfId));
314+
assertEquals("Chamberlain", aggregateResult.getGroupByValue(lastNameGroupBy));
315+
assertEquals(2, aggregateResult.getAggregateValue(countOfId));
276316
}
277317

278318

@@ -293,7 +333,7 @@ public void testNoRowsFound() throws QException
293333
////////////////////////////////////////////////////////////
294334
AggregateOutput aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
295335
AggregateResult aggregateResult = aggregateOutput.getResults().get(0);
296-
Assertions.assertEquals(0, aggregateResult.getAggregateValue(countOfId));
336+
assertEquals(0, aggregateResult.getAggregateValue(countOfId));
297337

298338
/////////////////////////////////////////////////////////////////////////////////////////
299339
// but re-run w/ a group-by -- then, if no rows are found, there are 0 result objects. //
@@ -324,12 +364,12 @@ void testOmsJoinAggregate() throws Exception
324364
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.SECURITY_KEY_STORE_ALL_ACCESS, true));
325365
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
326366
aggregateResult = aggregateOutput.getResults().get(0);
327-
Assertions.assertEquals(43, aggregateResult.getAggregateValue(sumOfQuantity));
367+
assertEquals(43, aggregateResult.getAggregateValue(sumOfQuantity));
328368

329369
QContext.setQSession(new QSession().withSecurityKeyValue(TestUtils.TABLE_NAME_STORE, 1));
330370
aggregateOutput = new RDBMSAggregateAction().execute(aggregateInput);
331371
aggregateResult = aggregateOutput.getResults().get(0);
332-
Assertions.assertEquals(33, aggregateResult.getAggregateValue(sumOfQuantity));
372+
assertEquals(33, aggregateResult.getAggregateValue(sumOfQuantity));
333373
}
334374

335375

0 commit comments

Comments
 (0)