use of org.apache.calcite.sql.validate.SqlMonikerImpl in project calcite by apache.
the class SqlAdvisor method getCompletionHints.
/**
* Gets completion hints for a syntactically correct sql statement with dummy
* SqlIdentifier
*
* @param sql A syntactically correct sql statement for which to retrieve
* completion hints
* @param 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
* @return an array of hints ({@link SqlMoniker}) that can fill in at the
* indicated position
*/
public List<SqlMoniker> getCompletionHints(String sql, SqlParserPos pos) {
// First try the statement they gave us. If this fails, just return
// the tokens which were expected at the failure point.
List<SqlMoniker> hintList = new ArrayList<SqlMoniker>();
SqlNode sqlNode = tryParse(sql, hintList);
if (sqlNode == null) {
return hintList;
}
// Now construct a statement which is bound to fail. (Character 7 BEL
// is not legal in any SQL statement.)
final int x = pos.getColumnNum() - 1;
sql = sql.substring(0, x) + " \07" + sql.substring(x);
tryParse(sql, hintList);
final SqlMoniker star = new SqlMonikerImpl(ImmutableList.of("*"), SqlMonikerType.KEYWORD);
if (hintList.contains(star) && !isSelectListItem(sqlNode, pos)) {
hintList.remove(star);
}
// Add the identifiers which are expected at the point of interest.
try {
validator.validate(sqlNode);
} catch (Exception e) {
// mask any exception that is thrown during the validation, i.e.
// try to continue even if the sql is invalid. we are doing a best
// effort here to try to come up with the requested completion
// hints
Util.swallow(e, LOGGER);
}
final List<SqlMoniker> validatorHints = validator.lookupHints(sqlNode, pos);
hintList.addAll(validatorHints);
return hintList;
}
Aggregations