From e57292f10f9720a06b4acff2a0fd463cfafa6892 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 4 Aug 2023 16:42:42 -0500 Subject: [PATCH] Initial work to change scripts, tableTriggers, and savedFilters to use qqqTableId instead of tableName --- .../RecordAutomationStatusUpdater.java | 3 +- .../PollingAutomationPerTableRunner.java | 3 +- .../tables/helpers/QueryStatManager.java | 53 +---------- .../core/model/automation/TableTrigger.java | 71 +++++++-------- .../core/model/savedfilters/SavedFilter.java | 70 +++++++------- .../backend/core/model/scripts/Script.java | 68 +++++++------- .../scripts/ScriptsMetaDataProvider.java | 25 ++++- .../core/model/tables/QQQTableAccessor.java | 91 +++++++++++++++++++ .../tables/QQQTablesMetaDataProvider.java | 1 + .../savedfilters/QuerySavedFilterProcess.java | 3 +- .../savedfilters/StoreSavedFilterProcess.java | 3 +- .../scripts/RunRecordScriptExtractStep.java | 6 ++ .../scripts/RunRecordScriptPreStep.java | 64 +++++++++++++ .../scripts/TestScriptProcessStepTest.java | 2 +- 14 files changed, 298 insertions(+), 165 deletions(-) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTableAccessor.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptPreStep.java diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java index beb22b30..c838eb9e 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/RecordAutomationStatusUpdater.java @@ -45,6 +45,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.QTableAut import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TableAutomationAction; import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TriggerEvent; import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import org.apache.commons.lang.NotImplementedException; @@ -171,7 +172,7 @@ public class RecordAutomationStatusUpdater CountInput countInput = new CountInput(); countInput.setTableName(TableTrigger.TABLE_NAME); countInput.setFilter(new QQueryFilter( - new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, table.getName()), + new QFilterCriteria("qqqTableId", QCriteriaOperator.EQUALS, QQQTableAccessor.getQQQTableId(table.getName())), new QFilterCriteria(triggerEvent.equals(TriggerEvent.POST_INSERT) ? "postInsert" : "postUpdate", QCriteriaOperator.EQUALS, true) )); CountOutput countOutput = new CountAction().execute(countInput); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/polling/PollingAutomationPerTableRunner.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/polling/PollingAutomationPerTableRunner.java index 52cc7646..372409a3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/polling/PollingAutomationPerTableRunner.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/automation/polling/PollingAutomationPerTableRunner.java @@ -66,6 +66,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TableAuto import com.kingsrook.qqq.backend.core.model.metadata.tables.automation.TriggerEvent; import com.kingsrook.qqq.backend.core.model.savedfilters.SavedFilter; import com.kingsrook.qqq.backend.core.model.session.QSession; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.JsonUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -270,7 +271,7 @@ public class PollingAutomationPerTableRunner implements Runnable QueryInput queryInput = new QueryInput(); queryInput.setTableName(TableTrigger.TABLE_NAME); queryInput.setFilter(new QQueryFilter( - new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, table.getName()), + new QFilterCriteria("qqqTableId", QCriteriaOperator.EQUALS, QQQTableAccessor.getQQQTableId(table.getName())), new QFilterCriteria(triggerEvent.equals(TriggerEvent.POST_INSERT) ? "postInsert" : "postUpdate", QCriteriaOperator.EQUALS, true) )); QueryOutput queryOutput = new QueryAction().execute(queryInput); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryStatManager.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryStatManager.java index e32caf6e..6ec3dc73 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryStatManager.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/tables/helpers/QueryStatManager.java @@ -31,16 +31,12 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import com.kingsrook.qqq.backend.core.actions.tables.GetAction; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.instances.QMetaDataVariableInterpreter; import com.kingsrook.qqq.backend.core.logging.QLogger; -import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; -import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; -import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterOrderBy; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; @@ -54,11 +50,9 @@ import com.kingsrook.qqq.backend.core.model.querystats.QueryStatCriteriaField; import com.kingsrook.qqq.backend.core.model.querystats.QueryStatJoinTable; import com.kingsrook.qqq.backend.core.model.querystats.QueryStatOrderByField; import com.kingsrook.qqq.backend.core.model.session.QSession; -import com.kingsrook.qqq.backend.core.model.tables.QQQTable; -import com.kingsrook.qqq.backend.core.model.tables.QQQTablesMetaDataProvider; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils; -import com.kingsrook.qqq.backend.core.utils.collections.MapBuilder; import static com.kingsrook.qqq.backend.core.logging.LogUtils.logPair; @@ -363,7 +357,7 @@ public class QueryStatManager ////////////////////// // set the table id // ////////////////////// - Integer qqqTableId = getQQQTableId(queryStat.getTableName()); + Integer qqqTableId = QQQTableAccessor.getQQQTableId(queryStat.getTableName()); queryStat.setQqqTableId(qqqTableId); ////////////////////////////// @@ -374,7 +368,7 @@ public class QueryStatManager List queryStatJoinTableList = new ArrayList<>(); for(String joinTableName : queryStat.getJoinTableNames()) { - queryStatJoinTableList.add(new QueryStatJoinTable().withQqqTableId(getQQQTableId(joinTableName))); + queryStatJoinTableList.add(new QueryStatJoinTable().withQqqTableId(QQQTableAccessor.getQQQTableId(joinTableName))); } queryStat.setQueryStatJoinTableList(queryStatJoinTableList); } @@ -452,7 +446,7 @@ public class QueryStatManager String[] parts = fieldName.split("\\."); if(parts.length > 1) { - queryStatCriteriaField.setQqqTableId(getQQQTableId(parts[0])); + queryStatCriteriaField.setQqqTableId(QQQTableAccessor.getQQQTableId(parts[0])); queryStatCriteriaField.setName(parts[1]); } } @@ -490,7 +484,7 @@ public class QueryStatManager String[] parts = fieldName.split("\\."); if(parts.length > 1) { - queryStatOrderByField.setQqqTableId(getQQQTableId(parts[0])); + queryStatOrderByField.setQqqTableId(QQQTableAccessor.getQQQTableId(parts[0])); queryStatOrderByField.setName(parts[1]); } } @@ -505,43 +499,6 @@ public class QueryStatManager } } - - - /******************************************************************************* - ** - *******************************************************************************/ - private static Integer getQQQTableId(String tableName) throws QException - { - ///////////////////////////// - // look in the cache table // - ///////////////////////////// - GetInput getInput = new GetInput(); - getInput.setTableName(QQQTablesMetaDataProvider.QQQ_TABLE_CACHE_TABLE_NAME); - getInput.setUniqueKey(MapBuilder.of("name", tableName)); - GetOutput getOutput = new GetAction().execute(getInput); - - //////////////////////// - // upon cache miss... // - //////////////////////// - if(getOutput.getRecord() == null) - { - /////////////////////////////////////////////////////// - // insert the record (into the table, not the cache) // - /////////////////////////////////////////////////////// - QTableMetaData tableMetaData = getInstance().qInstance.getTable(tableName); - InsertInput insertInput = new InsertInput(); - insertInput.setTableName(QQQTable.TABLE_NAME); - insertInput.setRecords(List.of(new QRecord().withValue("name", tableName).withValue("label", tableMetaData.getLabel()))); - InsertOutput insertOutput = new InsertAction().execute(insertInput); - - /////////////////////////////////// - // repeat the get from the cache // - /////////////////////////////////// - getOutput = new GetAction().execute(getInput); - } - - return getOutput.getRecord().getValueInteger("id"); - } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/automation/TableTrigger.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/automation/TableTrigger.java index a3c82b4f..496c1a49 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/automation/TableTrigger.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/automation/TableTrigger.java @@ -27,9 +27,9 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.data.QField; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; -import com.kingsrook.qqq.backend.core.model.metadata.tables.TablesPossibleValueSourceMetaDataProvider; import com.kingsrook.qqq.backend.core.model.savedfilters.SavedFilter; import com.kingsrook.qqq.backend.core.model.scripts.Script; +import com.kingsrook.qqq.backend.core.model.tables.QQQTable; /******************************************************************************* @@ -48,8 +48,8 @@ public class TableTrigger extends QRecordEntity @QField(isEditable = false) private Instant modifyDate; - @QField(possibleValueSourceName = TablesPossibleValueSourceMetaDataProvider.NAME) - private String tableName; + @QField(possibleValueSourceName = QQQTable.TABLE_NAME) + private Integer qqqTableId; @QField(possibleValueSourceName = SavedFilter.TABLE_NAME) private Integer filterId; @@ -191,40 +191,6 @@ public class TableTrigger extends QRecordEntity - /******************************************************************************* - ** Getter for tableName - ** - *******************************************************************************/ - public String getTableName() - { - return tableName; - } - - - - /******************************************************************************* - ** Setter for tableName - ** - *******************************************************************************/ - public void setTableName(String tableName) - { - this.tableName = tableName; - } - - - - /******************************************************************************* - ** Fluent setter for tableName - ** - *******************************************************************************/ - public TableTrigger withTableName(String tableName) - { - this.tableName = tableName; - return (this); - } - - - /******************************************************************************* ** Getter for filterId ** @@ -390,4 +356,35 @@ public class TableTrigger extends QRecordEntity return (this); } + + + /******************************************************************************* + ** Getter for qqqTableId + *******************************************************************************/ + public Integer getQqqTableId() + { + return (this.qqqTableId); + } + + + + /******************************************************************************* + ** Setter for qqqTableId + *******************************************************************************/ + public void setQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + } + + + + /******************************************************************************* + ** Fluent setter for qqqTableId + *******************************************************************************/ + public TableTrigger withQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedfilters/SavedFilter.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedfilters/SavedFilter.java index 9263b5d5..94f5e761 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedfilters/SavedFilter.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/savedfilters/SavedFilter.java @@ -27,6 +27,7 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.data.QField; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; +import com.kingsrook.qqq.backend.core.model.tables.QQQTable; /******************************************************************************* @@ -48,8 +49,8 @@ public class SavedFilter extends QRecordEntity @QField(isRequired = true) private String label; - @QField(isEditable = false) - private String tableName; + @QField(possibleValueSourceName = QQQTable.TABLE_NAME) + private Integer qqqTableId; @QField(isEditable = false) private String userId; @@ -180,40 +181,6 @@ public class SavedFilter extends QRecordEntity - /******************************************************************************* - ** Getter for tableName - ** - *******************************************************************************/ - public String getTableName() - { - return tableName; - } - - - - /******************************************************************************* - ** Setter for tableName - ** - *******************************************************************************/ - public void setTableName(String tableName) - { - this.tableName = tableName; - } - - - - /******************************************************************************* - ** Fluent setter for tableName - ** - *******************************************************************************/ - public SavedFilter withTableName(String tableName) - { - this.tableName = tableName; - return (this); - } - - - /******************************************************************************* ** Getter for userId ** @@ -280,4 +247,35 @@ public class SavedFilter extends QRecordEntity return (this); } + + + /******************************************************************************* + ** Getter for qqqTableId + *******************************************************************************/ + public Integer getQqqTableId() + { + return (this.qqqTableId); + } + + + + /******************************************************************************* + ** Setter for qqqTableId + *******************************************************************************/ + public void setQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + } + + + + /******************************************************************************* + ** Fluent setter for qqqTableId + *******************************************************************************/ + public SavedFilter withQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/Script.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/Script.java index 3a716e7b..10ee712f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/Script.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/Script.java @@ -27,7 +27,7 @@ import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.data.QField; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; -import com.kingsrook.qqq.backend.core.model.metadata.tables.TablesPossibleValueSourceMetaDataProvider; +import com.kingsrook.qqq.backend.core.model.tables.QQQTable; /******************************************************************************* @@ -52,8 +52,8 @@ public class Script extends QRecordEntity @QField(possibleValueSourceName = "scriptType") private Integer scriptTypeId; - @QField(possibleValueSourceName = TablesPossibleValueSourceMetaDataProvider.NAME) - private String tableName; + @QField(possibleValueSourceName = QQQTable.TABLE_NAME) + private Integer qqqTableId; @QField() private Integer maxBatchSize; @@ -288,37 +288,6 @@ public class Script extends QRecordEntity - /******************************************************************************* - ** Getter for tableName - *******************************************************************************/ - public String getTableName() - { - return (this.tableName); - } - - - - /******************************************************************************* - ** Setter for tableName - *******************************************************************************/ - public void setTableName(String tableName) - { - this.tableName = tableName; - } - - - - /******************************************************************************* - ** Fluent setter for tableName - *******************************************************************************/ - public Script withTableName(String tableName) - { - this.tableName = tableName; - return (this); - } - - - /******************************************************************************* ** Getter for maxBatchSize *******************************************************************************/ @@ -348,4 +317,35 @@ public class Script extends QRecordEntity return (this); } + + + /******************************************************************************* + ** Getter for qqqTableId + *******************************************************************************/ + public Integer getQqqTableId() + { + return (this.qqqTableId); + } + + + + /******************************************************************************* + ** Setter for qqqTableId + *******************************************************************************/ + public void setQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + } + + + + /******************************************************************************* + ** Fluent setter for qqqTableId + *******************************************************************************/ + public Script withQqqTableId(Integer qqqTableId) + { + this.qqqTableId = qqqTableId; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java index c31b6ab3..d52dfca3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/scripts/ScriptsMetaDataProvider.java @@ -66,6 +66,7 @@ import com.kingsrook.qqq.backend.core.processes.implementations.etl.streamedwith import com.kingsrook.qqq.backend.core.processes.implementations.scripts.LoadScriptTestDetailsProcessStep; import com.kingsrook.qqq.backend.core.processes.implementations.scripts.RunRecordScriptExtractStep; import com.kingsrook.qqq.backend.core.processes.implementations.scripts.RunRecordScriptLoadStep; +import com.kingsrook.qqq.backend.core.processes.implementations.scripts.RunRecordScriptPreStep; import com.kingsrook.qqq.backend.core.processes.implementations.scripts.RunRecordScriptTransformStep; import com.kingsrook.qqq.backend.core.processes.implementations.scripts.StoreScriptRevisionProcessStep; import com.kingsrook.qqq.backend.core.processes.implementations.scripts.TestScriptProcessStep; @@ -96,7 +97,11 @@ public class ScriptsMetaDataProvider defineStandardScriptsPossibleValueSources(instance); defineStandardScriptsJoins(instance); defineStandardScriptsWidgets(instance); + + // todo - change this from an enum-backed PVS to use qqqTable table, exposed in-app, in API + // so api docs don't always need refreshed instance.addPossibleValueSource(TablesPossibleValueSourceMetaDataProvider.defineTablesPossibleValueSource(instance)); + instance.addProcess(defineStoreScriptRevisionProcess()); instance.addProcess(defineTestScriptProcess()); instance.addProcess(defineLoadScriptTestDetailsProcess()); @@ -174,15 +179,25 @@ public class ScriptsMetaDataProvider .withLoadStepClass(RunRecordScriptLoadStep.class) .getProcessMetaData(); + //////////////////////////////////////////////////////////////////////////// + // add a screen before the extract step - where user selects their script // + //////////////////////////////////////////////////////////////////////////// processMetaData.addStep(0, new QFrontendStepMetaData() .withName("input") .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) .withFormField(new QFieldMetaData("scriptId", QFieldType.INTEGER).withPossibleValueSourceName(Script.TABLE_NAME) .withPossibleValueSourceFilter(new QQueryFilter( new QFilterCriteria("scriptType.name", QCriteriaOperator.EQUALS, SCRIPT_TYPE_NAME_RECORD), - new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, "${input.tableName}") + new QFilterCriteria("qqqTableId", QCriteriaOperator.EQUALS, "${input.qqqTableId}") )))); + ///////////////////////////////////////////////////////////////////////////////// + // now - insert a step before the input screen, where the table name gets read // + ///////////////////////////////////////////////////////////////////////////////// + processMetaData.addStep(0, new QBackendStepMetaData() + .withName("preStep") + .withCode(new QCodeReference(RunRecordScriptPreStep.class))); + return (processMetaData); } @@ -383,16 +398,16 @@ public class ScriptsMetaDataProvider QTableMetaData tableMetaData = defineStandardTable(backendName, TableTrigger.TABLE_NAME, TableTrigger.class) .withRecordLabelFields("id") .withSection(new QFieldSection("identity", new QIcon().withName("badge"), Tier.T1, List.of("id"))) - .withSection(new QFieldSection("contents", new QIcon().withName("data_object"), Tier.T2, List.of("tableName", "filterId", "scriptId", "priority", "postInsert", "postUpdate"))) + .withSection(new QFieldSection("contents", new QIcon().withName("data_object"), Tier.T2, List.of("qqqTableId", "filterId", "scriptId", "priority", "postInsert", "postUpdate"))) .withSection(new QFieldSection("dates", new QIcon().withName("calendar_month"), Tier.T3, List.of("createDate", "modifyDate"))); tableMetaData.getField("scriptId").withPossibleValueSourceFilter(new QQueryFilter( new QFilterCriteria("scriptType.name", QCriteriaOperator.EQUALS, SCRIPT_TYPE_NAME_RECORD), - new QFilterCriteria("script.tableName", QCriteriaOperator.EQUALS, "${input.tableName}") + new QFilterCriteria("script.qqqTableId", QCriteriaOperator.EQUALS, "${input.qqqTableId}") )); tableMetaData.getField("filterId").withPossibleValueSourceFilter(new QQueryFilter( - new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, "${input.tableName}") + new QFilterCriteria("qqqTableId", QCriteriaOperator.EQUALS, "${input.qqqTableId}") )); return tableMetaData; @@ -407,7 +422,7 @@ public class ScriptsMetaDataProvider { QTableMetaData tableMetaData = defineStandardTable(backendName, Script.TABLE_NAME, Script.class) .withSection(new QFieldSection("identity", new QIcon().withName("badge"), Tier.T1, List.of("id", "name", "scriptTypeId", "currentScriptRevisionId"))) - .withSection(new QFieldSection("recordScriptSettings", new QIcon().withName("table_rows"), Tier.T2, List.of("tableName", "maxBatchSize"))) + .withSection(new QFieldSection("recordScriptSettings", new QIcon().withName("table_rows"), Tier.T2, List.of("qqqTableId", "maxBatchSize"))) .withSection(new QFieldSection("contents", new QIcon().withName("data_object"), Tier.T2).withWidgetName("scriptViewer")) .withSection(new QFieldSection("dates", new QIcon().withName("calendar_month"), Tier.T3, List.of("createDate", "modifyDate"))) .withSection(new QFieldSection("lines", new QIcon().withName("horizontal_rule"), Tier.T2).withWidgetName(QJoinMetaData.makeInferredJoinName(Script.TABLE_NAME, ScriptLog.TABLE_NAME))); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTableAccessor.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTableAccessor.java new file mode 100644 index 00000000..302ace35 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTableAccessor.java @@ -0,0 +1,91 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.model.tables; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.actions.tables.GetAction; +import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; +import com.kingsrook.qqq.backend.core.context.QContext; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetOutput; +import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertOutput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.utils.collections.MapBuilder; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class QQQTableAccessor +{ + + /******************************************************************************* + ** + *******************************************************************************/ + public static QRecord getQQQTableRecord(String tableName) throws QException + { + ///////////////////////////// + // look in the cache table // + ///////////////////////////// + GetInput getInput = new GetInput(); + getInput.setTableName(QQQTablesMetaDataProvider.QQQ_TABLE_CACHE_TABLE_NAME); + getInput.setUniqueKey(MapBuilder.of("name", tableName)); + GetOutput getOutput = new GetAction().execute(getInput); + + //////////////////////// + // upon cache miss... // + //////////////////////// + if(getOutput.getRecord() == null) + { + /////////////////////////////////////////////////////// + // insert the record (into the table, not the cache) // + /////////////////////////////////////////////////////// + QTableMetaData tableMetaData = QContext.getQInstance().getTable(tableName); + InsertInput insertInput = new InsertInput(); + insertInput.setTableName(QQQTable.TABLE_NAME); + insertInput.setRecords(List.of(new QRecord().withValue("name", tableName).withValue("label", tableMetaData.getLabel()))); + InsertOutput insertOutput = new InsertAction().execute(insertInput); + + /////////////////////////////////// + // repeat the get from the cache // + /////////////////////////////////// + getOutput = new GetAction().execute(getInput); + } + + return getOutput.getRecord(); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Integer getQQQTableId(String tableName) throws QException + { + return (getQQQTableRecord(tableName).getValueInteger("id")); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java index 100d705b..ea318182 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/tables/QQQTablesMetaDataProvider.java @@ -127,6 +127,7 @@ public class QQQTablesMetaDataProvider return (new QPossibleValueSource() .withType(QPossibleValueSourceType.TABLE) .withName(QQQTable.TABLE_NAME) + .withOrderByField("label") .withTableName(QQQTable.TABLE_NAME)); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/QuerySavedFilterProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/QuerySavedFilterProcess.java index dc50ed17..c1a3b17f 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/QuerySavedFilterProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/QuerySavedFilterProcess.java @@ -44,6 +44,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.savedfilters.SavedFilter; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; /******************************************************************************* @@ -100,7 +101,7 @@ public class QuerySavedFilterProcess implements BackendStep QueryInput input = new QueryInput(); input.setTableName(SavedFilter.TABLE_NAME); input.setFilter(new QQueryFilter() - .withCriteria(new QFilterCriteria("tableName", QCriteriaOperator.EQUALS, tableName)) + .withCriteria(new QFilterCriteria("qqqTableId", QCriteriaOperator.EQUALS, QQQTableAccessor.getQQQTableId(tableName))) .withOrderBy(new QFilterOrderBy("label"))); QueryOutput output = new QueryAction().execute(input); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/StoreSavedFilterProcess.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/StoreSavedFilterProcess.java index 37bc167e..f3fe56d8 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/StoreSavedFilterProcess.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/savedfilters/StoreSavedFilterProcess.java @@ -42,6 +42,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.processes.QBackendStepMetaData; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; import com.kingsrook.qqq.backend.core.model.savedfilters.SavedFilter; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; /******************************************************************************* @@ -82,7 +83,7 @@ public class StoreSavedFilterProcess implements BackendStep QRecord qRecord = new QRecord() .withValue("id", runBackendStepInput.getValueInteger("id")) .withValue("label", runBackendStepInput.getValueString("label")) - .withValue("tableName", runBackendStepInput.getValueString("tableName")) + .withValue("qqqTableId", QQQTableAccessor.getQQQTableId(runBackendStepInput.getValueString("tableName"))) .withValue("filterJson", runBackendStepInput.getValueString("filterJson")) .withValue("userId", runBackendStepInput.getSession().getUser().getIdReference()); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptExtractStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptExtractStep.java index 6dda828d..b531c19c 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptExtractStep.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptExtractStep.java @@ -30,6 +30,7 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; import com.kingsrook.qqq.backend.core.model.scripts.Script; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; import com.kingsrook.qqq.backend.core.processes.implementations.etl.streamedwithfrontend.ExtractViaQueryStep; import com.kingsrook.qqq.backend.core.utils.StringUtils; @@ -58,6 +59,11 @@ public class RunRecordScriptExtractStep extends ExtractViaQueryStep runBackendStepInput.addValue(FIELD_SOURCE_TABLE, tableName); + ///////////////////////////////////////////////////////////////// + // set this value, for the select-script possible-value filter // + ///////////////////////////////////////////////////////////////// + runBackendStepInput.addValue("qqqTableId", QQQTableAccessor.getQQQTableId(tableName)); + Integer scriptId = runBackendStepInput.getValueInteger("scriptId"); GetInput getInput = new GetInput(); getInput.setTableName(Script.TABLE_NAME); diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptPreStep.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptPreStep.java new file mode 100644 index 00000000..16ebee0b --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/RunRecordScriptPreStep.java @@ -0,0 +1,64 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.processes.implementations.scripts; + + +import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepInput; +import com.kingsrook.qqq.backend.core.model.actions.processes.RunBackendStepOutput; +import com.kingsrook.qqq.backend.core.model.tables.QQQTableAccessor; +import com.kingsrook.qqq.backend.core.processes.implementations.etl.streamed.StreamedETLProcess; +import com.kingsrook.qqq.backend.core.utils.StringUtils; + + +/******************************************************************************* + ** pre-step for the run-record-script process. Help deal with this being + ** a generic process (e.g., no table name defined in the meta data). + *******************************************************************************/ +public class RunRecordScriptPreStep implements BackendStep +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public void run(RunBackendStepInput runBackendStepInput, RunBackendStepOutput runBackendStepOutput) throws QException + { + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // this is a generic (e.g., not table-specific) process - so we must be sure to set the tableName field in the expected slot. // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + String tableName = runBackendStepInput.getValueString("tableName"); + if(!StringUtils.hasContent(tableName)) + { + throw (new QException("Table name was not specified as input value")); + } + + runBackendStepInput.addValue(StreamedETLProcess.FIELD_SOURCE_TABLE, tableName); + + ///////////////////////////////////////////////////////////////// + // set this value, for the select-script possible-value filter // + ///////////////////////////////////////////////////////////////// + runBackendStepInput.addValue("qqqTableId", QQQTableAccessor.getQQQTableId(tableName)); + } + +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStepTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStepTest.java index 448e57a9..050bb536 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStepTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/implementations/scripts/TestScriptProcessStepTest.java @@ -71,7 +71,7 @@ class TestScriptProcessStepTest extends BaseTest insertInput.setRecords(List.of(new Script() .withName("TestScript") .withScriptTypeId(insertOutput.getRecords().get(0).getValueInteger("id")) - .withTableName(TestUtils.TABLE_NAME_SHAPE) + .withQqqTableId(1) .toQRecord())); insertOutput = new InsertAction().execute(insertInput);