From 18232d5e80ec294603c818b611d5983f31c81893 Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Fri, 23 May 2025 11:04:29 -0500 Subject: [PATCH] Add transaction to AggregateInput and CountInput --- .../tables/aggregate/AggregateInput.java | 34 ++++++++++++++++++ .../actions/tables/count/CountInput.java | 35 ++++++++++++++++++- .../actions/MongoDBAggregateAction.java | 2 +- .../mongodb/actions/MongoDBCountAction.java | 2 +- .../rdbms/actions/RDBMSAggregateAction.java | 19 +++++++++- .../rdbms/actions/RDBMSCountAction.java | 19 +++++++++- 6 files changed, 106 insertions(+), 5 deletions(-) diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java index e0fe22fc..c946c1a3 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/aggregate/AggregateInput.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.aggregate; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; import com.kingsrook.qqq.backend.core.model.actions.tables.QueryHint; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; @@ -37,6 +38,8 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin; *******************************************************************************/ public class AggregateInput extends AbstractTableActionInput { + private QBackendTransaction transaction; + private QQueryFilter filter; private List aggregates; private List groupBys = new ArrayList<>(); @@ -404,4 +407,35 @@ public class AggregateInput extends AbstractTableActionInput return (queryHints.contains(queryHint)); } + + /******************************************************************************* + ** Getter for transaction + *******************************************************************************/ + public QBackendTransaction getTransaction() + { + return (this.transaction); + } + + + + /******************************************************************************* + ** Setter for transaction + *******************************************************************************/ + public void setTransaction(QBackendTransaction transaction) + { + this.transaction = transaction; + } + + + + /******************************************************************************* + ** Fluent setter for transaction + *******************************************************************************/ + public AggregateInput withTransaction(QBackendTransaction transaction) + { + this.transaction = transaction; + return (this); + } + + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/count/CountInput.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/count/CountInput.java index a4f47090..37476e61 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/count/CountInput.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/actions/tables/count/CountInput.java @@ -25,6 +25,7 @@ package com.kingsrook.qqq.backend.core.model.actions.tables.count; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; +import com.kingsrook.qqq.backend.core.actions.QBackendTransaction; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; import com.kingsrook.qqq.backend.core.model.actions.tables.QueryHint; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; @@ -37,7 +38,8 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin; *******************************************************************************/ public class CountInput extends AbstractTableActionInput { - private QQueryFilter filter; + private QBackendTransaction transaction; + private QQueryFilter filter; private Integer timeoutSeconds; @@ -285,4 +287,35 @@ public class CountInput extends AbstractTableActionInput return (queryHints.contains(queryHint)); } + + /******************************************************************************* + ** Getter for transaction + *******************************************************************************/ + public QBackendTransaction getTransaction() + { + return (this.transaction); + } + + + + /******************************************************************************* + ** Setter for transaction + *******************************************************************************/ + public void setTransaction(QBackendTransaction transaction) + { + this.transaction = transaction; + } + + + + /******************************************************************************* + ** Fluent setter for transaction + *******************************************************************************/ + public CountInput withTransaction(QBackendTransaction transaction) + { + this.transaction = transaction; + return (this); + } + + } diff --git a/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBAggregateAction.java b/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBAggregateAction.java index c09bea65..ef09d158 100644 --- a/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBAggregateAction.java +++ b/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBAggregateAction.java @@ -84,7 +84,7 @@ public class MongoDBAggregateAction extends AbstractMongoDBAction implements Agg String backendTableName = getBackendTableName(table); MongoDBBackendMetaData backend = (MongoDBBackendMetaData) aggregateInput.getBackend(); - mongoClientContainer = openClient(backend, null); // todo - aggregate input has no transaction!? + mongoClientContainer = openClient(backend, aggregateInput.getTransaction()); MongoDatabase database = mongoClientContainer.getMongoClient().getDatabase(backend.getDatabaseName()); MongoCollection collection = database.getCollection(backendTableName); diff --git a/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBCountAction.java b/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBCountAction.java index 5dc7e9f6..befce862 100644 --- a/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBCountAction.java +++ b/qqq-backend-module-mongodb/src/main/java/com/kingsrook/qqq/backend/module/mongodb/actions/MongoDBCountAction.java @@ -72,7 +72,7 @@ public class MongoDBCountAction extends AbstractMongoDBAction implements CountIn String backendTableName = getBackendTableName(table); MongoDBBackendMetaData backend = (MongoDBBackendMetaData) countInput.getBackend(); - mongoClientContainer = openClient(backend, null); // todo - count input has no transaction!? + mongoClientContainer = openClient(backend, countInput.getTransaction()); MongoDatabase database = mongoClientContainer.getMongoClient().getDatabase(backend.getDatabaseName()); MongoCollection collection = database.getCollection(backendTableName); diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java index e4d69585..f52487f6 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSAggregateAction.java @@ -108,7 +108,19 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega Long mark = System.currentTimeMillis(); - try(Connection connection = getConnection(aggregateInput)) + Connection connection; + boolean needToCloseConnection = false; + if(aggregateInput.getTransaction() != null && aggregateInput.getTransaction() instanceof RDBMSTransaction rdbmsTransaction) + { + connection = rdbmsTransaction.getConnection(); + } + else + { + connection = getConnection(aggregateInput); + needToCloseConnection = true; + } + + try { statement = connection.prepareStatement(sql); @@ -185,6 +197,11 @@ public class RDBMSAggregateAction extends AbstractRDBMSAction implements Aggrega finally { logSQL(sql, params, mark); + + if(needToCloseConnection) + { + connection.close(); + } } return rs; diff --git a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java index 2aac8fb2..a91aa2c1 100644 --- a/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java +++ b/qqq-backend-module-rdbms/src/main/java/com/kingsrook/qqq/backend/module/rdbms/actions/RDBMSCountAction.java @@ -88,7 +88,19 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf CountOutput rs = new CountOutput(); long mark = System.currentTimeMillis(); - try(Connection connection = getConnection(countInput)) + Connection connection; + boolean needToCloseConnection = false; + if(countInput.getTransaction() != null && countInput.getTransaction() instanceof RDBMSTransaction rdbmsTransaction) + { + connection = rdbmsTransaction.getConnection(); + } + else + { + connection = getConnection(countInput); + needToCloseConnection = true; + } + + try { statement = connection.prepareStatement(sql); @@ -130,6 +142,11 @@ public class RDBMSCountAction extends AbstractRDBMSAction implements CountInterf finally { logSQL(sql, params, mark); + + if(needToCloseConnection) + { + connection.close(); + } } return rs;