Search in sources :

Example 1 with SqlMonikerImpl

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;
}
Also used : SqlMoniker(org.apache.calcite.sql.validate.SqlMoniker) ArrayList(java.util.ArrayList) CalciteContextException(org.apache.calcite.runtime.CalciteContextException) CalciteException(org.apache.calcite.runtime.CalciteException) SqlParseException(org.apache.calcite.sql.parser.SqlParseException) SqlNode(org.apache.calcite.sql.SqlNode) SqlMonikerImpl(org.apache.calcite.sql.validate.SqlMonikerImpl)

Aggregations

ArrayList (java.util.ArrayList)1 CalciteContextException (org.apache.calcite.runtime.CalciteContextException)1 CalciteException (org.apache.calcite.runtime.CalciteException)1 SqlNode (org.apache.calcite.sql.SqlNode)1 SqlParseException (org.apache.calcite.sql.parser.SqlParseException)1 SqlMoniker (org.apache.calcite.sql.validate.SqlMoniker)1 SqlMonikerImpl (org.apache.calcite.sql.validate.SqlMonikerImpl)1