package net.sf.jsqlparser.test.tablesfinder;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import static junit.framework.TestCase.assertEquals;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.test.TestException;
import net.sf.jsqlparser.test.simpleparsing.CCJSqlParserManagerTest;
import org.junit.Test;
public class TablesNamesFinderTest {
CCJSqlParserManager pm = new CCJSqlParserManager();
@Test
public void testRUBiSTableList() throws Exception {
URL rubis = Thread.currentThread().getContextClassLoader().getResource("RUBiS-select-requests.txt");
try (BufferedReader in = new BufferedReader(new InputStreamReader(rubis.openStream()))) {
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
int numSt = 1;
while (true) {
String line = getLine(in);
if (line == null) {
break;
}
if (line.length() == 0) {
continue;
}
if (!line.equals("#begin")) {
break;
}
line = getLine(in);
StringBuilder buf = new StringBuilder(line);
while (true) {
line = getLine(in);
if (line.equals("#end")) {
break;
}
buf.append("\n");
buf.append(line);
}
String query = buf.toString();
if (!getLine(in).equals("true")) {
continue;
}
String cols = getLine(in);
String tables = getLine(in);
String whereCols = getLine(in);
String type = getLine(in);
try {
Select select = (Select) pm.parse(new StringReader(query));
StringTokenizer tokenizer = new StringTokenizer(tables, " ");
List tablesList = new ArrayList();
while (tokenizer.hasMoreTokens()) {
tablesList.add(tokenizer.nextToken());
}
String[] tablesArray = (String[]) tablesList.toArray(new String[tablesList.size()]);
List tableListRetr = tablesNamesFinder.getTableList(select);
assertEquals("stm num:" + numSt, tablesArray.length, tableListRetr.size());
for (int i = 0; i < tablesArray.length; i++) {
assertEquals("stm num:" + numSt, tablesArray[i], tableListRetr.get(i));
}
} catch (Exception e) {
throw new TestException("error at stm num: " + numSt, e);
}
numSt++;
}
}
}
@Test
public void testGetTableList() throws Exception {
String sql
= "SELECT * FROM MY_TABLE1, MY_TABLE2, (SELECT * FROM MY_TABLE3) LEFT OUTER JOIN MY_TABLE4 "
+ " WHERE ID = (SELECT MAX(ID) FROM MY_TABLE5) AND ID2 IN (SELECT * FROM MY_TABLE6)";
net.sf.jsqlparser.statement.Statement statement = pm.parse(new StringReader(sql));
//now you should use a class that implements StatementVisitor to decide what to do
//based on the kind of the statement, that is SELECT or INSERT etc. but here we are only
//interested in SELECTS
if (statement instanceof Select) {
Select selectStatement = (Select) statement;
TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
List tableList = tablesNamesFinder.getTableList(selectStatement);
assertEquals(6, tableList.size());
int i = 1;
for (Iterator iter = tableList.iterator(); iter.hasNext(); i++) {
String tableName = (String) iter.next();
assertEquals("MY_TABLE" + i, tableName);
}
}
}
private String getLine(BufferedReader in) throws Exception {
return CCJSqlParserManagerTest.getLine(in);
}
}