querytranslatortestcase.java
来自「好东西,hibernate-3.2.0,他是一开元的树杖hibernate-3.」· Java 代码 · 共 541 行 · 第 1/2 页
JAVA
541 行
// $Id: QueryTranslatorTestCase.java 10060 2006-06-28 02:53:39Z steve.ebersole@jboss.com $
package org.hibernate.test.hql;
import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeMap;
import junit.framework.ComparisonFailure;
import org.hibernate.EntityMode;
import org.hibernate.MappingException;
import org.hibernate.QueryException;
import org.hibernate.classic.Session;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.engine.query.HQLQueryPlan;
import org.hibernate.hql.QueryTranslator;
import org.hibernate.hql.QueryTranslatorFactory;
import org.hibernate.hql.ast.ASTQueryTranslatorFactory;
import org.hibernate.hql.ast.HqlToken;
import org.hibernate.hql.ast.QueryTranslatorImpl;
import org.hibernate.hql.ast.util.ASTPrinter;
import org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
import org.hibernate.test.TestCase;
import org.hibernate.type.Type;
import org.hibernate.type.TypeFactory;
import org.hibernate.util.StringHelper;
/**
* Test case superclass for testing QueryTranslator implementations.
*
* @author josh Dec 6, 2004 8:21:21 AM
*/
public abstract class QueryTranslatorTestCase extends TestCase {
public QueryTranslatorTestCase(String x) {
super( x );
// Create an instance of HqlToken, so that it will have an entry point outside the package. This
// will stop IDEA's code inspector from suggesting that HqlToken should be package local.
new HqlToken();
}
public void assertTranslation(String hql) throws QueryException, MappingException {
assertTranslation( hql, null );
}
public void assertTranslation(String hql, boolean scalar) throws QueryException, MappingException {
assertTranslation( hql, null, scalar, null );
}
protected void assertTranslation(String hql, HashMap replacements) {
ComparisonFailure cf = null;
try {
assertTranslation( hql, replacements, false, null );
}
catch ( ComparisonFailure e ) {
e.printStackTrace();
cf = e;
}
if ("false".equals(System.getProperty("org.hibernate.test.hql.SkipScalarQuery","false"))) {
// Run the scalar translation anyway, even if there was a comparison failure.
assertTranslation( hql, replacements, true, null );
}
if (cf != null)
throw cf;
}
protected void runClassicTranslator(String hql) throws Exception {
SessionFactoryImplementor factory = getSessionFactoryImplementor();
Map replacements = new HashMap();
QueryTranslator oldQueryTranslator = null;
try {
QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
oldQueryTranslator.compile( replacements, false );
}
catch ( Exception e ) {
e.printStackTrace();
throw e;
}
String oldsql = oldQueryTranslator.getSQLString();
System.out.println( "HQL : " + hql );
System.out.println( "OLD SQL: " + oldsql );
}
protected void assertTranslation(String hql, HashMap replacements, boolean scalar, String sql) {
SessionFactoryImplementor factory = getSessionFactoryImplementor();
// Create an empty replacements map if we don't have one.
if ( replacements == null ) {
replacements = new HashMap();
}
// steve -> note that the empty maps here represent the currently enabled filters...
QueryTranslator oldQueryTranslator = null;
Exception oldException = null;
try {
System.out.println("Compiling with classic QueryTranslator...");
QueryTranslatorFactory classic = new ClassicQueryTranslatorFactory();
oldQueryTranslator = classic.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
oldQueryTranslator.compile( replacements, scalar );
}
catch ( QueryException e ) {
oldException = e;
}
catch ( MappingException e ) {
oldException = e;
}
QueryTranslator newQueryTranslator = null;
Exception newException = null;
try {
System.out.println("Compiling with AST QueryTranslator...");
newQueryTranslator = createNewQueryTranslator( hql, replacements, scalar );
}
catch ( QueryException e ) {
newException = e;
}
catch ( MappingException e ) {
newException = e;
}
// If the old QT threw an exception, the new one should too.
if ( oldException != null ) {
// oldException.printStackTrace();
assertNotNull( "New query translator did *NOT* throw an exception, the old one did : " + oldException, newException );
assertEquals( oldException.getMessage(), newException.getMessage() );
return; // Don't bother with the rest of the assertions.
}
else if ( newException != null ) {
newException.printStackTrace();
assertNull( "Old query translator did not throw an exception, the new one did", newException );
}
// -- check all of the outputs --
checkSql( oldQueryTranslator, newQueryTranslator, hql, scalar, sql );
checkQuerySpaces( oldQueryTranslator, newQueryTranslator );
checkReturnedTypes( oldQueryTranslator, newQueryTranslator );
checkColumnNames( oldQueryTranslator, newQueryTranslator );
}
protected QueryTranslatorImpl createNewQueryTranslator(String hql, HashMap replacements, boolean scalar) {
SessionFactoryImplementor factory = getSessionFactoryImplementor();
return createNewQueryTranslator( hql, replacements, scalar, factory );
}
private QueryTranslatorImpl createNewQueryTranslator(String hql, HashMap replacements, boolean scalar, SessionFactoryImplementor factory) {
QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
QueryTranslatorImpl newQueryTranslator = ( QueryTranslatorImpl ) ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
newQueryTranslator.compile( replacements, scalar );
return newQueryTranslator;
}
protected QueryTranslatorImpl createNewQueryTranslator(String hql) {
return createNewQueryTranslator( hql, new HashMap(), false );
}
protected QueryTranslatorImpl createNewQueryTranslator(String hql, SessionFactoryImplementor sfimpl) {
return createNewQueryTranslator( hql, new HashMap(), false, sfimpl );
}
protected HQLQueryPlan createQueryPlan(String hql, boolean scalar) {
return new HQLQueryPlan( hql, scalar, Collections.EMPTY_MAP, getSessionFactoryImplementor() );
}
protected HQLQueryPlan createQueryPlan(String hql) {
return createQueryPlan( hql, false );
}
protected SessionFactoryImplementor getSessionFactoryImplementor() {
SessionFactoryImplementor factory = ( SessionFactoryImplementor ) getSessions();
if ( factory == null ) {
throw new NullPointerException( "Unable to create factory!" );
}
return factory;
}
private void checkColumnNames(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
// Check the column names.
String[][] oldColumnNames = oldQueryTranslator.getColumnNames();
String[][] newColumnNames = newQueryTranslator.getColumnNames();
/*assertEquals( "Column name array is not the right length!", oldColumnNames.length, newColumnNames.length );
for ( int i = 0; i < oldColumnNames.length; i++ ) {
assertEquals( "Column name array [" + i + "] is not the right length!", oldColumnNames[i].length, newColumnNames[i].length );
for ( int j = 0; j < oldColumnNames[i].length; j++ ) {
assertEquals( "Column name [" + i + "," + j + "]", oldColumnNames[i][j], newColumnNames[i][j] );
}
}*/
}
private void checkReturnedTypes(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
// Check the returned types for a regression.
Type[] oldReturnTypes = oldQueryTranslator.getReturnTypes();
Type[] returnTypes = newQueryTranslator.getReturnTypes();
assertEquals( "Return types array is not the right length!", oldReturnTypes.length, returnTypes.length );
for ( int i = 0; i < returnTypes.length; i++ ) {
assertNotNull( returnTypes[i] );
assertNotNull( oldReturnTypes[i] );
assertEquals( "Returned types did not match!", oldReturnTypes[i].getReturnedClass(), returnTypes[i].getReturnedClass() );
System.out.println("returnedType[" + i + "] = " + returnTypes[i] + " oldReturnTypes[" + i + "] = " + oldReturnTypes[i]);
}
}
private void checkQuerySpaces(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator) {
// Check the query spaces for a regression.
Set oldQuerySpaces = oldQueryTranslator.getQuerySpaces();
Set querySpaces = newQueryTranslator.getQuerySpaces();
assertEquals( "Query spaces is not the right size!", oldQuerySpaces.size(), querySpaces.size() );
for ( Iterator iterator = oldQuerySpaces.iterator(); iterator.hasNext(); ) {
Object o = iterator.next();
assertTrue( "New query space does not contain " + o + "!", querySpaces.contains( o ) );
}
}
protected Exception compileBadHql(String hql, boolean scalar) {
QueryTranslator newQueryTranslator;
Map replacements = null;
Exception newException = null;
SessionFactoryImplementor factory = getSessionFactoryImplementor();
try {
QueryTranslatorFactory ast = new ASTQueryTranslatorFactory();
newQueryTranslator = ast.createQueryTranslator( hql, hql, Collections.EMPTY_MAP, factory );
newQueryTranslator.compile( replacements, scalar );
}
catch ( QueryException e ) {
newException = e;
}
catch ( MappingException e ) {
newException = e;
}
assertNotNull( "Expected exception from compilation of '" + hql + "'!", newException );
return newException;
}
private void checkSql(QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator, String hql, boolean scalar, String sql) {
String oldsql = oldQueryTranslator.getSQLString();
String newsql = newQueryTranslator.getSQLString();
System.out.println( "HQL : " + ASTPrinter.escapeMultibyteChars(hql) );
System.out.println( "OLD SQL: " + ASTPrinter.escapeMultibyteChars(oldsql) );
System.out.println( "NEW SQL: " + ASTPrinter.escapeMultibyteChars(newsql) );
if ( sql == null ) {
// Check the generated SQL. ASTPrinter.escapeMultibyteChars(
assertSQLEquals( "SQL is not the same as the old SQL (scalar=" + scalar + ")", oldsql, newsql );
}
else {
assertSQLEquals( "SQL is not the same as the expected SQL (scalar=" + scalar + ")", sql, newsql );
}
}
private void assertSQLEquals(String message, String oldsql, String newsql) {
Map oldMap = getTokens(oldsql);
Map newMap = getTokens(newsql);
if ( !oldMap.equals(newMap) ) {
assertEquals(message, oldsql, newsql);
}
//String oldsqlStripped = stripExtraSpaces( oldsql );
//String newsqlStripped = stripExtraSpaces( newsql );
//assertEquals( message, oldsqlStripped, newsqlStripped );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?