package net.sf.jsqlparser.test.select; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.StringReader; import java.net.URL; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; import junit.textui.TestRunner; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.test.TestException; import net.sf.jsqlparser.test.simpleparsing.CCJSqlParserManagerTest; import net.sf.jsqlparser.test.tablesfinder.TablesNamesFinder; public class SpeedTest extends TestCase { private final static int NUM_REPS = 500; private CCJSqlParserManager parserManager = new CCJSqlParserManager(); public SpeedTest(String arg0) { super(arg0); } public void testSpeed() throws Exception { // all the statements in testfiles/simple_parsing.txt URL simpleParsing = Thread.currentThread().getContextClassLoader().getResource("simple_parsing.txt"); URL rubis = Thread.currentThread().getContextClassLoader().getResource("RUBiS-select-requests.txt"); try (BufferedReader simpleParsingIn = new BufferedReader(new InputStreamReader(simpleParsing.openStream())); BufferedReader rubisIn = new BufferedReader(new InputStreamReader(rubis.openStream()))) { CCJSqlParserManagerTest d; ArrayList statementsList = new ArrayList(); while (true) { String statement = CCJSqlParserManagerTest.getStatement(simpleParsingIn); if (statement == null) { break; } statementsList.add(statement); } // all the statements in testfiles/RUBiS-select-requests.txt while (true) { String line = CCJSqlParserManagerTest.getLine(rubisIn); if (line == null) { break; } if (line.length() == 0) { continue; } if (!line.equals("#begin")) { break; } line = CCJSqlParserManagerTest.getLine(rubisIn); StringBuilder buf = new StringBuilder(line); while (true) { line = CCJSqlParserManagerTest.getLine(rubisIn); if (line.equals("#end")) { break; } buf.append("\n"); buf.append(line); } if (!CCJSqlParserManagerTest.getLine(rubisIn).equals("true")) { continue; } statementsList.add(buf.toString()); String cols = CCJSqlParserManagerTest.getLine(rubisIn); String tables = CCJSqlParserManagerTest.getLine(rubisIn); String whereCols = CCJSqlParserManagerTest.getLine(rubisIn); String type = CCJSqlParserManagerTest.getLine(rubisIn); } String statement = ""; int numTests = 0; // it seems that the very first parsing takes a while, so I put it aside Statement parsedStm = parserManager.parse(new StringReader(statement = (String) statementsList.get(0))); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); ArrayList parsedSelects = new ArrayList(NUM_REPS * statementsList.size()); long time = System.currentTimeMillis(); // measure the time to parse NUM_REPS times all statements in the 2 files for (int i = 0; i < NUM_REPS; i++) { try { int j = 0; for (Iterator iter = statementsList.iterator(); iter.hasNext(); j++) { statement = (String) iter.next(); parsedStm = parserManager.parse(new StringReader(statement)); numTests++; if (parsedStm instanceof Select) { parsedSelects.add(parsedStm); } } } catch (JSQLParserException e) { throw new TestException("impossible to parse statement: " + statement, e); } } long elapsedTime = System.currentTimeMillis() - time; long statementsPerSecond = numTests * 1000 / elapsedTime; DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(7); df.setMinimumFractionDigits(4); System.out.println(numTests + " statements parsed in " + elapsedTime + " milliseconds"); System.out.println(" (" + statementsPerSecond + " statements per second, " + df.format(1.0 / statementsPerSecond) + " seconds per statement )"); numTests = 0; time = System.currentTimeMillis(); // measure the time to get the tables names from all the SELECTs parsed before for (Iterator iter = parsedSelects.iterator(); iter.hasNext();) { Select select = (Select) iter.next(); if (select != null) { numTests++; List tableListRetr = tablesNamesFinder.getTableList(select); } } elapsedTime = System.currentTimeMillis() - time; statementsPerSecond = numTests * 1000 / elapsedTime; System.out.println(numTests + " select scans for table name executed in " + elapsedTime + " milliseconds"); System.out.println(" (" + statementsPerSecond + " select scans for table name per second, " + df.format(1.0 / statementsPerSecond) + " seconds per select scans for table name)"); } } public static void main(String[] args) { TestRunner.run(SpeedTest.class); } }