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);
}
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());
}
}
Aggregations