Possible value source filtering

This commit is contained in:
2023-03-08 08:39:09 -06:00
parent 5ca3c088a6
commit 11a16590ef
5 changed files with 93 additions and 21 deletions

View File

@ -52,7 +52,6 @@ import com.kingsrook.qqq.backend.core.model.actions.reporting.ExportInput;
import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormat; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportFormat;
import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportInput; import com.kingsrook.qqq.backend.core.model.actions.reporting.ReportInput;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext; import com.kingsrook.qqq.backend.core.model.actions.tables.query.JoinsContext;
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.QFilterOrderBy;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; 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.QueryInput;
@ -69,7 +68,6 @@ import com.kingsrook.qqq.backend.core.processes.implementations.etl.streamedwith
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.Pair; import com.kingsrook.qqq.backend.core.utils.Pair;
import com.kingsrook.qqq.backend.core.utils.StringUtils; import com.kingsrook.qqq.backend.core.utils.StringUtils;
import com.kingsrook.qqq.backend.core.utils.ValueUtils;
import com.kingsrook.qqq.backend.core.utils.aggregates.AggregatesInterface; import com.kingsrook.qqq.backend.core.utils.aggregates.AggregatesInterface;
import com.kingsrook.qqq.backend.core.utils.aggregates.BigDecimalAggregates; import com.kingsrook.qqq.backend.core.utils.aggregates.BigDecimalAggregates;
import com.kingsrook.qqq.backend.core.utils.aggregates.IntegerAggregates; import com.kingsrook.qqq.backend.core.utils.aggregates.IntegerAggregates;
@ -412,23 +410,7 @@ public class GenerateReportAction
return; return;
} }
QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter(); queryFilter.interpretValues(reportInput.getInputValues());
variableInterpreter.addValueMap("input", reportInput.getInputValues());
for(QFilterCriteria criterion : queryFilter.getCriteria())
{
if(criterion.getValues() != null)
{
List<Serializable> newValues = new ArrayList<>();
for(Serializable value : criterion.getValues())
{
String valueAsString = ValueUtils.getValueAsString(value);
Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString);
newValues.add(interpretedValue);
}
criterion.setValues(newValues);
}
}
} }

View File

@ -26,8 +26,11 @@ import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Map;
import com.kingsrook.qqq.backend.core.instances.QMetaDataVariableInterpreter;
import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.logging.QLogger;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils; import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.ValueUtils;
/******************************************************************************* /*******************************************************************************
@ -363,4 +366,32 @@ public class QQueryFilter implements Serializable, Cloneable
return (rs.toString()); return (rs.toString());
} }
/*******************************************************************************
** Replace any criteria values that look like ${input.XXX} with the value of XXX
** from the supplied inputValues map.
*******************************************************************************/
public void interpretValues(Map<String, Serializable> inputValues)
{
QMetaDataVariableInterpreter variableInterpreter = new QMetaDataVariableInterpreter();
variableInterpreter.addValueMap("input", inputValues);
for(QFilterCriteria criterion : getCriteria())
{
if(criterion.getValues() != null)
{
List<Serializable> newValues = new ArrayList<>();
for(Serializable value : criterion.getValues())
{
String valueAsString = ValueUtils.getValueAsString(value);
Serializable interpretedValue = variableInterpreter.interpretForObject(valueAsString);
newValues.add(interpretedValue);
}
criterion.setValues(newValues);
}
}
}
} }

View File

@ -31,6 +31,7 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import com.github.hervian.reflection.Fun; import com.github.hervian.reflection.Fun;
import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.data.QField; import com.kingsrook.qqq.backend.core.model.data.QField;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
import com.kingsrook.qqq.backend.core.model.metadata.QInstance; import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
@ -63,6 +64,7 @@ public class QFieldMetaData implements Cloneable
private String displayFormat = "%s"; private String displayFormat = "%s";
private Serializable defaultValue; private Serializable defaultValue;
private String possibleValueSourceName; private String possibleValueSourceName;
private QQueryFilter possibleValueSourceFilter;
private Integer maxLength; private Integer maxLength;
private Set<FieldBehavior> behaviors; private Set<FieldBehavior> behaviors;
@ -755,4 +757,35 @@ public class QFieldMetaData implements Cloneable
return (this); return (this);
} }
/*******************************************************************************
** Getter for possibleValueSourceFilter
*******************************************************************************/
public QQueryFilter getPossibleValueSourceFilter()
{
return (this.possibleValueSourceFilter);
}
/*******************************************************************************
** Setter for possibleValueSourceFilter
*******************************************************************************/
public void setPossibleValueSourceFilter(QQueryFilter possibleValueSourceFilter)
{
this.possibleValueSourceFilter = possibleValueSourceFilter;
}
/*******************************************************************************
** Fluent setter for possibleValueSourceFilter
*******************************************************************************/
public QFieldMetaData withPossibleValueSourceFilter(QQueryFilter possibleValueSourceFilter)
{
this.possibleValueSourceFilter = possibleValueSourceFilter;
return (this);
}
} }

View File

@ -28,7 +28,10 @@ import java.util.function.Consumer;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.ChildRecordListRenderer; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.ChildRecordListRenderer;
import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer; import com.kingsrook.qqq.backend.core.actions.dashboard.widgets.DefaultWidgetRenderer;
import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QException;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator;
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.QFilterOrderBy;
import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter;
import com.kingsrook.qqq.backend.core.model.automation.TableTrigger; import com.kingsrook.qqq.backend.core.model.automation.TableTrigger;
import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.WidgetType;
import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity;
@ -69,6 +72,8 @@ public class ScriptsMetaDataProvider
public static final String RUN_RECORD_SCRIPT_PROCESS_NAME = "runRecordScript"; public static final String RUN_RECORD_SCRIPT_PROCESS_NAME = "runRecordScript";
public static final String STORE_SCRIPT_REVISION_PROCESS_NAME = "storeScriptRevision"; public static final String STORE_SCRIPT_REVISION_PROCESS_NAME = "storeScriptRevision";
public static final String SCRIPT_TYPE_NAME_RECORD = "Record Script";
/******************************************************************************* /*******************************************************************************
@ -121,8 +126,11 @@ public class ScriptsMetaDataProvider
processMetaData.addStep(0, new QFrontendStepMetaData() processMetaData.addStep(0, new QFrontendStepMetaData()
.withName("input") .withName("input")
.withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM)) .withComponent(new QFrontendComponentMetaData().withType(QComponentType.EDIT_FORM))
.withFormField(new QFieldMetaData("scriptId", QFieldType.INTEGER).withPossibleValueSourceName(Script.TABLE_NAME)) .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}")
))));
return (processMetaData); return (processMetaData);
} }

View File

@ -131,6 +131,7 @@ public class QJavalinProcessHandler
}); });
get("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues); get("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues);
post("/possibleValues/{fieldName}", QJavalinProcessHandler::possibleValues);
}); });
}); });
get("/download/{file}", QJavalinProcessHandler::downloadFile); get("/download/{file}", QJavalinProcessHandler::downloadFile);
@ -751,6 +752,17 @@ public class QJavalinProcessHandler
String searchTerm = context.queryParam("searchTerm"); String searchTerm = context.queryParam("searchTerm");
String ids = context.queryParam("ids"); String ids = context.queryParam("ids");
Map<String, Serializable> values = new HashMap<>();
if(context.formParamMap().containsKey("values"))
{
List<String> valuesParamList = context.formParamMap().get("values");
if(CollectionUtils.nullSafeHasContents(valuesParamList))
{
String valuesParam = valuesParamList.get(0);
values = JsonUtils.toObject(valuesParam, Map.class);
}
}
QProcessMetaData process = QJavalinImplementation.qInstance.getProcess(processName); QProcessMetaData process = QJavalinImplementation.qInstance.getProcess(processName);
if(process == null) if(process == null)
{ {
@ -770,6 +782,12 @@ public class QJavalinProcessHandler
input.setPossibleValueSourceName(field.getPossibleValueSourceName()); input.setPossibleValueSourceName(field.getPossibleValueSourceName());
input.setSearchTerm(searchTerm); input.setSearchTerm(searchTerm);
if(field.getPossibleValueSourceFilter() != null)
{
field.getPossibleValueSourceFilter().interpretValues(values);
input.setDefaultQueryFilter(field.getPossibleValueSourceFilter());
}
if(StringUtils.hasContent(ids)) if(StringUtils.hasContent(ids))
{ {
List<Serializable> idList = new ArrayList<>(Arrays.asList(ids.split(","))); List<Serializable> idList = new ArrayList<>(Arrays.asList(ids.split(",")));