diff --git a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIPreparedNamedStatement.java b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIPreparedNamedStatement.java index f2fefeb363..9dadddf7c0 100644 --- a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIPreparedNamedStatement.java +++ b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIPreparedNamedStatement.java @@ -39,6 +39,7 @@ public class PIPreparedNamedStatement extends PIPreparedStatement { @Setter private PolyImplementation implementation; @Getter + @Setter private Statement statement; private final NamedValueProcessor namedValueProcessor; diff --git a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIStatement.java b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIStatement.java index d31ca34a07..cab7974762 100644 --- a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIStatement.java +++ b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIStatement.java @@ -74,6 +74,8 @@ public void closeResults() { public abstract void setImplementation( PolyImplementation implementation ); + public abstract void setStatement( Statement statement ); + public abstract Statement getStatement(); public abstract String getQuery(); diff --git a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIUnparameterizedStatement.java b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIUnparameterizedStatement.java index 7229b2d2f0..1ce4d162df 100644 --- a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIUnparameterizedStatement.java +++ b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/PIUnparameterizedStatement.java @@ -33,6 +33,7 @@ public class PIUnparameterizedStatement extends PIStatement { private final String query; + @Setter private Statement statement; @Setter private PolyImplementation implementation; diff --git a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/StatementManager.java b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/StatementManager.java index 354b73f54e..b023c2daa2 100644 --- a/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/StatementManager.java +++ b/plugins/prism-interface/src/main/java/org/polypheny/db/prisminterface/statements/StatementManager.java @@ -17,6 +17,7 @@ package org.polypheny.db.prisminterface.statements; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -28,6 +29,7 @@ import org.polypheny.db.languages.QueryLanguage; import org.polypheny.db.prisminterface.PIClient; import org.polypheny.db.prisminterface.PIServiceException; +import org.polypheny.db.transaction.Statement; import org.polypheny.prism.ExecuteUnparameterizedStatementRequest; import org.polypheny.prism.PrepareStatementRequest; @@ -36,8 +38,8 @@ public class StatementManager { private final AtomicInteger statementIdGenerator; private final PIClient client; - private ConcurrentHashMap openStatements; - private ConcurrentHashMap openUnparameterizedBatches; + private final Map openStatements; + private final Map openUnparameterizedBatches; public StatementManager( PIClient client ) { @@ -190,25 +192,29 @@ public PIStatement getStatement( int statementId ) { if ( statement == null ) { throw new PIServiceException( "A statement with id " + statementId + " does not exist for that client" ); } + Statement s = statement.getStatement(); + if ( s != null && s.getTransaction().getId() != client.getOrCreateNewTransaction().getId() ) { + statement.setStatement( client.getCurrentTransaction().createStatement() ); + } return statement; } public PIPreparedNamedStatement getNamedPreparedStatement( int statementId ) throws PIServiceException { PIStatement statement = getStatement( statementId ); - if ( !(statement instanceof PIPreparedNamedStatement) ) { + if ( !(statement instanceof PIPreparedNamedStatement prepared) ) { throw new PIServiceException( "A named prepared statement with id " + statementId + " does not exist for that client" ); } - return (PIPreparedNamedStatement) statement; + return prepared; } public PIPreparedIndexedStatement getIndexedPreparedStatement( int statementId ) throws PIServiceException { PIStatement statement = getStatement( statementId ); - if ( !(statement instanceof PIPreparedIndexedStatement) ) { + if ( !(statement instanceof PIPreparedIndexedStatement prepared) ) { throw new PIServiceException( "A prepared indexed statement with id " + statementId + " does not exist for that client" ); } - return (PIPreparedIndexedStatement) statement; + return prepared; }