Search in sources :

Example 41 with Table

use of net.sf.jsqlparser.schema.Table in project dbeaver by dbeaver.

the class SQLCompletionAnalyzer method makeProposalsFromObject.

private SQLCompletionProposalBase makeProposalsFromObject(DBPNamedObject object, boolean useShortName, @Nullable DBPImage objectIcon, @NotNull Map<String, Object> params) {
    String alias = null;
    String prevWord = request.getWordDetector().getPrevKeyWord();
    if (SQLConstants.KEYWORD_FROM.equals(prevWord) || SQLConstants.KEYWORD_JOIN.equals(prevWord)) {
        if (object instanceof DBSEntity && ((DBSEntity) object).getDataSource().getContainer().getPreferenceStore().getBoolean(SQLModelPreferences.SQL_PROPOSAL_INSERT_TABLE_ALIAS)) {
            SQLDialect dialect = SQLUtils.getDialectFromObject(object);
            if (dialect.supportsAliasInSelect()) {
                String firstKeyword = SQLUtils.getFirstKeyword(dialect, request.getActiveQuery().getText());
                if (dialect.supportsAliasInUpdate() || !ArrayUtils.contains(dialect.getDMLKeywords(), firstKeyword.toUpperCase(Locale.ENGLISH))) {
                    String queryText = request.getActiveQuery().getText();
                    Set<String> aliases = new LinkedHashSet<>();
                    if (request.getActiveQuery() instanceof SQLQuery) {
                        Statement sqlStatement = ((SQLQuery) request.getActiveQuery()).getStatement();
                        if (sqlStatement != null) {
                            TablesNamesFinder namesFinder = new TablesNamesFinder() {

                                public void visit(Table table) {
                                    if (table != null && table.getAlias() != null && table.getAlias().getName() != null) {
                                        aliases.add(table.getAlias().getName().toLowerCase(Locale.ENGLISH));
                                    }
                                }
                            };
                            sqlStatement.accept(namesFinder);
                        }
                    }
                    // It is table name completion after FROM. Auto-generate table alias
                    SQLDialect sqlDialect = SQLUtils.getDialectFromObject(object);
                    alias = SQLUtils.generateEntityAlias((DBSEntity) object, s -> {
                        if (aliases.contains(s) || sqlDialect.getKeywordType(s) != null) {
                            return true;
                        }
                        return Pattern.compile("\\s+" + s + "[^\\w]+").matcher(queryText).find();
                    });
                }
            }
        }
    }
    String objectName = useShortName ? object.getName() : DBUtils.getObjectFullName(object, DBPEvaluationContext.DML);
    boolean isSingleObject = true;
    String replaceString = null;
    DBPDataSource dataSource = request.getContext().getDataSource();
    if (dataSource != null) {
        // replace with full qualified name
        if (!request.getContext().isUseShortNames() && object instanceof DBSObjectReference) {
            if (request.getWordDetector().getFullWord().indexOf(request.getContext().getSyntaxManager().getStructSeparator()) == -1) {
                DBSObjectReference structObject = (DBSObjectReference) object;
                if (structObject.getContainer() != null) {
                    DBSObject selectedObject = DBUtils.getActiveInstanceObject(request.getContext().getExecutionContext());
                    if (selectedObject != structObject.getContainer()) {
                        replaceString = structObject.getFullyQualifiedName(DBPEvaluationContext.DML);
                        isSingleObject = false;
                    }
                }
            }
        }
        if (replaceString == null) {
            if (request.getContext().isUseFQNames() && object instanceof DBPQualifiedObject) {
                replaceString = ((DBPQualifiedObject) object).getFullyQualifiedName(DBPEvaluationContext.DML);
            } else {
                replaceString = DBUtils.getQuotedIdentifier(dataSource, object.getName());
            }
        }
    } else {
        replaceString = DBUtils.getObjectShortName(object);
    }
    if (!CommonUtils.isEmpty(alias)) {
        replaceString += " " + /*convertKeywordCase(request, "as", false) + " " + */
        alias;
    }
    return createCompletionProposal(request, replaceString, objectName, DBPKeywordType.OTHER, objectIcon, isSingleObject, object, params);
}
Also used : DBCSession(org.jkiss.dbeaver.model.exec.DBCSession) java.util(java.util) DBNNode(org.jkiss.dbeaver.model.navigator.DBNNode) Nullable(org.jkiss.code.Nullable) DBCExecutionContext(org.jkiss.dbeaver.model.exec.DBCExecutionContext) NotNull(org.jkiss.code.NotNull) DBDLabelValuePair(org.jkiss.dbeaver.model.data.DBDLabelValuePair) RelationalObjectType(org.jkiss.dbeaver.model.impl.struct.RelationalObjectType) DBNUtils(org.jkiss.dbeaver.model.navigator.DBNUtils) Matcher(java.util.regex.Matcher) Log(org.jkiss.dbeaver.Log) DBRProgressMonitor(org.jkiss.dbeaver.model.runtime.DBRProgressMonitor) org.jkiss.dbeaver.model(org.jkiss.dbeaver.model) DBRRunnableParametrized(org.jkiss.dbeaver.model.runtime.DBRRunnableParametrized) CommonUtils(org.jkiss.utils.CommonUtils) org.jkiss.dbeaver.model.struct(org.jkiss.dbeaver.model.struct) PatternSyntaxException(java.util.regex.PatternSyntaxException) Table(net.sf.jsqlparser.schema.Table) DBObjectNameCaseTransformer(org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer) ArrayUtils(org.jkiss.utils.ArrayUtils) InvocationTargetException(java.lang.reflect.InvocationTargetException) DBCExecutionPurpose(org.jkiss.dbeaver.model.exec.DBCExecutionPurpose) TextUtils(org.jkiss.dbeaver.model.text.TextUtils) DBException(org.jkiss.dbeaver.DBException) Statement(net.sf.jsqlparser.statement.Statement) Pattern(java.util.regex.Pattern) SQLWordPartDetector(org.jkiss.dbeaver.model.sql.parser.SQLWordPartDetector) TablesNamesFinder(net.sf.jsqlparser.util.TablesNamesFinder) org.jkiss.dbeaver.model.sql(org.jkiss.dbeaver.model.sql) Table(net.sf.jsqlparser.schema.Table) Statement(net.sf.jsqlparser.statement.Statement) TablesNamesFinder(net.sf.jsqlparser.util.TablesNamesFinder)

Example 42 with Table

use of net.sf.jsqlparser.schema.Table in project dbeaver by dbeaver.

the class SQLQuery method parseQuery.

private void parseQuery() {
    if (parsed) {
        return;
    }
    parsed = true;
    try {
        if (CommonUtils.isEmpty(text)) {
            this.statement = null;
            this.parseError = new DBException("Empty query");
            return;
        }
        statement = SQLSemanticProcessor.parseQuery(dataSource == null ? null : dataSource.getSQLDialect(), text);
        if (statement instanceof Select) {
            type = SQLQueryType.SELECT;
            // Detect single source table (no joins, no group by, no sub-selects)
            SelectBody selectBody = ((Select) statement).getSelectBody();
            if (selectBody instanceof PlainSelect) {
                PlainSelect plainSelect = (PlainSelect) selectBody;
                if (plainSelect.getFromItem() instanceof Table && CommonUtils.isEmpty(plainSelect.getJoins()) && (plainSelect.getGroupBy() == null || CommonUtils.isEmpty(plainSelect.getGroupBy().getGroupByExpressions())) && CommonUtils.isEmpty(plainSelect.getIntoTables())) {
                    boolean hasSubSelects = false;
                    for (SelectItem si : plainSelect.getSelectItems()) {
                        if (si instanceof SelectExpressionItem && ((SelectExpressionItem) si).getExpression() instanceof SubSelect) {
                            hasSubSelects = true;
                            break;
                        }
                    }
                    if (!hasSubSelects) {
                        fillSingleSource((Table) plainSelect.getFromItem());
                    }
                }
                // Extract select items info
                final List<SelectItem> items = plainSelect.getSelectItems();
                if (items != null && !items.isEmpty()) {
                    selectItems = new ArrayList<>();
                    for (SelectItem item : items) {
                        selectItems.add(new SQLSelectItem(item));
                    }
                }
            }
        } else if (statement instanceof Insert) {
            type = SQLQueryType.INSERT;
            fillSingleSource(((Insert) statement).getTable());
        } else if (statement instanceof Update) {
            type = SQLQueryType.UPDATE;
            Table table = ((Update) statement).getTable();
            if (table != null) {
                fillSingleSource(table);
            }
        } else if (statement instanceof Delete) {
            type = SQLQueryType.DELETE;
            if (((Delete) statement).getTable() != null) {
                fillSingleSource(((Delete) statement).getTable());
            } else {
                List<Table> tables = ((Delete) statement).getTables();
                if (tables != null && tables.size() == 1) {
                    fillSingleSource(tables.get(0));
                }
            }
        } else if (statement instanceof Alter || statement instanceof CreateTable || statement instanceof CreateView || statement instanceof Drop || statement instanceof CreateIndex) {
            type = SQLQueryType.DDL;
        } else {
            type = SQLQueryType.UNKNOWN;
        }
    } catch (Throwable e) {
        this.type = SQLQueryType.UNKNOWN;
        this.parseError = e;
    // log.debug("Error parsing SQL query [" + query + "]:" + CommonUtils.getRootCause(e).getMessage());
    }
}
Also used : Delete(net.sf.jsqlparser.statement.delete.Delete) DBException(org.jkiss.dbeaver.DBException) Table(net.sf.jsqlparser.schema.Table) CreateTable(net.sf.jsqlparser.statement.create.table.CreateTable) CreateTable(net.sf.jsqlparser.statement.create.table.CreateTable) Insert(net.sf.jsqlparser.statement.insert.Insert) Update(net.sf.jsqlparser.statement.update.Update) CreateView(net.sf.jsqlparser.statement.create.view.CreateView) Drop(net.sf.jsqlparser.statement.drop.Drop) Alter(net.sf.jsqlparser.statement.alter.Alter) CreateIndex(net.sf.jsqlparser.statement.create.index.CreateIndex) ArrayList(java.util.ArrayList) List(java.util.List)

Aggregations

Table (net.sf.jsqlparser.schema.Table)42 Column (net.sf.jsqlparser.schema.Column)18 Expression (net.sf.jsqlparser.expression.Expression)14 Test (org.junit.Test)13 Select (net.sf.jsqlparser.statement.select.Select)11 PlainSelect (net.sf.jsqlparser.statement.select.PlainSelect)9 AndExpression (net.sf.jsqlparser.expression.operators.conditional.AndExpression)8 ArrayList (java.util.ArrayList)6 Nullable (org.jkiss.code.Nullable)6 Statement (net.sf.jsqlparser.statement.Statement)5 DBException (org.jkiss.dbeaver.DBException)5 InvocationTargetException (java.lang.reflect.InvocationTargetException)4 java.util (java.util)4 List (java.util.List)4 Matcher (java.util.regex.Matcher)4 Pattern (java.util.regex.Pattern)4 PatternSyntaxException (java.util.regex.PatternSyntaxException)4 LongValue (net.sf.jsqlparser.expression.LongValue)4 Delete (net.sf.jsqlparser.statement.delete.Delete)4 Insert (net.sf.jsqlparser.statement.insert.Insert)4