add query stats to count, aggregate actions; add system/env prop checks; ready for initial dev deployment

This commit is contained in:
2023-06-22 11:07:24 -05:00
parent f30b2a9ef8
commit 1822dd8189
15 changed files with 543 additions and 155 deletions

View File

@ -68,6 +68,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData;
import com.kingsrook.qqq.backend.core.model.metadata.security.QSecurityKeyType;
import com.kingsrook.qqq.backend.core.model.metadata.security.RecordSecurityLock;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.querystats.QueryStat;
import com.kingsrook.qqq.backend.core.model.session.QSession;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.StringUtils;
@ -86,6 +87,8 @@ public abstract class AbstractRDBMSAction implements QActionInterface
{
private static final QLogger LOG = QLogger.getLogger(AbstractRDBMSAction.class);
protected QueryStat queryStat;
/*******************************************************************************
@ -1037,4 +1040,47 @@ public abstract class AbstractRDBMSAction implements QActionInterface
return (false);
}
/*******************************************************************************
**
*******************************************************************************/
protected void setSqlAndJoinsInQueryStat(CharSequence sql, JoinsContext joinsContext)
{
if(queryStat != null)
{
queryStat.setQueryText(sql.toString());
if(CollectionUtils.nullSafeHasContents(joinsContext.getQueryJoins()))
{
Set<String> joinTableNames = new HashSet<>();
for(QueryJoin queryJoin : joinsContext.getQueryJoins())
{
joinTableNames.add(queryJoin.getJoinTable());
}
queryStat.setJoinTableNames(joinTableNames);
}
}
}
/*******************************************************************************
** Getter for queryStat
*******************************************************************************/
public QueryStat getQueryStat()
{
return (this.queryStat);
}
/*******************************************************************************
** Setter for queryStat
*******************************************************************************/
public void setQueryStat(QueryStat queryStat)
{
this.queryStat = queryStat;
}
}

View File

@ -92,6 +92,8 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega
// todo sql customization - can edit sql and/or param list
setSqlAndJoinsInQueryStat(sql, joinsContext);
AggregateOutput rs = new AggregateOutput();
List<AggregateResult> results = new ArrayList<>();
rs.setResults(results);
@ -104,6 +106,8 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega
{
while(resultSet.next())
{
setQueryStatFirstResultTime();
AggregateResult result = new AggregateResult();
results.add(result);

View File

@ -77,6 +77,8 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf
sql += " WHERE " + makeWhereClause(countInput.getInstance(), countInput.getSession(), table, joinsContext, filter, params);
// todo sql customization - can edit sql and/or param list
setSqlAndJoinsInQueryStat(sql, joinsContext);
CountOutput rs = new CountOutput();
try(Connection connection = getConnection(countInput))
{
@ -86,6 +88,8 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf
{
if(resultSet.next())
{
setQueryStatFirstResultTime();
rs.setCount(resultSet.getInt("record_count"));
if(BooleanUtils.isTrue(countInput.getIncludeDistinctCount()))

View File

@ -30,11 +30,9 @@ import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import com.kingsrook.qqq.backend.core.actions.interfaces.QueryInterface;
import com.kingsrook.qqq.backend.core.exceptions.QException;
@ -49,7 +47,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.fields.QFieldType;
import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData;
import com.kingsrook.qqq.backend.core.model.querystats.QueryStat;
import com.kingsrook.qqq.backend.core.utils.CollectionUtils;
import com.kingsrook.qqq.backend.core.utils.Pair;
import com.kingsrook.qqq.backend.module.rdbms.jdbc.QueryManager;
@ -63,8 +60,6 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
{
private static final QLogger LOG = QLogger.getLogger(RDBMSQueryAction.class);
private QueryStat queryStat;
/*******************************************************************************
@ -105,6 +100,8 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
// todo sql customization - can edit sql and/or param list
setSqlAndJoinsInQueryStat(sql, joinsContext);
Connection connection;
boolean needToCloseConnection = false;
if(queryInput.getTransaction() != null && queryInput.getTransaction() instanceof RDBMSTransaction rdbmsTransaction)
@ -144,21 +141,6 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
//////////////////////////////////////////////
QueryOutput queryOutput = new QueryOutput(queryInput);
if(queryStat != null)
{
queryStat.setQueryText(sql.toString());
if(CollectionUtils.nullSafeHasContents(joinsContext.getQueryJoins()))
{
Set<String> joinTableNames = new HashSet<>();
for(QueryJoin queryJoin : joinsContext.getQueryJoins())
{
joinTableNames.add(queryJoin.getJoinTable());
}
setQueryStatJoinTables(joinTableNames);
}
}
PreparedStatement statement = createStatement(connection, sql.toString(), queryInput);
QueryManager.executeStatement(statement, ((ResultSet resultSet) ->
{
@ -352,26 +334,4 @@ public class RDBMSQueryAction extends AbstractRDBMSAction implements QueryInterf
return (statement);
}
/*******************************************************************************
** Getter for queryStat
*******************************************************************************/
@Override
public QueryStat getQueryStat()
{
return (this.queryStat);
}
/*******************************************************************************
** Setter for queryStat
*******************************************************************************/
@Override
public void setQueryStat(QueryStat queryStat)
{
this.queryStat = queryStat;
}
}