From 70d9d259c15379f45693d6bdf569ca283619d3ed Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Wed, 18 Jan 2023 11:56:38 -0600 Subject: [PATCH] Adding heavy field concept --- .../model/actions/tables/get/GetInput.java | 32 ++++++++++++++++ .../actions/tables/query/QueryInput.java | 23 ++++++++++++ .../model/metadata/fields/QFieldMetaData.java | 32 ++++++++++++++++ .../rdbms/actions/RDBMSQueryAction.java | 37 ++++++++++++++++--- 4 files changed, 118 insertions(+), 6 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/get/GetInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/get/GetInput.java index 5e28cf88..ada0fbea 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/get/GetInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/get/GetInput.java @@ -41,6 +41,7 @@ public class GetInput extends AbstractTableActionInput private boolean shouldTranslatePossibleValues = false; private boolean shouldGenerateDisplayValues = false; + private boolean shouldFetchHeavyFields = true; @@ -197,4 +198,35 @@ public class GetInput extends AbstractTableActionInput return (this); } + + + /******************************************************************************* + ** Getter for shouldFetchHeavyFields + *******************************************************************************/ + public boolean getShouldFetchHeavyFields() + { + return (this.shouldFetchHeavyFields); + } + + + + /******************************************************************************* + ** Setter for shouldFetchHeavyFields + *******************************************************************************/ + public void setShouldFetchHeavyFields(boolean shouldFetchHeavyFields) + { + this.shouldFetchHeavyFields = shouldFetchHeavyFields; + } + + + + /******************************************************************************* + ** Fluent setter for shouldFetchHeavyFields + *******************************************************************************/ + public GetInput withShouldFetchHeavyFields(boolean shouldFetchHeavyFields) + { + this.shouldFetchHeavyFields = shouldFetchHeavyFields; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QueryInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QueryInput.java index 45822c7a..a0e3e643 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QueryInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/query/QueryInput.java @@ -45,6 +45,7 @@ public class QueryInput extends AbstractTableActionInput private boolean shouldTranslatePossibleValues = false; private boolean shouldGenerateDisplayValues = false; + private boolean shouldFetchHeavyFields = false; ///////////////////////////////////////////////////////////////////////////////////////// // this field - only applies if shouldTranslatePossibleValues is true. // @@ -198,6 +199,28 @@ public class QueryInput extends AbstractTableActionInput + /******************************************************************************* + ** Getter for shouldFetchHeavyFields + ** + *******************************************************************************/ + public boolean getShouldFetchHeavyFields() + { + return shouldFetchHeavyFields; + } + + + + /******************************************************************************* + ** Setter for shouldFetchHeavyFields + ** + *******************************************************************************/ + public void setShouldFetchHeavyFields(boolean shouldFetchHeavyFields) + { + this.shouldFetchHeavyFields = shouldFetchHeavyFields; + } + + + /******************************************************************************* ** Getter for transaction ** diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java index 9f63aabb..d39c5766 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/fields/QFieldMetaData.java @@ -51,6 +51,7 @@ public class QFieldMetaData implements Cloneable private QFieldType type; private boolean isRequired = false; private boolean isEditable = true; + private boolean isHeavy = false; private FieldSecurityLock fieldSecurityLock; @@ -693,6 +694,7 @@ public class QFieldMetaData implements Cloneable } + /******************************************************************************* ** Getter for fieldSecurityLock *******************************************************************************/ @@ -723,4 +725,34 @@ public class QFieldMetaData implements Cloneable } + + /******************************************************************************* + ** Getter for isHeavy + *******************************************************************************/ + public boolean getIsHeavy() + { + return (this.isHeavy); + } + + + + /******************************************************************************* + ** Setter for isHeavy + *******************************************************************************/ + public void setIsHeavy(boolean isHeavy) + { + this.isHeavy = isHeavy; + } + + + + /******************************************************************************* + ** Fluent setter for isHeavy + *******************************************************************************/ + public QFieldMetaData withIsHeavy(boolean isHeavy) + { + this.isHeavy = isHeavy; + return (this); + } + } diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java index a8581fa6..e1596527 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSQueryAction.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.stream.Collectors; import com.kingsrook.qqq.backend.core.actions.interfaces.QueryInterface; import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; @@ -44,7 +45,6 @@ import com.kingsrook.qqq.backend.core.model.metadata.QInstance; 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.utils.CollectionUtils; -import com.kingsrook.qqq.backend.core.utils.QLogger; import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData; @@ -68,7 +68,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf QTableMetaData table = queryInput.getTable(); String tableName = queryInput.getTableName(); - StringBuilder sql = new StringBuilder("SELECT ").append(makeSelectClause(queryInput.getInstance(), tableName, queryInput.getQueryJoins())); + StringBuilder sql = new StringBuilder("SELECT ").append(makeSelectClause(queryInput)); JoinsContext joinsContext = new JoinsContext(queryInput.getInstance(), tableName, queryInput.getQueryJoins()); sql.append(" FROM ").append(makeFromClause(queryInput.getInstance(), tableName, joinsContext)); @@ -112,7 +112,9 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf //////////////////////////////////////////////////////////////////////////// // build the list of fields that will be processed in the result-set loop // //////////////////////////////////////////////////////////////////////////// - List fieldList = new ArrayList<>(table.getFields().values()); + List fieldList = new ArrayList<>(table.getFields().values().stream() + .filter(field -> filterOutHeavyFieldsIfNeeded(field, queryInput.getShouldFetchHeavyFields())) + .toList()); for(QueryJoin queryJoin : CollectionUtils.nonNullList(queryInput.getQueryJoins())) { if(queryJoin.getSelect()) @@ -121,7 +123,10 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf String tableNameOrAlias = queryJoin.getJoinTableOrItsAlias(); for(QFieldMetaData joinField : joinTable.getFields().values()) { - fieldList.add(joinField.clone().withName(tableNameOrAlias + "." + joinField.getName())); + if(filterOutHeavyFieldsIfNeeded(joinField, queryInput.getShouldFetchHeavyFields())) + { + fieldList.add(joinField.clone().withName(tableNameOrAlias + "." + joinField.getName())); + } } } } @@ -132,7 +137,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf // execute the query - iterate over results // ////////////////////////////////////////////// QueryOutput queryOutput = new QueryOutput(queryInput); - System.out.println(sql); + // System.out.println(sql); PreparedStatement statement = createStatement(connection, sql.toString(), queryInput); QueryManager.executeStatement(statement, ((ResultSet resultSet) -> { @@ -184,11 +189,16 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf /******************************************************************************* ** *******************************************************************************/ - private String makeSelectClause(QInstance instance, String tableName, List queryJoins) throws QException + private String makeSelectClause(QueryInput queryInput) throws QException { + QInstance instance = queryInput.getInstance(); + String tableName = queryInput.getTableName(); + List queryJoins = queryInput.getQueryJoins(); + QTableMetaData table = instance.getTable(tableName); List fieldList = new ArrayList<>(table.getFields().values()); String columns = fieldList.stream() + .filter(field -> filterOutHeavyFieldsIfNeeded(field, queryInput.getShouldFetchHeavyFields())) .map(field -> escapeIdentifier(tableName) + "." + escapeIdentifier(getColumnName(field))) .collect(Collectors.joining(", ")); StringBuilder rs = new StringBuilder(columns); @@ -206,6 +216,7 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf List joinFieldList = new ArrayList<>(joinTable.getFields().values()); String joinColumns = joinFieldList.stream() + .filter(field -> filterOutHeavyFieldsIfNeeded(field, queryInput.getShouldFetchHeavyFields())) .map(field -> escapeIdentifier(tableNameOrAlias) + "." + escapeIdentifier(getColumnName(field))) .collect(Collectors.joining(", ")); rs.append(", ").append(joinColumns); @@ -217,6 +228,20 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf + /******************************************************************************* + ** + *******************************************************************************/ + private boolean filterOutHeavyFieldsIfNeeded(QFieldMetaData field, boolean shouldFetchHeavyFields) + { + if(!shouldFetchHeavyFields && field.getIsHeavy()) + { + return (false); + } + return (true); + } + + + /******************************************************************************* ** *******************************************************************************/