From 8dbf7fe4cdf3ff218d0c11e5c194d2a578517a3d Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 5 Jul 2024 12:57:07 -0500 Subject: [PATCH] CE-1460 Construct a new, clean QueryJoin object for the second Aggregate call (as JoinsContext changes the one it takes in during the first call, leading to different join conditions being in place, causing second query to potentially fail) --- .../columnstats/ColumnStatsStep.java | 77 ++++++++++++------- 1 file changed, 51 insertions(+), 26 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/columnstats/ColumnStatsStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/columnstats/ColumnStatsStep.java index 21584e8e..cbe1e1a9 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/columnstats/ColumnStatsStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/columnstats/ColumnStatsStep.java @@ -136,29 +136,11 @@ public class ColumnStatsStep implements BackendStep filter = new QQueryFilter(); } - QueryJoin queryJoin = null; - QTableMetaData table = QContext.getQInstance().getTable(tableName); - QFieldMetaData field = null; - if(fieldName.contains(".")) - { - String[] parts = fieldName.split("\\.", 2); - for(ExposedJoin exposedJoin : CollectionUtils.nonNullList(table.getExposedJoins())) - { - if(exposedJoin.getJoinTable().equals(parts[0])) - { - field = QContext.getQInstance().getTable(exposedJoin.getJoinTable()).getField(parts[1]); - queryJoin = new QueryJoin() - .withJoinTable(exposedJoin.getJoinTable()) - .withSelect(true) - .withType(QueryJoin.Type.INNER); - break; - } - } - } - else - { - field = table.getField(fieldName); - } + QTableMetaData table = QContext.getQInstance().getTable(tableName); + + FieldAndQueryJoin fieldAndQueryJoin = getFieldAndQueryJoin(table, fieldName); + QFieldMetaData field = fieldAndQueryJoin.field(); + QueryJoin queryJoin = fieldAndQueryJoin.queryJoin(); if(field == null) { @@ -213,7 +195,7 @@ public class ColumnStatsStep implements BackendStep filter.withOrderBy(new QFilterOrderByAggregate(aggregate, false)); filter.withOrderBy(new QFilterOrderByGroupBy(groupBy)); - Integer limit = 1000; // too big? + Integer limit = 1000; AggregateInput aggregateInput = new AggregateInput(); aggregateInput.withAggregate(aggregate); aggregateInput.withGroupBy(groupBy); @@ -223,7 +205,11 @@ public class ColumnStatsStep implements BackendStep if(queryJoin != null) { - aggregateInput.withQueryJoin(queryJoin); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // re-construct this queryJoin object - just because, the JoinsContext edits the previous one, so we can make some failing-joins otherwise... // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + fieldAndQueryJoin = getFieldAndQueryJoin(table, fieldName); + aggregateInput.withQueryJoin(fieldAndQueryJoin.queryJoin()); } AggregateOutput aggregateOutput = new AggregateAction().execute(aggregateInput); @@ -238,7 +224,7 @@ public class ColumnStatsStep implements BackendStep value = Instant.parse(value + ":00:00Z"); } - Integer count = ValueUtils.getValueAsInteger(result.getAggregateValue(aggregate)); + Integer count = ValueUtils.getValueAsInteger(result.getAggregateValue(aggregate)); valueCounts.add(new QRecord().withValue(fieldName, value).withValue("count", count)); } @@ -526,4 +512,43 @@ public class ColumnStatsStep implements BackendStep return (null); } + + + /******************************************************************************* + ** + *******************************************************************************/ + private FieldAndQueryJoin getFieldAndQueryJoin(QTableMetaData table, String fieldName) + { + QFieldMetaData field = null; + QueryJoin queryJoin = null; + if(fieldName.contains(".")) + { + String[] parts = fieldName.split("\\.", 2); + for(ExposedJoin exposedJoin : CollectionUtils.nonNullList(table.getExposedJoins())) + { + if(exposedJoin.getJoinTable().equals(parts[0])) + { + field = QContext.getQInstance().getTable(exposedJoin.getJoinTable()).getField(parts[1]); + queryJoin = new QueryJoin() + .withJoinTable(exposedJoin.getJoinTable()) + .withSelect(true) + .withType(QueryJoin.Type.INNER); + break; + } + } + } + else + { + field = table.getField(fieldName); + } + + return (new FieldAndQueryJoin(field, queryJoin)); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private record FieldAndQueryJoin(QFieldMetaData field, QueryJoin queryJoin) {} }