📄 querytranslatortestcase.java
字号:
// $Id: QueryTranslatorTestCase.java,v 1.25 2005/02/27 13:57:59 oneovthafew Exp $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.hql.QueryTranslator;import org.hibernate.hql.QueryTranslatorFactory;import org.hibernate.hql.ast.ASTQueryTranslatorFactory;import org.hibernate.hql.ast.HqlToken;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, 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 ); } private 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, 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..."); QueryTranslatorFactory ast = new ASTQueryTranslatorFactory(); newQueryTranslator = ast.createQueryTranslator( hql, Collections.EMPTY_MAP, factory ); newQueryTranslator.compile( 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 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, 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 : " + hql ); System.out.println( "OLD SQL: " + oldsql ); System.out.println( "NEW SQL: " + newsql ); if ( sql == null ) { // Check the generated SQL. 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 ); } private Map getTokens(String sql) { Map result = new TreeMap(); if (sql==null) return result; result.put( "=", new Integer( StringHelper.countUnquoted(sql, '=') ) ); StringTokenizer tokenizer = new StringTokenizer( sql, "(),= " ); while ( tokenizer.hasMoreTokens() ) { String fragment = tokenizer.nextToken(); /*if ( "on".equals(fragment) ) fragment = "and"; if ( "join".equals(fragment) || "inner".equals(fragment) ) continue;*/ Integer count = (Integer) result.get(fragment); if ( count==null ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -