re-enable tests

re-organize some tests
case expression and nested expression type inference
preliminary support for "type precedence"
This commit is contained in:
Steve Ebersole 2021-04-15 08:52:07 -05:00
parent c2f59beb64
commit e0bbb02c99
2 changed files with 172 additions and 190 deletions

View File

@ -0,0 +1,172 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.orm.test.query.hql;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
/**
* @author Steve Ebersole
*/
@DomainModel( annotatedClasses = CaseStatementTest.Person.class )
@SessionFactory
public class CaseStatementTest {
@Test
public void testSimpleCaseStatementFixture(SessionFactoryScope scope) {
scope.inTransaction(
(s) -> {
s.createQuery( "select case p.name when 'Steve' then 'x' else 'y' end from Person p" )
.list();
}
);
}
@Test
public void testSimpleCaseStatementWithParamResult(SessionFactoryScope scope) {
scope.inTransaction(
(s) -> {
s.createQuery( "select case p.name when 'Steve' then :opt1 else p.name end from Person p" )
.setParameter( "opt1", "x" )
.list();
}
);
}
@Test
public void testSimpleCaseStatementWithParamAllResults(SessionFactoryScope scope) {
scope.inTransaction(
(session) -> {
session.createQuery( "select case p.name when 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
session.createQuery( "select case p.name when 'Steve' then cast( :opt1 as string ) else cast( :opt2 as string) end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
session.createQuery( "select case p.name when 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
}
);
}
@Test
public void testSearchedCaseStatementFixture(SessionFactoryScope scope) {
scope.inTransaction(
(s) -> {
s.createQuery( "select case when p.name = 'Steve' then 'x' else 'y' end from Person p" )
.list();
}
);
}
@Test
@TestForIssue( jiraKey = "HHH-13095" )
public void testSearchedCaseStatementArithmeticExpression(SessionFactoryScope scope) {
scope.inTransaction(
(session) -> {
Person steve = new Person();
steve.id = 1;
steve.name = "Steve";
session.persist( steve );
Person brian = new Person();
brian.id = 2;
brian.name = "Brian";
session.persist( brian );
List<Integer> values = session.createQuery(
"select case when p.name = 'Steve' then (p.id * 10) else p.id end from Person p order by p.id" )
.getResultList();
assertEquals( 10, (int) values.get( 0 ) );
assertEquals( 2, (int) values.get( 1 ) );
}
);
}
@Test
public void testSearchedCaseStatementWithParamResult(SessionFactoryScope scope) {
scope.inTransaction(
(s) -> {
s.createQuery( "select case when p.name = 'Steve' then :opt1 else p.name end from Person p" )
.setParameter( "opt1", "x" )
.list();
}
);
}
@Test
public void testSearchedCaseStatementWithAllParamResults(SessionFactoryScope scope) {
scope.inTransaction(
(session) -> session.persist( new Person( 1, "Steve" ) )
);
scope.inTransaction(
(session) -> {
final List list = session.createQuery( "select case when p.name = 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
assertThat( list.size(), is( 1 ) );
assertThat( list.get( 0 ), is( "x" ) );
}
);
scope.inTransaction(
(session) -> {
final List list = session.createQuery( "select case when p.name = 'Steve' then cast( :opt1 as string) else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
assertThat( list.size(), is( 1 ) );
assertThat( list.get( 0 ), is( "x" ) );
}
);
}
@Entity(name = "Person")
public static class Person {
@Id
private Integer id;
private String name;
private Person() {
}
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
}
@AfterEach
public void dropTestData(SessionFactoryScope scope) {
scope.inTransaction(
(session) -> session.createQuery( "delete Person" ).executeUpdate()
);
}
}

View File

@ -1,190 +0,0 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.hql;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.QueryException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.After;
import org.junit.Test;
import static org.hamcrest.Matchers.is;
import static org.hibernate.testing.junit4.ExtraAssertions.assertTyping;
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
import static org.hibernate.testing.transaction.TransactionUtil2.inTransaction;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Steve Ebersole
*/
public class CaseStatementTest extends BaseCoreFunctionalTestCase {
@Entity(name = "Person")
public static class Person {
@Id
private Integer id;
private String name;
private Person() {
}
public Person(Integer id, String name) {
this.id = id;
this.name = name;
}
}
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { Person.class };
}
@Test
public void testSimpleCaseStatementFixture() {
Session s = openSession();
Transaction t = s.beginTransaction();
s.createQuery( "select case p.name when 'Steve' then 'x' else 'y' end from Person p" )
.list();
t.commit();
s.close();
}
@Test
public void testSimpleCaseStatementWithParamResult() {
Session s = openSession();
Transaction t = s.beginTransaction();
s.createQuery( "select case p.name when 'Steve' then :opt1 else p.name end from Person p" )
.setParameter( "opt1", "x" )
.list();
t.commit();
s.close();
}
@Test
public void testSimpleCaseStatementWithParamAllResults() {
inTransaction(
(session) -> {
session.createQuery( "select case p.name when 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
session.createQuery( "select case p.name when 'Steve' then cast( :opt1 as string ) else cast( :opt2 as string) end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
session.createQuery( "select case p.name when 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
}
);
}
@Test
public void testSearchedCaseStatementFixture() {
Session s = openSession();
Transaction t = s.beginTransaction();
s.createQuery( "select case when p.name = 'Steve' then 'x' else 'y' end from Person p" )
.list();
t.commit();
s.close();
}
@Test
@TestForIssue( jiraKey = "HHH-13095" )
public void testSearchedCaseStatementArithmeticExpression() {
doInHibernate( this::sessionFactory, session -> {
Person steve = new Person();
steve.id = 1;
steve.name = "Steve";
session.persist( steve );
Person brian = new Person();
brian.id = 2;
brian.name = "Brian";
session.persist( brian );
List<Integer> values = session.createQuery(
"select case when p.name = 'Steve' then (p.id * 10) else p.id end from Person p order by p.id" )
.getResultList();
assertEquals( 10, (int) values.get( 0 ) );
assertEquals( 2, (int) values.get( 1 ) );
} );
}
@Test
public void testSearchedCaseStatementWithParamResult() {
Session s = openSession();
Transaction t = s.beginTransaction();
s.createQuery( "select case when p.name = 'Steve' then :opt1 else p.name end from Person p" )
.setParameter( "opt1", "x" )
.list();
t.commit();
s.close();
}
@Test
public void testSearchedCaseStatementWithAllParamResults() {
inTransaction(
(session) -> {
session.persist( new Person( 1, "Steve" ) );
}
);
inTransaction(
(session) -> {
final List list = session.createQuery( "select case when p.name = 'Steve' then :opt1 else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
assertThat( list.size(), is( 1 ) );
assertThat( list.get( 0 ), is( "x" ) );
}
);
inTransaction(
(session) -> {
final List list = session.createQuery( "select case when p.name = 'Steve' then cast( :opt1 as string) else :opt2 end from Person p" )
.setParameter( "opt1", "x" )
.setParameter( "opt2", "y" )
.list();
assertThat( list.size(), is( 1 ) );
assertThat( list.get( 0 ), is( "x" ) );
}
);
}
@After
public void dropTestData() {
inTransaction(
(session) -> session.createQuery( "delete Person" ).executeUpdate()
);
}
}