From 3bd9c48ce6545448087dc3b178a03b98e7de416c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Wed, 4 Dec 2013 14:58:57 +0200 Subject: [PATCH] Extend and test SetQueryBandClause #553 --- .../sql/teradata/SetQueryBandClause.java | 36 ++++++++++++++----- .../com/mysema/query/AbstractBaseTest.java | 5 +++ .../java/com/mysema/query/SelectBase.java | 14 ++++++++ .../sql/teradata/SetQueryBandClauseTest.java | 19 +++++++--- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/teradata/SetQueryBandClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/teradata/SetQueryBandClause.java index 2cf22b28a..91cca95be 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/teradata/SetQueryBandClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/teradata/SetQueryBandClause.java @@ -14,8 +14,8 @@ package com.mysema.query.sql.teradata; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.SQLException; -import java.sql.Statement; import java.util.List; import java.util.Map; @@ -41,6 +41,8 @@ public class SetQueryBandClause extends AbstractSQLClause { private transient String queryString; + private transient String parameter; + public SetQueryBandClause(Connection connection, SQLTemplates templates) { this(connection, new Configuration(templates)); } @@ -76,22 +78,31 @@ public class SetQueryBandClause extends AbstractSQLClause { @Override public long execute() { - Statement stmt = null; + PreparedStatement stmt = null; try { - stmt = connection.createStatement(); - stmt.execute(toString()); + stmt = connection.prepareStatement(toString()); + if (parameter != null) { + stmt.setString(1, parameter); + } return 1; } catch (SQLException e) { throw new QueryException("Caught " + e.getClass().getSimpleName() + " for " + queryString, e); } finally { - close(stmt); + if (stmt != null) { + close(stmt); + } } } @Override public List getSQL() { - SQLBindings bindings = new SQLBindings(toString(), ImmutableList.of()); + SQLBindings bindings; + if (configuration.getUseLiterals() || forSession) { + bindings = new SQLBindings(toString(), ImmutableList.of()); + } else { + bindings = new SQLBindings(toString(), ImmutableList.of(parameter)); + } return ImmutableList.of(bindings); } @@ -99,13 +110,20 @@ public class SetQueryBandClause extends AbstractSQLClause { public String toString() { if (queryString == null) { StringBuilder builder = new StringBuilder(); - builder.append("set query band = '"); for (Map.Entry entry : values.entrySet()) { builder.append(entry.getKey()).append("=").append(entry.getValue()); builder.append(";"); } - builder.append(forSession ? "' for session" : "' for transaction"); - queryString = builder.toString(); + if (configuration.getUseLiterals() || forSession) { + queryString = "set query_band=" + + configuration.getTemplates().asLiteral(builder.toString()) + + (forSession ? " for session" : " for transaction"); + parameter = null; + } else { + queryString = "set query_band=?" + (forSession ? " for session" : " for transaction"); + parameter = builder.toString(); + } + } return queryString; } diff --git a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java index 8cb746deb..7c05d1dfe 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java @@ -38,6 +38,7 @@ import com.mysema.query.sql.dml.SQLUpdateClause; import com.mysema.query.sql.mysql.MySQLQuery; import com.mysema.query.sql.mysql.MySQLReplaceClause; import com.mysema.query.sql.oracle.OracleQuery; +import com.mysema.query.sql.teradata.SetQueryBandClause; import com.mysema.query.sql.teradata.TeradataQuery; public abstract class AbstractBaseTest { @@ -106,6 +107,10 @@ public abstract class AbstractBaseTest { return new SQLMergeClause(connection, configuration, e); } + protected SetQueryBandClause setQueryBand() { + return new SetQueryBandClause(connection, configuration); + } + protected ExtendedSQLQuery extQuery() { return new ExtendedSQLQuery(connection, configuration); } diff --git a/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java b/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java index 7bb2132af..c8b31aae4 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java +++ b/querydsl-sql/src/test/java/com/mysema/query/SelectBase.java @@ -1179,6 +1179,20 @@ public class SelectBase extends AbstractBaseTest { assertEquals("from SURVEY s, SURVEY s2", query.toString()); } + @Test + @IncludeIn(TERADATA) + public void SetQueryBand_ForSession() { + setQueryBand().set("a", "bb").forSession().execute(); + query().from(survey).list(survey.id); + } + + @Test + @IncludeIn(TERADATA) + public void SetQueryBand_ForTransaction() { + setQueryBand().set("a", "bb").forTransaction().execute(); + query().from(survey).list(survey.id); + } + @Test public void Single() { assertNotNull(query().from(survey).singleResult(survey.name)); diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/teradata/SetQueryBandClauseTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/teradata/SetQueryBandClauseTest.java index ab8103b33..d701ff896 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/sql/teradata/SetQueryBandClauseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/teradata/SetQueryBandClauseTest.java @@ -10,18 +10,29 @@ import com.mysema.query.sql.SQLTemplates; public class SetQueryBandClauseTest { + private Configuration conf; + private SetQueryBandClause clause; @Before public void setUp() { - Configuration conf = new Configuration(SQLTemplates.DEFAULT); + conf = new Configuration(SQLTemplates.DEFAULT); + conf.setUseLiterals(true); clause = new SetQueryBandClause(null, conf); } @Test public void ToString() { clause.set("a", "b"); - assertEquals("set query band = 'a=b;' for session", clause.toString()); + assertEquals("set query_band='a=b;' for session", clause.toString()); + } + + @Test + public void ToString2() { + conf.setUseLiterals(false); + clause.set("a", "b"); + clause.forTransaction(); + assertEquals("set query_band=? for transaction", clause.toString()); } @Test @@ -29,7 +40,7 @@ public class SetQueryBandClauseTest { clause.forTransaction(); clause.set("a", "b"); clause.set("b", "c"); - assertEquals("set query band = 'b=c;a=b;' for transaction", clause.toString()); + assertEquals("set query_band='b=c;a=b;' for transaction", clause.toString()); } @Test @@ -37,7 +48,7 @@ public class SetQueryBandClauseTest { clause.forTransaction(); clause.set("a", "b"); clause.set("b", "c"); - assertEquals("set query band = 'b=c;a=b;' for transaction", clause.getSQL().get(0).getSQL()); + assertEquals("set query_band='b=c;a=b;' for transaction", clause.getSQL().get(0).getSQL()); } }