org.eigenbase.sql.advise
Class SqlAdvisor

java.lang.Object
  extended by org.eigenbase.sql.advise.SqlAdvisor

public class SqlAdvisor
extends Object

An assistant which offers hints and corrections to a partially-formed SQL statement. It is used in the SQL editor user-interface.

Since:
Jan 16, 2004
Version:
$Id: //open/dev/farrago/src/org/eigenbase/sql/advise/SqlAdvisor.java#7 $
Author:
tleung

Nested Class Summary
 class SqlAdvisor.ValidateErrorInfo
          An inner class that represents error message text and position info of a validator or parser exception
 
Field Summary
private  String hintToken
           
static Logger tracer
           
private  SqlValidatorWithHints validator
           
 
Constructor Summary
SqlAdvisor(SqlValidatorWithHints validator)
          Creates a SqlAdvisor with a validator instance
 
Method Summary
protected  SqlNode collectParserError(String sql, List<SqlAdvisor.ValidateErrorInfo> errorList)
          Attempts to parse a SQL statement and adds to the errorList if any syntax error is found.
 List<SqlMoniker> getCompletionHints(String sql, int cursor, String[] replaced)
          Gets completion hints for a partially completed or syntatically incorrect sql statement with cursor pointing to the position where completion hints are requested.
 List<SqlMoniker> getCompletionHints(String sql, SqlParserPos pos)
          Gets completion hints for a syntatically correct sql statement with dummy SqlIdentifier
 List<SqlMoniker> getCompletionHints0(String sql, int cursor)
           
protected  SqlAbstractParserImpl getParserImpl()
          Returns the underlying Parser implementation class.
 SqlMoniker getQualifiedName(String sql, int cursor)
          Gets the fully qualified name for a SqlIdentifier at a given position of a sql statement.
 List<String> getReservedAndKeyWords()
          Return an array of SQL reserved and keywords
 boolean isValid(String sql)
          Attempts to complete and validate a given partially completed sql statement, and returns whether it is valid.
protected  SqlNode parseQuery(String sql)
          Wrapper function to parse a SQL query (SELECT or VALUES, but not INSERT, UPDATE, DELETE, CREATE, DROP etc.), throwing a SqlParseException if the statement is not syntactically valid.
 String simplifySql(String sql, int cursor)
          Turns a partially completed or syntatically incorrect sql statement into a simplified, valid one that can be passed into getCompletionHints()
private  SqlNode tryParse(String sql, List<SqlMoniker> hintList)
          Tries to parse a SQL statement.
 List<SqlAdvisor.ValidateErrorInfo> validate(String sql)
          Attempts to parse and validate a SQL statement.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

tracer

public static final Logger tracer

validator

private final SqlValidatorWithHints validator

hintToken

private final String hintToken
See Also:
Constant Field Values
Constructor Detail

SqlAdvisor

public SqlAdvisor(SqlValidatorWithHints validator)
Creates a SqlAdvisor with a validator instance

Parameters:
validator - Validator
Method Detail

getCompletionHints

public List<SqlMoniker> getCompletionHints(String sql,
                                           int cursor,
                                           String[] replaced)
Gets completion hints for a partially completed or syntatically incorrect sql statement with cursor pointing to the position where completion hints are requested.

Writes into replaced[0] the string that is being replaced. Includes the cursor and the preceding identifier. For example, if sql is "select abc^de from t", sets replaced[0] to "abc". If the cursor is in the middle of whitespace, the replaced string is empty. The replaced string is never null.

Parameters:
sql - A partial or syntatically incorrect sql statement for which to retrieve completion hints
cursor - to indicate the 0-based cursor position in the query at
replaced - String which is being replaced (output)
Returns:
completion hints

getCompletionHints0

public List<SqlMoniker> getCompletionHints0(String sql,
                                            int cursor)

getCompletionHints

public List<SqlMoniker> getCompletionHints(String sql,
                                           SqlParserPos pos)
Gets completion hints for a syntatically correct sql statement with dummy SqlIdentifier

Parameters:
sql - A syntatically correct sql statement for which to retrieve completion hints
pos - to indicate the line and column position in the query at which completion hints need to be retrieved. For example, "select a.ename, b.deptno from sales.emp a join sales.dept b "on a.deptno=b.deptno where empno=1"; setting pos to 'Line 1, Column 17' returns all the possible column names that can be selected from sales.dept table setting pos to 'Line 1, Column 31' returns all the possible table names in 'sales' schema
Returns:
an array of hints (SqlMoniker) that can fill in at the indicated position

tryParse

private SqlNode tryParse(String sql,
                         List<SqlMoniker> hintList)
Tries to parse a SQL statement.

If succeeds, returns the parse tree node; if fails, populates the list of hints and returns null.

Parameters:
sql - SQL statement
hintList - List of hints suggesting allowable tokens at the point of failure
Returns:
Parse tree if succeeded, null if parse failed

getQualifiedName

public SqlMoniker getQualifiedName(String sql,
                                   int cursor)
Gets the fully qualified name for a SqlIdentifier at a given position of a sql statement.

Parameters:
sql - A syntactically correct sql statement for which to retrieve a fully qualified SQL identifier name
cursor - to indicate the 0-based cursor position in the query that represents a SQL identifier for which its fully qualified name is to be returned.
Returns:
a SqlMoniker that contains the fully qualified name of the specified SQL identifier, returns null if none is found or the SQL statement is invalid.

isValid

public boolean isValid(String sql)
Attempts to complete and validate a given partially completed sql statement, and returns whether it is valid.

Parameters:
sql - A partial or syntatically incorrect sql statement to validate
Returns:
whether SQL statement is valid

validate

public List<SqlAdvisor.ValidateErrorInfo> validate(String sql)
Attempts to parse and validate a SQL statement. Throws the first exception encountered. The error message of this exception is to be displayed on the UI

Parameters:
sql - A user-input sql statement to be validated
Returns:
a List of ValidateErrorInfo (null if sql is valid)

simplifySql

public String simplifySql(String sql,
                          int cursor)
Turns a partially completed or syntatically incorrect sql statement into a simplified, valid one that can be passed into getCompletionHints()

Parameters:
sql - A partial or syntatically incorrect sql statement
cursor - to indicate column position in the query at which completion hints need to be retrieved.
Returns:
a completed, valid (and possibly simplified SQL statement

getReservedAndKeyWords

public List<String> getReservedAndKeyWords()
Return an array of SQL reserved and keywords

Returns:
an of SQL reserved and keywords

getParserImpl

protected SqlAbstractParserImpl getParserImpl()
Returns the underlying Parser implementation class.

To use a different parser (recognizing a different dialect of SQL), derived class should override.

Returns:
a SqlAbstractParserImpl instance

parseQuery

protected SqlNode parseQuery(String sql)
                      throws SqlParseException
Wrapper function to parse a SQL query (SELECT or VALUES, but not INSERT, UPDATE, DELETE, CREATE, DROP etc.), throwing a SqlParseException if the statement is not syntactically valid.

Parameters:
sql - SQL statement
Returns:
parse tree
Throws:
SqlParseException - if not syntactically valid

collectParserError

protected SqlNode collectParserError(String sql,
                                     List<SqlAdvisor.ValidateErrorInfo> errorList)
Attempts to parse a SQL statement and adds to the errorList if any syntax error is found. This implementation uses SqlParser. Subclass can re-implement this with a different parser implementation

Parameters:
sql - A user-input sql statement to be parsed
errorList - A List of error to be added to
Returns:
SqlNode that is root of the parse tree, null if the sql is not valid