package com.alibaba.druid; import jef.database.dialect.SQLServer2005Dialect; import jef.database.dialect.handler.DerbyLimitHandler; import jef.database.dialect.handler.LimitHandler; import jef.database.dialect.handler.LimitOffsetLimitHandler; import jef.database.dialect.handler.MySqlLimitHandler; import jef.database.dialect.handler.OracleLimitHander; import jef.database.dialect.handler.SQL2000LimitHandler; import jef.database.dialect.handler.SQL2005LimitHandler; import jef.database.wrapper.clause.BindSql; import junit.framework.Assert; import org.junit.Test; public class LimitHandlerTest { String[] sqls = { "SELECT \n" + "T.NAME AS PNAME, T1.NAME FROM parent T, child T1 WHERE T.ID = T1.PARENTID order by t1.name", "(select * from child t where t.code like 'code%') union all (select rootid as parentid,code,id,name from parent) union all (select * from child t) order by name " }; int[] pageParam = new int[] { 70, 10 }; @Test public void testSql2000Impl() { LimitHandler lh = new SQL2000LimitHandler(); String expect="SELECT TOP 80 T.NAME AS PNAME, T1.NAME FROM parent T, child T1 WHERE T.ID = T1.PARENTID ORDER BY t1.name"; doAssert(sqls[0],lh,expect); expect="SELECT TOP 80 * FROM(SELECT * FROM child t WHERE t.code LIKE 'code%' UNION ALL SELECT rootid AS parentid, code, id, name FROM parent UNION ALL SELECT * FROM child t ) __ef_tmp1"+ "\nORDER BY name"; doAssert(sqls[1],lh,expect); doTest(lh); } @Test public void test2005ParserImpl() { LimitHandler lh = new SQL2005LimitHandler(); for (String sql : sqls) { System.out.println(lh.toPageSQL(sql, pageParam)); } doTest(lh); } @Test public void test2005DruidImpl() { LimitHandler lh = new SQL2005LimitHandler(); for (String sql : sqls) { System.out.println("--Druid--"); System.out.println(lh.toPageSQL(sql, pageParam)); } doTest(lh); } @Test public void testMySQL() { doTest(new MySqlLimitHandler()); } @Test public void testPostgres() { doTest(new LimitOffsetLimitHandler()); } @Test public void testDerby() { doTest(new DerbyLimitHandler()); } private void doTest(LimitHandler lh) { String sql = sqls[0]; long start = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { lh.toPageSQL(sql, pageParam); } long cost=System.currentTimeMillis() - start; System.out.println(lh.getClass().getSimpleName()+"运行一万次,耗时"+cost+"ms."); } private void doAssert(String raw, LimitHandler lh, String expect) { BindSql sql=lh.toPageSQL(raw, pageParam); String actual=sql.getSql(); System.out.println(actual); Assert.assertEquals(expect, actual); } @Test public void testWhenOffsetIs0(){ LimitHandler lh=new OracleLimitHander(); BindSql sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); lh=new SQL2000LimitHandler(); sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); lh=new SQL2005LimitHandler(); sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); lh=new DerbyLimitHandler(); sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); lh=new LimitOffsetLimitHandler(); sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); lh=new MySqlLimitHandler(); sql=lh.toPageSQL(sqls[0],new int[]{0,15}); System.out.println(sql.getSql()); } }