/**************************************************************************
//	
//	파일명 : Select.java
//	기능 : 자바 클래스에 포함된 SQL Select문에 대한 분석 정보 제공을 하는 클래스
//	작성일 : 
//
***************************************************************************/

package extractor.SCA_API;


import java.io.*;
import java.util.*;
import java.sql.*;

public class Select 
{
	static int num = 0;
	public String[] sql_id = null;
	public String[] sql_qery = null;
	public String[] sql_smnm = null;
	public String[] sql_rsnm = null;
	public Vector[] sql_clms = null;
	public String[] sql_alia = null;
	public String[] sql_tbln = null;
	public Vector[] sql_wvrn = null;
	public Vector[] sql_vrop = null;
	public Vector[] sql_vvop = null;
	public String[] sql_rlsr = null;
	
	Statement stmt = null;
	String query = null;
	String query2 = null;

// 생성자 메소드
	public Select(){
		num++;
		System.out.println("&&&&&&&&&&&&& num of Select = " + num);
		DBConnection dbCon = new DBConnection();
		stmt = dbCon.createStatement();
		query = "SELECT * FROM TQ_SELECT";
		query2 = "SELECT SQL_ID FROM TQ_SELECT";

		try{
			ResultSet rs1 = stmt.executeQuery(query);

		// select되는 행의 갯수를 알기 위한 Statement와 ResultSet객체 생성
			Statement stmt2 = dbCon.createStatement();
			ResultSet rs2 = stmt2.executeQuery(query2);

			// 행 갯수 카운팅
			int iCount=0;
			while(rs2.next())
			{
				iCount++;
			}
			rs2.close();

			// DB에 저장된 sql_id와 sql_tbln을 저장하기위한 배열 정의
			sql_id = new String[iCount];
			sql_qery = new String[iCount];
			sql_smnm = new String[iCount];
			sql_rsnm = new String[iCount];
			sql_clms = new Vector[iCount];
			sql_alia = new String[iCount];
			sql_tbln = new String[iCount];
			sql_wvrn = new Vector[iCount];
			sql_vrop = new Vector[iCount];
			sql_vvop = new Vector[iCount];
			sql_rlsr = new String[iCount];

			ResultSetMetaData md = rs1.getMetaData();

			int col_count = md.getColumnCount();
			int row = 0;

			int j = 0;

			String columns = null;
			String whereVariableNames = null;
			String variableOperators = null;
			String variable2Operators = null;

			while (rs1.next()){
				//System.out.print("\nRow: " + ++row  + "\t");
				
				for (int i = 1;i<=col_count ;i++ )
				{
					//System.out.print(rs1.getString(md.getColumnName(i)) + ", \t");

					switch (i)
					{
					case 1:
						sql_id[j] = rs1.getString(md.getColumnName(i));
						break;
					case 2:
						sql_qery[j] = rs1.getString(md.getColumnName(i));
						break;
					case 3:
						sql_smnm[j] = rs1.getString(md.getColumnName(i));
						break;
					case 4:
						sql_rsnm[j] = rs1.getString(md.getColumnName(i));
						break;
					case 5:
						columns = (rs1.getString(md.getColumnName(i)));
						StringTokenizer st1 = new StringTokenizer(columns, "|");
						
						sql_clms[j] = new Vector();
						while( st1.hasMoreTokens()){
							sql_clms[j].addElement(st1.nextToken("|"));
							//System.out.println(st1.nextToken("|"));
						}
						break;
					case 6:
						sql_alia[j] = rs1.getString(md.getColumnName(i));
						break;
					case 7:
						sql_tbln[j] = rs1.getString(md.getColumnName(i));
						break;
					case 8:
						whereVariableNames = (rs1.getString(md.getColumnName(i)));
						whereVariableNames = " "  + whereVariableNames;
						StringTokenizer st2 = new StringTokenizer(whereVariableNames, "|");
						
						sql_wvrn[j] = new Vector();
						while( st2.hasMoreTokens()){
							sql_wvrn[j].addElement(st2.nextToken("|"));
							//System.out.println(st1.nextToken("|"));
						}
						
						break;	

					case 9:
						variableOperators = (rs1.getString(md.getColumnName(i)));
						variableOperators = " " + variableOperators;
						StringTokenizer st3 = new StringTokenizer(variableOperators, "|");
						
						sql_vrop[j] = new Vector();
						while( st3.hasMoreTokens()){
							String xxx = st3.nextToken("|");
							sql_vrop[j].addElement(xxx);
							//System.out.println("xxx = " + xxx);
						}
							//System.out.println("sql_vrop[" + j + "] = " + sql_vrop[j]);
						break;
					case 10:
						//System.out.println("여기까지106");
						variable2Operators = (rs1.getString(md.getColumnName(i)));

						if (variable2Operators == "null")
						{
							sql_vvop[j].addElement("null");
						}else{
							variable2Operators = " " + variable2Operators;
							StringTokenizer st4 = new StringTokenizer(variable2Operators, "|");
							sql_vvop[j] = new Vector();
							while( st4.hasMoreTokens()){
								sql_vvop[j].addElement(st4.nextToken("|"));
								//System.out.println("여기까지...");
							}
						}
						break;
					case 11:
						sql_rlsr[j] = rs1.getString(md.getColumnName(i));
					
					}
				}
				j++;
			}
			
		}catch(SQLException ex){
				System.err.println("SQL문에 에러가 있습니다.\n" + ex.getMessage());
			}

	}

// tableName을 받아서 SQLID[]을 리턴해 주는 메소드

	public String[] getSQLID(String tableName){

		return sql_id;
	}

// SQL_id에 의해 Query문을 반환해주는 메소드
	
	public String[] getQueryString(String[] sql_id){
		return sql_qery;
	}

// Statement Class의 Object Name을 반환해주는 메소드
	
	public String[] getStatement(String[] sql_id){
		return sql_smnm;
	}
	
// ResultSet Class의 Object Name을 반환해주는 메소드

	public String[] getResultSet(String[] sql_id){
		return sql_rsnm;
	}

// Select되는 Column들의 이름을 반환해주는 메소드
	
	public Vector[] getSelectedColumns(String sql_id){
		return sql_clms;
	}

// Column의 Alias된 이름을 알려주는 메소드

	public String[] getAliasName(String[] sql_id){
		return sql_alia;
	}

// Select 문이 참조하는 Table명을 반환해주는 메소드
	
	public String[] getTableName(String[] sql_id){
		return sql_tbln;
	}
	
// Where 절에 조건으로 주어지는 변수들의 이름
	
	public Vector[] getFieldsOfWhere(String[] sql_id){
		return sql_wvrn;
	}

// Where 절에 조건으로 주어지는 변수들의 Operator
	
	public Vector[] getOpersOfFields(String[] sql_id){
		return sql_vrop;
	}

// Where 절에 포함된 변수간의 Operator
	
	public Vector[] getOpersOfWhere(String[] sql_id){
		return sql_vvop;
	}

// Select문 관련 소스 코드
	
	public String[] getSelectSQL(String[] sql_id){
		return sql_rlsr;
	}
}