📄 querytranslatortestcase.java
字号:
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 ); } 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 ) { count = new Integer(1); } else { count = new Integer( count.intValue() + 1 ); } result.put(fragment, count); } return result; } private String stripExtraSpaces(String string) { if ( string == null ) { return null; } StringBuffer buffer = new StringBuffer( string.length() ); char[] chars = string.toCharArray(); int length = chars.length; boolean wasSpace = false; for ( int i = 0; i < length; i++ ) { boolean isSpace = chars[i] == ' '; if ( wasSpace && isSpace ) { continue; } else { buffer.append( chars[i] ); } wasSpace = isSpace; }// StringTokenizer tokenizer = new StringTokenizer( string.trim(), " " );// while ( tokenizer.hasMoreTokens() ) {// final String fragment = tokenizer.nextToken();// buffer.append( fragment );// buffer.append( " " );// }// return buffer.toString(); } private void checkSqlByResultSet( QueryTranslator oldQueryTranslator, QueryTranslator newQueryTranslator, Object[] binds ) { String oldsql = oldQueryTranslator.getSQLString(); String newsql = newQueryTranslator.getSQLString(); Session session = openSession(); Connection connection = session.connection(); PreparedStatement oldps = null; PreparedStatement newps = null; ResultSet oldrs = null; ResultSet newrs = null; try { try { oldps = connection.prepareStatement( oldsql ); } catch( Throwable t ) { fail( "Unable to prepare sql generated by old parser : " + t ); } try { newps = connection.prepareStatement( newsql ); } catch( Throwable t ) { fail( "Unable to prepare sql generated by new parser : " + t ); } checkBinds(oldps, newps, binds); try { oldrs = executeQuery( oldps, binds ); } catch( Throwable t ) { fail( "Unable to execute sql generated by old parser : " + t ); } try { newrs = executeQuery( newps, binds ); } catch( Throwable t ) { fail( "Unable to execute sql generated by new parser : " + t ); } checkResults( oldrs, newrs ); } finally { // make *sure* the sql resources get cleaned up release(oldrs); release(newrs); release(oldps); release(newps); release(session); } } private void checkBinds(PreparedStatement oldps, PreparedStatement newps, Object[] binds) { // Make sure the binds "feel" ok try { ParameterMetaData oldBindMetaData = oldps.getParameterMetaData(); ParameterMetaData newBindMetaData = newps.getParameterMetaData(); assertEquals( "Different bind parameter count", oldBindMetaData.getParameterCount(), newBindMetaData.getParameterCount() ); assertEquals( "Incorrect number of binds passed in", oldBindMetaData.getParameterCount(), binds == null ? 0 : binds.length ); for ( int i = 0, max = oldBindMetaData.getParameterCount(); i < max; i++ ) { assertEquals( "Different bind types", oldBindMetaData.getParameterType(i), newBindMetaData.getParameterType(i) ); } } catch( Throwable t ) { fail( "SQLException comparing binds : " + t ); } } private ResultSet executeQuery(PreparedStatement ps, Object[] binds) throws SQLException { if ( binds != null ) { for ( int i = 0, max = binds.length; i < max; i++ ) { ps.setObject( i, binds[i] ); } } return ps.executeQuery(); } private void checkResults(ResultSet oldrs, ResultSet newrs) { ResultSetMetaData oldmeta = null; ResultSetMetaData newmeta = null; int colCount = 0; Type[] types = null; // first compare the metadata from the two results try { oldmeta = oldrs.getMetaData(); newmeta = newrs.getMetaData(); assertEquals( "Different column counts", oldmeta.getColumnCount(), newmeta.getColumnCount() ); colCount = oldmeta.getColumnCount(); types = new Type[colCount]; for ( int i = 1, max = colCount; i < max; i++ ) { assertEquals( "Column names were different", oldmeta.getColumnName(i), newmeta.getColumnName(i) ); assertEquals( "Column types were different", oldmeta.getColumnType(i), newmeta.getColumnType(i) ); assertEquals( "Java types were different", oldmeta.getColumnClassName(i), newmeta.getColumnClassName(i) ); types[i] = TypeFactory.basic( oldmeta.getColumnClassName(i) ); } } catch( Throwable t ) { fail( "Error comparing result set metadata" ); } // Then compare the actual results try { while ( oldrs.next() & newrs.next() ) { for ( int i = 1; i < colCount; i++ ) { Object oldval = oldrs.getObject(i); if ( oldrs.wasNull() ) oldval = null; Object newval = newrs.getObject(i); if ( newrs.wasNull() ) newval = null; checkLogicalEquality( oldval, newval, types[i] ); } } // for "better reporting" purposes, make sure both result sets are fully exhausted while ( oldrs.next() ); while ( newrs.next() ); assertEquals( "Different row counts", oldrs.getRow(), newrs.getRow() ); } catch( Throwable t ) { fail( "Error comparing result set structure" ); } } private void checkLogicalEquality(Object oldval, Object newval, Type type) { if ( oldval == null && newval == null ) { // two nulls are logically equivalent here... return; } else { assertTrue( "Different result values", type.isEqual(oldval, newval, EntityMode.POJO) ); } } private void release(PreparedStatement ps) { if ( ps != null ) { try { ps.close(); } catch( Throwable t ) {} } } private void release(ResultSet rs) { if ( rs != null ) { try { rs.close(); } catch( Throwable t ) {} } } private void release(Session session) { if ( session != null ) { try { session.close(); } catch( Throwable t ) {} } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -