diff --git a/querydsl-core/src/main/java/com/mysema/query/QueryFlag.java b/querydsl-core/src/main/java/com/mysema/query/QueryFlag.java index 598b778ad..b67fc0403 100644 --- a/querydsl-core/src/main/java/com/mysema/query/QueryFlag.java +++ b/querydsl-core/src/main/java/com/mysema/query/QueryFlag.java @@ -28,6 +28,8 @@ public class QueryFlag implements Serializable{ START, + START_OVERRIDE, + AFTER_SELECT, AFTER_PROJECTION, diff --git a/querydsl-core/src/main/java/com/mysema/query/types/SerializerBase.java b/querydsl-core/src/main/java/com/mysema/query/types/SerializerBase.java index 48467649f..655c3ad9d 100644 --- a/querydsl-core/src/main/java/com/mysema/query/types/SerializerBase.java +++ b/querydsl-core/src/main/java/com/mysema/query/types/SerializerBase.java @@ -102,12 +102,15 @@ public abstract class SerializerBase> implements Vis } } - protected void serialize(Position position, Set flags) { + protected boolean serialize(Position position, Set flags) { + boolean handled = false; for (QueryFlag flag : flags){ if (flag.getPosition() == position){ handle(flag.getFlag()); + handled = true; } } + return handled; } public void setConstantPrefix(String prefix){ diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java index 8c68cdd98..38b648c03 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/AbstractSQLQuery.java @@ -33,7 +33,6 @@ import com.mysema.query.SearchResults; import com.mysema.query.QueryFlag.Position; import com.mysema.query.support.ProjectableQuery; import com.mysema.query.support.QueryMixin; -import com.mysema.query.types.EConstructor; import com.mysema.query.types.Expr; import com.mysema.query.types.FactoryExpression; import com.mysema.query.types.OrderSpecifier; diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java index 604dccb9d..48fed996e 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/SQLSerializer.java @@ -239,21 +239,33 @@ public class SQLSerializer extends SerializerBase { } - public void serializeForDelete(PEntity entity, EBoolean where) { + public void serializeForDelete(QueryMetadata metadata, PEntity entity) { this.entity = entity; - append(templates.getDeleteFrom()); + + serialize(Position.START, metadata.getFlags()); + + if (!serialize(Position.START_OVERRIDE, metadata.getFlags())){ + append(templates.getDeleteFrom()); + } handle(entity); - if (where != null) { + if (metadata.getWhere() != null) { skipParent = true; - append(templates.getWhere()).handle(where); + append(templates.getWhere()).handle(metadata.getWhere()); skipParent = false; } + + serialize(Position.END, metadata.getFlags()); } - public void serializeForMerge(PEntity entity, List> keys, + public void serializeForMerge(QueryMetadata metadata, PEntity entity, List> keys, List> columns, List> values, @Nullable SubQuery subQuery) { this.entity = entity; - append(templates.getMergeInto()); + + serialize(Position.START, metadata.getFlags()); + + if (!serialize(Position.START_OVERRIDE, metadata.getFlags())){ + append(templates.getMergeInto()); + } handle(entity); append(" "); // columns @@ -279,12 +291,19 @@ public class SQLSerializer extends SerializerBase { append(templates.getValues()); append("(").handle(COMMA, values).append(") "); } + + serialize(Position.END, metadata.getFlags()); } - public void serializeForInsert(PEntity entity, List> columns, + public void serializeForInsert(QueryMetadata metadata, PEntity entity, List> columns, List> values, @Nullable SubQuery subQuery) { this.entity = entity; - append(templates.getInsertInto()); + + serialize(Position.START, metadata.getFlags()); + + if (!serialize(Position.START_OVERRIDE, metadata.getFlags())){ + append(templates.getInsertInto()); + } handle(entity); // columns if (!columns.isEmpty()){ @@ -305,12 +324,18 @@ public class SQLSerializer extends SerializerBase { handle(COMMA, values); append(")"); } + + serialize(Position.END, metadata.getFlags()); } - public void serializeForUpdate(PEntity entity, - List, ?>> updates, EBoolean where) { + public void serializeForUpdate(QueryMetadata metadata, PEntity entity, List, ?>> updates) { this.entity = entity; - append(templates.getUpdate()); + + serialize(Position.START, metadata.getFlags()); + + if (!serialize(Position.START_OVERRIDE, metadata.getFlags())){ + append(templates.getUpdate()); + } handle(entity); append("\n"); append(templates.getSet()); @@ -330,9 +355,11 @@ public class SQLSerializer extends SerializerBase { first = false; } skipParent = false; - if (where != null) { - append(templates.getWhere()).handle(where); + if (metadata.getWhere() != null) { + append(templates.getWhere()).handle(metadata.getWhere()); } + + serialize(Position.END, metadata.getFlags()); } private void serializeSources(List joins) { diff --git a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLDeleteClause.java b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLDeleteClause.java index 5311901b9..34f95b451 100644 --- a/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLDeleteClause.java +++ b/querydsl-sql/src/main/java/com/mysema/query/sql/dml/SQLDeleteClause.java @@ -13,8 +13,11 @@ import java.util.Collections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.mysema.query.BooleanBuilder; +import com.mysema.query.DefaultQueryMetadata; import com.mysema.query.QueryException; +import com.mysema.query.QueryFlag; +import com.mysema.query.QueryMetadata; +import com.mysema.query.QueryFlag.Position; import com.mysema.query.dml.DeleteClause; import com.mysema.query.sql.Configuration; import com.mysema.query.sql.SQLSerializer; @@ -40,8 +43,8 @@ public class SQLDeleteClause extends AbstractSQLClause implements DeleteClause entity; - private final BooleanBuilder where = new BooleanBuilder(); - + private final QueryMetadata metadata = new DefaultQueryMetadata(); + public SQLDeleteClause(Connection connection, SQLTemplates templates, PEntity entity) { this(connection, new Configuration(templates), entity); } @@ -51,6 +54,11 @@ public class SQLDeleteClause extends AbstractSQLClause implements DeleteClause entity; + + private final QueryMetadata metadata = new DefaultQueryMetadata(); @Nullable private SubQuery subQuery; @@ -71,6 +77,11 @@ public class SQLInsertClause extends AbstractSQLClause implements InsertClause,Object>emptyMap()); }else{ - serializer.serializeForInsert(entity, batches.get(0).getColumns(), batches.get(0).getValues(), batches.get(0).getSubQuery()); + serializer.serializeForInsert(metadata, entity, batches.get(0).getColumns(), batches.get(0).getValues(), batches.get(0).getSubQuery()); queryString = serializer.toString(); logger.debug(queryString); stmt = connection.prepareStatement(queryString); @@ -158,7 +169,7 @@ public class SQLInsertClause extends AbstractSQLClause implements InsertClause,Object>emptyMap()); stmt.addBatch(); } @@ -249,7 +260,7 @@ public class SQLInsertClause extends AbstractSQLClause implements InsertClause entity; + private final QueryMetadata metadata = new DefaultQueryMetadata(); + private final List> keys = new ArrayList>(); @Nullable @@ -65,6 +71,11 @@ public class SQLMergeClause extends AbstractSQLClause implements StoreClause,?>> updates = new ArrayList,?>>(); - private final BooleanBuilder where = new BooleanBuilder(); - + private final QueryMetadata metadata = new DefaultQueryMetadata(); + public SQLUpdateClause(Connection connection, SQLTemplates templates, PEntity entity) { this(connection, new Configuration(templates), entity); } @@ -58,6 +61,11 @@ public class SQLUpdateClause extends AbstractSQLClause implements UpdateClause< this.connection = connection; this.entity = entity; } + + public SQLUpdateClause addFlag(Position position, String flag){ + metadata.addFlag(new QueryFlag(position, flag)); + return this; + } protected void close(PreparedStatement stmt) { @@ -71,7 +79,7 @@ public class SQLUpdateClause extends AbstractSQLClause implements UpdateClause< @Override public long execute() { SQLSerializer serializer = new SQLSerializer(configuration.getTemplates(), true); - serializer.serializeForUpdate(entity, updates, where.getValue()); + serializer.serializeForUpdate(metadata, entity, updates); String queryString = serializer.toString(); logger.debug(queryString); @@ -114,16 +122,14 @@ public class SQLUpdateClause extends AbstractSQLClause implements UpdateClause< @Override public SQLUpdateClause where(EBoolean... o) { - for (EBoolean e : o){ - where.and(e); - } + metadata.addWhere(o); return this; } @Override public String toString(){ SQLSerializer serializer = new SQLSerializer(configuration.getTemplates(), true); - serializer.serializeForUpdate(entity, updates, where.getValue()); + serializer.serializeForUpdate(metadata, entity, updates); return serializer.toString(); } } diff --git a/querydsl-sql/src/test/java/com/mysema/query/_mysql/InsertMySQLTest.java b/querydsl-sql/src/test/java/com/mysema/query/_mysql/InsertMySQLTest.java index 89adefff2..11cea6afa 100644 --- a/querydsl-sql/src/test/java/com/mysema/query/_mysql/InsertMySQLTest.java +++ b/querydsl-sql/src/test/java/com/mysema/query/_mysql/InsertMySQLTest.java @@ -5,15 +5,21 @@ */ package com.mysema.query._mysql; +import static com.mysema.query.Constants.survey; +import static org.junit.Assert.*; + import java.sql.SQLException; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Test; import com.mysema.query.Connections; import com.mysema.query.InsertBaseTest; import com.mysema.query.Target; +import com.mysema.query.QueryFlag.Position; import com.mysema.query.sql.MySQLTemplates; +import com.mysema.query.sql.dml.SQLInsertClause; import com.mysema.testutil.Label; import com.mysema.testutil.ResourceCheck; @@ -31,5 +37,17 @@ public class InsertMySQLTest extends InsertBaseTest{ templates = new MySQLTemplates().newLineToSingleSpace(); super.setUp(); } + + @Test + public void insert_with_special_options(){ + SQLInsertClause clause = insert(survey) + .columns(survey.id, survey.name) + .values(3, "Hello"); + + clause.addFlag(Position.START_OVERRIDE, "INSERT IGNORE INTO "); + + assertEquals("INSERT IGNORE INTO SURVEY(ID, NAME) values (?, ?)", clause.toString()); + clause.execute(); + } }