/* * Copyright 2015, The Querydsl Team (http://www.querydsl.com/team) * * 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.querydsl.sql; import static com.querydsl.core.Target.*; import static com.querydsl.sql.Constants.survey; import static com.querydsl.sql.Constants.survey2; import static org.junit.Assert.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.querydsl.core.testutil.ExcludeIn; import com.querydsl.core.testutil.IncludeIn; import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.sql.dml.SQLMergeClause; import com.querydsl.sql.domain.QSurvey; public class MergeBase extends AbstractBaseTest { private void reset() throws SQLException { delete(survey).execute(); insert(survey).values(1, "Hello World", "Hello").execute(); } @Before public void setUp() throws SQLException { reset(); } @After public void tearDown() throws SQLException { reset(); } @Test @ExcludeIn({H2, CUBRID, SQLSERVER}) public void merge_with_keys() throws SQLException { ResultSet rs = merge(survey).keys(survey.id) .set(survey.id, 7) .set(survey.name, "Hello World").executeWithKeys(); assertTrue(rs.next()); assertTrue(rs.getObject(1) != null); rs.close(); } @Test @ExcludeIn({H2, CUBRID, SQLSERVER}) public void merge_with_keys_listener() throws SQLException { final AtomicBoolean result = new AtomicBoolean(); SQLListener listener = new SQLBaseListener() { @Override public void end(SQLListenerContext context) { result.set(true); } }; SQLMergeClause clause = merge(survey).keys(survey.id) .set(survey.id, 7) .set(survey.name, "Hello World"); clause.addListener(listener); ResultSet rs = clause.executeWithKeys(); assertTrue(rs.next()); assertTrue(rs.getObject(1) != null); rs.close(); assertTrue(result.get()); } @Test @IncludeIn(H2) public void merge_with_keys_and_subQuery() { assertEquals(1, insert(survey).set(survey.id, 6).set(survey.name, "H").execute()); // keys + subquery QSurvey survey2 = new QSurvey("survey2"); assertEquals(2, merge(survey).keys(survey.id).select( query().from(survey2).select(survey2.id.add(1), survey2.name, survey2.name2)).execute()); } @Test @IncludeIn(H2) public void merge_with_keys_and_values() { // NOTE : doesn't work with composite merge implementation // keys + values assertEquals(1, merge(survey).keys(survey.id).values(5, "Hello World", "Hello").execute()); } @Test public void merge_with_keys_columns_and_values() { // keys + columns + values assertEquals(1, merge(survey).keys(survey.id) .set(survey.id, 5) .set(survey.name, "Hello World").execute()); } @Test public void merge_with_keys_columns_and_values_using_null() { // keys + columns + values assertEquals(1, merge(survey).keys(survey.id) .set(survey.id, 5) .set(survey.name, (String) null).execute()); } @Test @ExcludeIn({CUBRID, DB2, DERBY, POSTGRESQL, SQLSERVER, TERADATA}) public void merge_with_keys_Null_Id() throws SQLException { ResultSet rs = merge(survey).keys(survey.id) .setNull(survey.id) .set(survey.name, "Hello World").executeWithKeys(); assertTrue(rs.next()); assertTrue(rs.getObject(1) != null); rs.close(); } @Test @ExcludeIn({H2, CUBRID, SQLSERVER}) public void merge_with_keys_Projected() throws SQLException { assertNotNull(merge(survey).keys(survey.id) .set(survey.id, 8) .set(survey.name, "Hello you").executeWithKey(survey.id)); } @Test @ExcludeIn({H2, CUBRID, SQLSERVER}) public void merge_with_keys_Projected2() throws SQLException { Path<Object> idPath = ExpressionUtils.path(Object.class, "id"); Object id = merge(survey).keys(survey.id) .set(survey.id, 9) .set(survey.name, "Hello you").executeWithKey(idPath); assertNotNull(id); } @Test @IncludeIn(H2) public void mergeBatch() { SQLMergeClause merge = merge(survey) .keys(survey.id) .set(survey.id, 5) .set(survey.name, "5") .addBatch(); assertEquals(1, merge.getBatchCount()); assertFalse(merge.isEmpty()); merge .keys(survey.id) .set(survey.id, 6) .set(survey.name, "6") .addBatch(); assertEquals(2, merge.getBatchCount()); assertEquals(2, merge.execute()); assertEquals(1L, query().from(survey).where(survey.name.eq("5")).fetchCount()); assertEquals(1L, query().from(survey).where(survey.name.eq("6")).fetchCount()); } @Test @IncludeIn(H2) public void mergeBatch_templates() { SQLMergeClause merge = merge(survey) .keys(survey.id) .set(survey.id, 5) .set(survey.name, Expressions.stringTemplate("'5'")) .addBatch(); merge .keys(survey.id) .set(survey.id, 6) .set(survey.name, Expressions.stringTemplate("'6'")) .addBatch(); assertEquals(2, merge.execute()); assertEquals(1L, query().from(survey).where(survey.name.eq("5")).fetchCount()); assertEquals(1L, query().from(survey).where(survey.name.eq("6")).fetchCount()); } @Test @IncludeIn(H2) public void mergeBatch_with_subquery() { SQLMergeClause merge = merge(survey) .keys(survey.id) .columns(survey.id, survey.name) .select(query().from(survey2).select(survey2.id.add(20), survey2.name)) .addBatch(); merge(survey) .keys(survey.id) .columns(survey.id, survey.name) .select(query().from(survey2).select(survey2.id.add(40), survey2.name)) .addBatch(); assertEquals(1, merge.execute()); } @Test @IncludeIn(H2) public void merge_with_templateExpression_in_batch() { SQLMergeClause merge = merge(survey) .keys(survey.id) .set(survey.id, 5) .set(survey.name, Expressions.stringTemplate("'5'")) .addBatch(); assertEquals(1, merge.execute()); } @Test public void merge_listener() { final AtomicInteger calls = new AtomicInteger(0); SQLListener listener = new SQLBaseListener() { @Override public void end(SQLListenerContext context) { if (context.getData(AbstractSQLQuery.PARENT_CONTEXT) == null) { calls.incrementAndGet(); } } }; SQLMergeClause clause = merge(survey).keys(survey.id) .set(survey.id, 5) .set(survey.name, "Hello World"); clause.addListener(listener); assertEquals(1, clause.execute()); assertEquals(1, calls.intValue()); } }