HHH-12541: Test for SAP HANA calculation views
This commit is contained in:
parent
8816c5afb2
commit
a01c282288
|
@ -0,0 +1,216 @@
|
||||||
|
/*
|
||||||
|
* 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.dialect.functional;
|
||||||
|
|
||||||
|
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
|
import javax.persistence.criteria.Root;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.dialect.AbstractHANADialect;
|
||||||
|
import org.hibernate.query.Query;
|
||||||
|
import org.hibernate.testing.RequiresDialect;
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@RequiresDialect(value = { AbstractHANADialect.class })
|
||||||
|
public class HANACalcViewTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
private static final String CALC_VIEW_NAME = "DUMMY_CV_VIEW";
|
||||||
|
private static final String CALC_SCENARIO_NAME = "DUMMY_CV_SCEN";
|
||||||
|
private static final String PROJECTION_NODE_NAME = "DUMMY_PROJ";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void afterSessionFactoryBuilt() {
|
||||||
|
doInHibernate( this::sessionFactory, session -> {
|
||||||
|
session.doWork( connection -> {
|
||||||
|
try ( PreparedStatement ps = connection
|
||||||
|
.prepareStatement( "CREATE CALCULATION SCENARIO " + CALC_SCENARIO_NAME + " USING '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n" +
|
||||||
|
"<cubeSchema version=\"2\" operation=\"createCalculationScenario\">\r\n" +
|
||||||
|
"<calculationScenario>\r\n" +
|
||||||
|
" <dataSources>\r\n" +
|
||||||
|
" <tableDataSource name=\"DUMMY_DS\" schema=\"SYS\" table=\"DUMMY\">\r\n" +
|
||||||
|
" <attributes>\r\n" +
|
||||||
|
" <allAttribute/>\r\n" +
|
||||||
|
" </attributes>\r\n" +
|
||||||
|
" </tableDataSource>\r\n" +
|
||||||
|
" </dataSources>\r\n" +
|
||||||
|
" <calculationViews>\r\n" +
|
||||||
|
" <projection name=\"" + PROJECTION_NODE_NAME + "\" defaultViewFlag=\"true\">\r\n" +
|
||||||
|
" <inputs>\r\n" +
|
||||||
|
" <input name=\"DUMMY_DS\" />\r\n" +
|
||||||
|
" </inputs>\r\n" +
|
||||||
|
" <attributes>\r\n" +
|
||||||
|
" <allAttribute />\r\n" +
|
||||||
|
" <calculatedAttribute name=\"DUMMYDUMMY\" datatype=\"string\" isViewAttribute=\"true\">\r\n" +
|
||||||
|
" <formula>\"DUMMY\" + \"DUMMY\"</formula>\r\n" +
|
||||||
|
" </calculatedAttribute>\r\n" +
|
||||||
|
" <calculatedAttribute name=\"DUMMYDOUBLE\" datatype=\"double\" isViewAttribute=\"true\">\r\n" +
|
||||||
|
" <formula>strlen(\"DUMMY\") * 1.5</formula>\r\n" +
|
||||||
|
" </calculatedAttribute>\r\n" +
|
||||||
|
" <calculatedAttribute name=\"DUMMYINT\" datatype=\"int\" isViewAttribute=\"true\">\r\n" +
|
||||||
|
" <formula>strlen(\"DUMMY\") + 1</formula>\r\n" +
|
||||||
|
" </calculatedAttribute>\r\n" +
|
||||||
|
" </attributes>\r\n" +
|
||||||
|
" </projection>\r\n" +
|
||||||
|
" </calculationViews>\r\n" +
|
||||||
|
"</calculationScenario>\r\n" +
|
||||||
|
"</cubeSchema>'" ) ) {
|
||||||
|
ps.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
try ( PreparedStatement ps = connection
|
||||||
|
.prepareStatement(
|
||||||
|
"CREATE COLUMN VIEW " + CALC_VIEW_NAME + " TYPE CALCULATION WITH PARAMETERS ('PARENTCALCINDEX'='" + CALC_SCENARIO_NAME
|
||||||
|
+ "', 'PARENTCALCNODE'='" + PROJECTION_NODE_NAME + "')" ) ) {
|
||||||
|
ps.execute();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void releaseSessionFactory() {
|
||||||
|
doInHibernate( this::sessionFactory, session -> {
|
||||||
|
session.doWork( connection -> {
|
||||||
|
try ( PreparedStatement ps = connection.prepareStatement( "DROP CALCULATION SCENARIO " + CALC_SCENARIO_NAME + " CASCADE" ) ) {
|
||||||
|
ps.execute();
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
super.releaseSessionFactory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[]{ CVEntity.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean createSchema() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-12541")
|
||||||
|
public void testCalcViewEntity() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
CVEntity cvEntity = s.find( CVEntity.class, "X" );
|
||||||
|
assertEquals( "X", cvEntity.getDummy() );
|
||||||
|
assertEquals( "XX", cvEntity.getDummydummy() );
|
||||||
|
assertEquals( 2, cvEntity.getDummyint() );
|
||||||
|
assertEquals( 1.5, cvEntity.getDummydouble(), 0.1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-12541")
|
||||||
|
public void testCalcViewEntityQuery() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Query<CVEntity> query = s.createQuery( "select e from HANACalcViewTest$CVEntity e", CVEntity.class );
|
||||||
|
List<CVEntity> list = query.list();
|
||||||
|
assertEquals( 1, list.size() );
|
||||||
|
CVEntity cvEntity = list.get( 0 );
|
||||||
|
assertEquals( "X", cvEntity.getDummy() );
|
||||||
|
assertEquals( "XX", cvEntity.getDummydummy() );
|
||||||
|
assertEquals( 2, cvEntity.getDummyint() );
|
||||||
|
assertEquals( 1.5, cvEntity.getDummydouble(), 0.1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-12541")
|
||||||
|
public void testCalcViewEntityCriteriaQuery() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
CriteriaBuilder criteriaBuilder = s.getCriteriaBuilder();
|
||||||
|
CriteriaQuery<CVEntity> criteriaQuery = criteriaBuilder.createQuery( CVEntity.class );
|
||||||
|
Root<CVEntity> from = criteriaQuery.from( CVEntity.class );
|
||||||
|
criteriaQuery.where( criteriaBuilder.equal( from.get( "dummydummy" ), "XX" ) );
|
||||||
|
Query<CVEntity> query = this.session.createQuery( criteriaQuery );
|
||||||
|
List<CVEntity> list = query.list();
|
||||||
|
assertEquals( 1, list.size() );
|
||||||
|
CVEntity cvEntity = list.get( 0 );
|
||||||
|
assertEquals( "X", cvEntity.getDummy() );
|
||||||
|
assertEquals( "XX", cvEntity.getDummydummy() );
|
||||||
|
assertEquals( 2, cvEntity.getDummyint() );
|
||||||
|
assertEquals( 1.5, cvEntity.getDummydouble(), 0.1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue(jiraKey = "HHH-12541")
|
||||||
|
public void testCalcViewDTO() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Query<CVEntityDTO> query = s.createQuery(
|
||||||
|
"select new org.hibernate.test.dialect.functional.HANACalcViewTest$CVEntityDTO(e.dummyint, e.dummy) from HANACalcViewTest$CVEntity e",
|
||||||
|
CVEntityDTO.class );
|
||||||
|
List<CVEntityDTO> list = query.list();
|
||||||
|
assertEquals( 1, list.size() );
|
||||||
|
CVEntityDTO cvEntity = list.get( 0 );
|
||||||
|
assertEquals( "X", cvEntity.getDummy() );
|
||||||
|
assertEquals( 2, cvEntity.getDummyint() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = CALC_VIEW_NAME)
|
||||||
|
private static class CVEntity {
|
||||||
|
|
||||||
|
private String dummydummy;
|
||||||
|
private double dummydouble;
|
||||||
|
private int dummyint;
|
||||||
|
@Id
|
||||||
|
private String dummy;
|
||||||
|
|
||||||
|
public String getDummydummy() {
|
||||||
|
return this.dummydummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getDummydouble() {
|
||||||
|
return this.dummydouble;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDummyint() {
|
||||||
|
return this.dummyint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDummy() {
|
||||||
|
return this.dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class CVEntityDTO {
|
||||||
|
|
||||||
|
private int dummyint;
|
||||||
|
private String dummy;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public CVEntityDTO(int dummyint, String dummy) {
|
||||||
|
this.dummyint = dummyint;
|
||||||
|
this.dummy = dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDummyint() {
|
||||||
|
return this.dummyint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDummy() {
|
||||||
|
return this.dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue