From 459629b4496062cad72d1788c9e21d5627130a34 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 16 Jan 2025 10:19:35 -0600 Subject: [PATCH] Promote FieldAndJoinTable up out of GenerateReportAction into top-level class, with factory method --- .../reporting/GenerateReportAction.java | 58 ++----------- .../metadata/fields/FieldAndJoinTable.java | 86 +++++++++++++++++++ ...ReportValuesDynamicFormWidgetRenderer.java | 6 +- .../SavedReportTableCustomizer.java | 4 +- 4 files changed, 96 insertions(+), 58 deletions(-) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/FieldAndJoinTable.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java index 8acdf977..b1e28903 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/reporting/GenerateReportAction.java @@ -71,6 +71,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; 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.metadata.fields.FieldAndJoinTable; 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.reporting.QReportDataSource; @@ -567,7 +568,7 @@ public class GenerateReportAction extends AbstractQActionFunction -1) - { - String joinTableName = fieldName.replaceAll("\\..*", ""); - String joinFieldName = fieldName.replaceAll(".*\\.", ""); - - QTableMetaData joinTable = QContext.getQInstance().getTable(joinTableName); - if(joinTable == null) - { - throw (new QException("Unrecognized join table name: " + joinTableName)); - } - - return new FieldAndJoinTable(joinTable.getField(joinFieldName), joinTable); - } - else - { - return new FieldAndJoinTable(mainTable.getField(fieldName), mainTable); - } - } - - - /******************************************************************************* ** *******************************************************************************/ @@ -756,7 +731,7 @@ public class GenerateReportAction extends AbstractQActionFunction fields = new ArrayList<>(); for(String summaryFieldName : view.getSummaryFields()) { - FieldAndJoinTable fieldAndJoinTable = getFieldAndJoinTable(table, summaryFieldName); + FieldAndJoinTable fieldAndJoinTable = FieldAndJoinTable.get(table, summaryFieldName); fields.add(new QFieldMetaData(summaryFieldName, fieldAndJoinTable.field().getType()).withLabel(fieldAndJoinTable.field().getLabel())); // todo do we need the type? if so need table as input here } for(QReportField column : view.getColumns()) @@ -1208,27 +1183,4 @@ public class GenerateReportAction extends AbstractQActionFunction. + */ + +package com.kingsrook.qqq.backend.core.model.metadata.fields; + + +import com.kingsrook.qqq.backend.core.context.QContext; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; + + +/******************************************************************************* + ** Wrapper (record) that holds a QFieldMetaData and a QTableMetaData - + ** + ** With a factory method (`get()`) to go from the use-case of, a String that's + ** "joinTable.fieldName" or "fieldName" to the pair. + ** + ** Note that the "joinTable" member here - could be the "mainTable" passed in + ** to that `get()` method. + ** + *******************************************************************************/ +public record FieldAndJoinTable(QFieldMetaData field, QTableMetaData joinTable) +{ + + /*************************************************************************** + ** given a table, and a field-name string (which should either be the name + ** of a field on that table, or another tableName + "." + fieldName (from + ** that table) - get back the pair of table & field metaData that the + ** input string is talking about. + ***************************************************************************/ + public static FieldAndJoinTable get(QTableMetaData mainTable, String fieldName) throws QException + { + if(fieldName.indexOf('.') > -1) + { + String joinTableName = fieldName.replaceAll("\\..*", ""); + String joinFieldName = fieldName.replaceAll(".*\\.", ""); + + QTableMetaData joinTable = QContext.getQInstance().getTable(joinTableName); + if(joinTable == null) + { + throw (new QException("Unrecognized join table name: " + joinTableName)); + } + + return new FieldAndJoinTable(joinTable.getField(joinFieldName), joinTable); + } + else + { + return new FieldAndJoinTable(mainTable.getField(fieldName), mainTable); + } + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public String getLabel(QTableMetaData mainTable) + { + if(mainTable.getName().equals(joinTable.getName())) + { + return (field.getLabel()); + } + else + { + return (joinTable.getLabel() + ": " + field.getLabel()); + } + } +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/ReportValuesDynamicFormWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/ReportValuesDynamicFormWidgetRenderer.java index fc90fb1f..3a448eda 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/ReportValuesDynamicFormWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/ReportValuesDynamicFormWidgetRenderer.java @@ -28,7 +28,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.AbstractWidgetRenderer; -import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction; import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.values.QPossibleValueTranslator; import com.kingsrook.qqq.backend.core.context.QContext; @@ -43,6 +42,7 @@ import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetInput; import com.kingsrook.qqq.backend.core.model.actions.widgets.RenderWidgetOutput; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.DynamicFormWidgetData; import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAndJoinTable; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.processes.implementations.savedreports.SavedReportToReportMetaDataAdapter; @@ -127,8 +127,8 @@ public class ReportValuesDynamicFormWidgetRenderer extends AbstractWidgetRendere { if(criteriaValue instanceof FilterVariableExpression filterVariableExpression) { - GenerateReportAction.FieldAndJoinTable fieldAndJoinTable = GenerateReportAction.getFieldAndJoinTable(table, criteria.getFieldName()); - QFieldMetaData fieldMetaData = fieldAndJoinTable.field().clone(); + FieldAndJoinTable fieldAndJoinTable = FieldAndJoinTable.get(table, criteria.getFieldName()); + QFieldMetaData fieldMetaData = fieldAndJoinTable.field().clone(); ///////////////////////////////// // make name & label for field // diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportTableCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportTableCustomizer.java index 6fe6e9bf..65e11a10 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportTableCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedreports/SavedReportTableCustomizer.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; import com.kingsrook.qqq.backend.core.actions.customizers.TableCustomizerInterface; -import com.kingsrook.qqq.backend.core.actions.reporting.GenerateReportAction; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.reporting.pivottable.PivotTableDefinition; @@ -39,6 +38,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.fields.FieldAndJoinTable; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.core.model.statusmessages.BadInputStatusMessage; import com.kingsrook.qqq.backend.core.model.statusmessages.PermissionDeniedMessage; @@ -311,7 +311,7 @@ public class SavedReportTableCustomizer implements TableCustomizerInterface { try { - GenerateReportAction.FieldAndJoinTable fieldAndJoinTable = GenerateReportAction.getFieldAndJoinTable(table, fieldName); + FieldAndJoinTable fieldAndJoinTable = FieldAndJoinTable.get(table, fieldName); return (fieldAndJoinTable.getLabel(table)); } catch(Exception e)