Tuesday, March 23, 2010

Algorithm to convert given SQL Query to Relational Algebra

For the benefit of those who were looking for a logic on how to go ahead and implement this for lab exercise.

- My program will take a SQL Query as one whole string in the command line.
- splitInputQuery will split the SQL Query based on space.
- parseSQLQuery will take one word at a time from the SQL Query and set some global flags.
- decideRelAlgebra will make a decision on what could be the Relational Algebra equivalent based on the flags set in parseSQLQuery.

Eg:
SQL: "select * from E"
RA: PROJECT E

SQL: "select name from student"
RA: PROJECT name student

SQL: "select * from student where name=neo"
RA: SELECT name=neo student

SQL: "select name,roll_no from student where name=neo"
RA: PROJECT name,roll_no(SELECT name=neo student)

Having shown the examples above, I am giving the algorithm(in the form of pseudocode) below. Hope its useful. Questions are welcome.

/Algorithm/
Algorithm used to convert simple SQL query to Relation Algebra:

/**********************************************************************************
* Description: This program is intended to take simple SQL queries and
* convert them to equivalent Relational Algebra
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: Equivalent Relational Algebra Eg: PROJECT emp_name E
*
*********************************************************************************/
main(String[] args)
if (args.length <0)
return 0;
else {
/* args[0] will have the SQL Query */
if (splitSQLQuery(args[0]) == 0) {
call parseSQLQuery()
}
call decideRelAlgebra()
}

/**********************************************************************************
* Description: This procedure takes a simple SQL queries and split it based on space
* and stores them as a array of string
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: split SQL Query as a array of Strings Eg: {"select" ,"emp_name","from","E"}
*
*********************************************************************************/

splitSQLQuery(inputSQLQuery) {
if (inputSQLQuery != null) {
/* if input is valid then split based on " " and save it in global array splittedInputQuery
splittedInputQuery = inputSQLQuery.split(" ");
} else {
return 1; /* return non-zero on error */
}
return 0;
}

/**********************************************************************************
* Description: This procedure takes split SQL Query array and parse them to find the
* equivalent Relational Algebra
*
* Input: Splitted SQL Query array
*
* Output: global flags are set to make a decision
*
*********************************************************************************/

parseSQLQuery() {
/* for all the strings in the splitedInputQuery do this */
for(int i 0 to no_of_strings in query) {
/* querystring is the current string form the splittedinputquery array */
if (querystring matches "select") {
/*then it could be select or it could be project in RA*/
set maybeProject to 1
continue to get next string;
}
if(querystring matches "*") {
set selectall to 1;
continue to next string;
}

if (querystring is of the pattern [a-zA-Z_]*) and (selectall != 0) {
set maybeAttribs to 1;
attribs = querystring;
continue to next string;
}
if (querystring matches "from") {
set maybeFrom to 1;
continue to next string;
}

if(querystring is of pattern [a-zA-Z-]*) and (maybeFrom is set) {
set maybeTable to 1;
tableName = queryString;
continue to next string;
}

if(querystring matches "where") {
set maybeSelect to 1
set gotWhere to 1
continue to next string;
}
/* to match with where patterns like Eg: name=N or roll_no=100 and so on
if(queryString is of pattern [a-zA-z_< > = <= >= !=0-9*]*) and (where is set to 1) {
set maybeConditions to 1
conditions = queryString;
continue to next string;
}
}
}

/**********************************************************************************
* Description: This procedure decides on the equivalent relational algebra for the given
* SQL Query based on the flags set by parseSQLQuery
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: Equivalent Relational Algebra Eg: PROJECT emp_name E
*
*********************************************************************************/

decideRelAlgebra() {
if (gotWhere is not 1) {
set confirmedProject to 1
set relAlg to PROJECT
}
if (selectAll is 1) and (gotWhere is not 1) {
set confirmedProject to 1
set relAlg to PROJECT
}
if (gotWhere is 1) and (attribs is not null) {
set projectwithselect to 1
set relAlg to PROJECT (SELECT )
}

if (gotWhere is 1) and (selectall is 1) {
set confirmedproject to 1
set relAlg to SELECT
}
}

1 comment:

  1. man!!! algo is v.gud ... but its not complete how to print the final output

    ReplyDelete