From dfefd0c982a2c821f44085150052e90d1d534ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Thu, 6 Nov 2014 22:11:02 +0200 Subject: [PATCH 1/3] Add SQLXML support --- .../mysema/query/sql/types/SQLXMLType.java | 51 ++++++++++++++++++ .../query/sql/types/XMLAsStringType.java | 54 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 querydsl-sql/src/main/java/com/mysema/query/sql/types/SQLXMLType.java create mode 100644 querydsl-sql/src/main/java/com/mysema/query/sql/types/XMLAsStringType.java diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/types/SQLXMLType.java b/querydsl-sql/src/main/java/com/mysema/query/sql/types/SQLXMLType.java new file mode 100644 index 000000000..5973ad867 --- /dev/null +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/types/SQLXMLType.java @@ -0,0 +1,51 @@ +/* + * Copyright 2014, Timo Westkämper + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mysema.query.sql.types; + +import java.sql.*; + +/** + * SQLXMLType maps SQLXML to SQLXML on the JDBC level + * + * @author tiwe + * + */ +public class SQLXMLType extends AbstractType { + + public SQLXMLType() { + super(Types.SQLXML); + } + + public SQLXMLType(int type) { + super(type); + } + + @Override + public SQLXML getValue(ResultSet rs, int startIndex) throws SQLException { + return rs.getSQLXML(startIndex); + } + + @Override + public Class getReturnedClass() { + return SQLXML.class; + } + + @Override + public void setValue(PreparedStatement st, int startIndex, SQLXML value) + throws SQLException { + st.setSQLXML(startIndex, value); + + } + +} diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/types/XMLAsStringType.java b/querydsl-sql/src/main/java/com/mysema/query/sql/types/XMLAsStringType.java new file mode 100644 index 000000000..cc6fc536b --- /dev/null +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/types/XMLAsStringType.java @@ -0,0 +1,54 @@ +/* + * Copyright 2014, Timo Westkämper + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.mysema.query.sql.types; + +import java.sql.*; + +/** + * SQLXMLType maps String to SQLXML on the JDBC level + * + * @author tiwe + * + */ +public class XMLAsStringType extends AbstractType { + + public XMLAsStringType() { + super(Types.SQLXML); + } + + public XMLAsStringType(int type) { + super(type); + } + + @Override + public String getValue(ResultSet rs, int startIndex) throws SQLException { + SQLXML value = rs.getSQLXML(startIndex); + return value != null ? value.getString() : null; + } + + @Override + public Class getReturnedClass() { + return String.class; + } + + @Override + public void setValue(PreparedStatement st, int startIndex, String value) + throws SQLException { + SQLXML xml = st.getConnection().createSQLXML(); + xml.setString(value); + st.setSQLXML(startIndex, xml); + + } + +} From 661d0c8564a5c70dba93eb49909801da739f27a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 9 Nov 2014 00:16:54 +0200 Subject: [PATCH 2/3] Add tests --- .../com/mysema/query/AbstractBaseTest.java | 19 ++++--- .../java/com/mysema/query/Connections.java | 50 ++++++++++++++++++ .../java/com/mysema/query/InsertBase.java | 11 +++- .../com/mysema/query/sql/domain/QXmlTest.java | 51 +++++++++++++++++++ 4 files changed, 122 insertions(+), 9 deletions(-) create mode 100644 querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java 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 d60a2dd9e..cea0b1743 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java @@ -13,12 +13,11 @@ */ package com.mysema.query; +import javax.annotation.Nullable; +import java.sql.Connection; import java.util.List; -import javax.annotation.Nullable; - -import java.sql.Connection; - +import com.mysema.query.dml.DMLClause; import com.mysema.query.sql.*; import com.mysema.query.sql.dml.SQLDeleteClause; import com.mysema.query.sql.dml.SQLInsertClause; @@ -26,16 +25,13 @@ import com.mysema.query.sql.dml.SQLMergeClause; import com.mysema.query.sql.dml.SQLUpdateClause; import com.mysema.query.sql.mysql.MySQLReplaceClause; import com.mysema.query.sql.teradata.TeradataQuery; - +import com.mysema.query.sql.types.XMLAsStringType; import org.junit.Rule; import org.junit.rules.MethodRule; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import static org.junit.Assert.assertEquals; -import com.mysema.query.dml.DMLClause; - public abstract class AbstractBaseTest { protected static final Logger logger = LoggerFactory.getLogger(AbstractBaseTest.class); @@ -81,6 +77,13 @@ public abstract class AbstractBaseTest { @Nullable protected String expectedQuery; + public AbstractBaseTest() { + // TODO enable registration of (jdbc type, java type) -> usertype mappings + if (target == Target.POSTGRES || target == Target.ORACLE) { + configuration.register("xml_test", "col", new XMLAsStringType()); + } + } + @Rule public static MethodRule skipForQuotedRule = new SkipForQuotedRule(); diff --git a/querydsl-sql/src/test/java/com/mysema/query/Connections.java b/querydsl-sql/src/test/java/com/mysema/query/Connections.java index 816fd35e3..f336ea597 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/Connections.java +++ b/querydsl-sql/src/test/java/com/mysema/query/Connections.java @@ -286,6 +286,11 @@ public final class Connections { stmt.execute("drop table if exists DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + stmt.execute("drop table if exists XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + cubridInited = true; } @@ -341,6 +346,11 @@ public final class Connections { dropTable(templates, "DATE_TEST"); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + derbyInited = true; } @@ -450,6 +460,11 @@ public final class Connections { dropTable(templates, "DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + firebirdInited = true; } @@ -517,6 +532,11 @@ public final class Connections { stmt.execute("drop table DATE_TEST if exists"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + h2Inited = true; } @@ -578,6 +598,11 @@ public final class Connections { stmt.execute("drop table DATE_TEST if exists"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + hsqlInited = true; } @@ -643,6 +668,11 @@ public final class Connections { stmt.execute("drop table if exists DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + stmt.execute("drop table if exists XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + mysqlInited = true; } @@ -716,6 +746,11 @@ public final class Connections { // date_test and time_test dropTable(templates, "DATE_TEST"); stmt.execute("create table date_test(date_test date)"); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col XMLTYPE)"); + oracleInited = true; } @@ -803,6 +838,11 @@ public final class Connections { dropTable(templates, "DATE_TEST"); stmt.execute(quote(CREATE_TABLE_TIMETEST, "TIME_TEST")); stmt.execute(quote(CREATE_TABLE_DATETEST, "DATE_TEST")); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table \"XML_TEST\"(\"col\" XML)"); + postgresInited = true; } @@ -865,6 +905,11 @@ public final class Connections { stmt.execute("drop table if exists DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + stmt.execute("drop table if exists XML_TEST"); + stmt.execute("create table XML_TEST(col varchar(128))"); + sqliteInited = true; } @@ -916,6 +961,11 @@ public final class Connections { dropTable(templates, "DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(col XML)"); + sqlServerInited = true; } diff --git a/querydsl-sql/src/test/java/com/mysema/query/InsertBase.java b/querydsl-sql/src/test/java/com/mysema/query/InsertBase.java index 63cd931c5..b1785a2d6 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/InsertBase.java +++ b/querydsl-sql/src/test/java/com/mysema/query/InsertBase.java @@ -50,7 +50,7 @@ public class InsertBase extends AbstractBaseTest { } @Before - public void setUp() throws SQLException{ + public void setUp() throws SQLException { reset(); } @@ -430,4 +430,13 @@ public class InsertBase extends AbstractBaseTest { assertEquals(uuid, query().from(uuids).singleResult(uuids.field)); } + @Test + public void XML() { + delete(QXmlTest.xmlTest).execute(); + QXmlTest xmlTest = QXmlTest.xmlTest; + String contents = ""; + insert(xmlTest).set(xmlTest.col, contents).execute(); + assertEquals(contents, query().from(xmlTest).singleResult(xmlTest.col)); + } + } diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java new file mode 100644 index 000000000..35c8f45b9 --- /dev/null +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java @@ -0,0 +1,51 @@ +package com.mysema.query.sql.domain; + +import javax.annotation.Generated; +import java.sql.Types; + +import com.mysema.query.sql.ColumnMetadata; +import com.mysema.query.sql.spatial.RelationalPathSpatial; +import com.mysema.query.types.Path; +import com.mysema.query.types.PathMetadata; +import com.mysema.query.types.path.StringPath; +import static com.mysema.query.types.PathMetadataFactory.forVariable; + + + +/** + * QXmlTest is a Querydsl query type for QXmlTest + */ +@Generated("com.mysema.query.sql.codegen.MetaDataSerializer") +public class QXmlTest extends RelationalPathSpatial { + + private static final long serialVersionUID = 574759316; + + public static final QXmlTest xmlTest = new QXmlTest("xml_test"); + + public final StringPath col = createString("col"); + + public QXmlTest(String variable) { + super(QXmlTest.class, forVariable(variable), "public", "xml_test"); + addMetadata(); + } + + public QXmlTest(String variable, String schema, String table) { + super(QXmlTest.class, forVariable(variable), schema, table); + addMetadata(); + } + + public QXmlTest(Path path) { + super(path.getType(), path.getMetadata(), "public", "xml_test"); + addMetadata(); + } + + public QXmlTest(PathMetadata metadata) { + super(QXmlTest.class, metadata, "public", "xml_test"); + addMetadata(); + } + + public void addMetadata() { + addMetadata(col, ColumnMetadata.named("col").withIndex(1).ofType(Types.SQLXML).withSize(2147483647)); + } + +} From 5f057a4e71990d60392e56aa07c9efa800b3fab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 9 Nov 2014 12:10:52 +0200 Subject: [PATCH 3/3] Improve tests --- .../com/mysema/query/AbstractBaseTest.java | 2 +- .../java/com/mysema/query/Connections.java | 25 +++++++++++-------- .../com/mysema/query/sql/domain/QXmlTest.java | 12 ++++----- 3 files changed, 22 insertions(+), 17 deletions(-) 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 cea0b1743..82e3abf3c 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/AbstractBaseTest.java @@ -80,7 +80,7 @@ public abstract class AbstractBaseTest { public AbstractBaseTest() { // TODO enable registration of (jdbc type, java type) -> usertype mappings if (target == Target.POSTGRES || target == Target.ORACLE) { - configuration.register("xml_test", "col", new XMLAsStringType()); + configuration.register("XML_TEST", "COL", new XMLAsStringType()); } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/Connections.java b/querydsl-sql/src/test/java/com/mysema/query/Connections.java index f336ea597..29b7b4c7c 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/Connections.java +++ b/querydsl-sql/src/test/java/com/mysema/query/Connections.java @@ -289,7 +289,7 @@ public final class Connections { // xml stmt.execute("drop table if exists XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); cubridInited = true; } @@ -349,7 +349,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); derbyInited = true; } @@ -463,7 +463,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); firebirdInited = true; } @@ -535,7 +535,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); h2Inited = true; } @@ -601,7 +601,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); hsqlInited = true; } @@ -671,7 +671,7 @@ public final class Connections { // xml stmt.execute("drop table if exists XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); mysqlInited = true; } @@ -749,7 +749,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col XMLTYPE)"); + stmt.execute("create table XML_TEST(COL XMLTYPE)"); oracleInited = true; } @@ -841,7 +841,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table \"XML_TEST\"(\"col\" XML)"); + stmt.execute("create table \"XML_TEST\"(\"COL\" XML)"); postgresInited = true; } @@ -908,7 +908,7 @@ public final class Connections { // xml stmt.execute("drop table if exists XML_TEST"); - stmt.execute("create table XML_TEST(col varchar(128))"); + stmt.execute("create table XML_TEST(COL varchar(128))"); sqliteInited = true; } @@ -964,7 +964,7 @@ public final class Connections { // xml dropTable(templates, "XML_TEST"); - stmt.execute("create table XML_TEST(col XML)"); + stmt.execute("create table XML_TEST(COL XML)"); sqlServerInited = true; } @@ -1032,6 +1032,11 @@ public final class Connections { dropTable(templates, "DATE_TEST"); stmt.execute(CREATE_TABLE_TIMETEST); stmt.execute(CREATE_TABLE_DATETEST); + + // xml + dropTable(templates, "XML_TEST"); + stmt.execute("create table XML_TEST(COL varchar(128))"); + teradataInited = true; } diff --git a/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java b/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java index 35c8f45b9..27bbf3cd0 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/sql/domain/QXmlTest.java @@ -20,12 +20,12 @@ public class QXmlTest extends RelationalPathSpatial { private static final long serialVersionUID = 574759316; - public static final QXmlTest xmlTest = new QXmlTest("xml_test"); + public static final QXmlTest xmlTest = new QXmlTest("XML_TEST"); - public final StringPath col = createString("col"); + public final StringPath col = createString("COL"); public QXmlTest(String variable) { - super(QXmlTest.class, forVariable(variable), "public", "xml_test"); + super(QXmlTest.class, forVariable(variable), "PUBLIC", "XML_TEST"); addMetadata(); } @@ -35,17 +35,17 @@ public class QXmlTest extends RelationalPathSpatial { } public QXmlTest(Path path) { - super(path.getType(), path.getMetadata(), "public", "xml_test"); + super(path.getType(), path.getMetadata(), "PUBLIC", "XML_TEST"); addMetadata(); } public QXmlTest(PathMetadata metadata) { - super(QXmlTest.class, metadata, "public", "xml_test"); + super(QXmlTest.class, metadata, "PUBLIC", "XML_TEST"); addMetadata(); } public void addMetadata() { - addMetadata(col, ColumnMetadata.named("col").withIndex(1).ofType(Types.SQLXML).withSize(2147483647)); + addMetadata(col, ColumnMetadata.named("COL").withIndex(1).ofType(Types.SQLXML).withSize(2147483647)); } }