提交 88e58a76 编写于 作者: J jurgen

SQL query with filters processing fix

RSV filters dialog refactoring
上级 b217ede0
......@@ -26,12 +26,10 @@ import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.FromItem;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import org.jkiss.dbeaver.core.Log;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBUtils;
......@@ -105,7 +103,12 @@ public class SQLSemanticProcessor {
if (filter.hasConditions()) {
StringBuilder whereString = new StringBuilder();
SQLUtils.appendConditionString(filter, dataSource, tableAlias, whereString, true);
Expression filterWhere = CCJSqlParserUtil.parseCondExpression(whereString.toString());
Expression filterWhere;
try {
filterWhere = CCJSqlParserUtil.parseCondExpression(whereString.toString());
} catch (JSQLParserException e) {
throw new JSQLParserException("Bad query condition: [" + whereString + "]", e);
}
Expression sourceWhere = select.getWhere();
if (sourceWhere == null) {
select.setWhere(filterWhere);
......
......@@ -265,6 +265,11 @@ public class SQLQueryJob extends DataSourceJob
}
long startTime = System.currentTimeMillis();
if (fireEvents && listener != null) {
// Notify query start
listener.onStartQuery(sqlStatement);
}
try {
// Prepare statement
closeStatement();
......@@ -275,9 +280,13 @@ public class SQLQueryJob extends DataSourceJob
connectionInvalidated = true;
}
// Modify query (filters + parameters)
if (dataFilter != null && dataFilter.hasFilters() && dataSource instanceof SQLDataSource) {
sqlQuery = ((SQLDataSource) dataSource).getSQLDialect().addFiltersToQuery(dataSource, sqlQuery, dataFilter);
try {
// Modify query (filters + parameters)
if (dataFilter != null && dataFilter.hasFilters() && dataSource instanceof SQLDataSource) {
sqlQuery = ((SQLDataSource) dataSource).getSQLDialect().addFiltersToQuery(dataSource, sqlQuery, dataFilter);
}
} catch (DBException e) {
throw new DBCException("Can't apply query filter", e);
}
Boolean hasParameters = prepareStatementParameters(sqlStatement);
......@@ -285,11 +294,6 @@ public class SQLQueryJob extends DataSourceJob
return false;
}
if (fireEvents && listener != null) {
// Notify query start
listener.onStartQuery(sqlStatement);
}
statistics.setQueryText(sqlQuery);
startTime = System.currentTimeMillis();
......
......@@ -18,7 +18,6 @@
*/
package org.jkiss.dbeaver.ui;
import org.jkiss.dbeaver.core.Log;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.action.IAction;
......@@ -32,7 +31,6 @@ import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabItem;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.*;
......@@ -52,10 +50,7 @@ import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.DBeaverConstants;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverActivator;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.core.*;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.runtime.RunnableWithResult;
import org.jkiss.dbeaver.runtime.RuntimeUtils;
......@@ -1165,52 +1160,4 @@ public class UIUtils {
return new RGB(r, g, b);
}
public interface TableEditorController {
void showEditor(TableItem item);
void closeEditor(TableEditor tableEditor);
}
public static class ColumnTextEditorTraverseListener implements TraverseListener {
private final Table table;
private final TableEditor tableEditor;
private final int columnIndex;
private final TableEditorController controller;
public ColumnTextEditorTraverseListener(Table table, TableEditor tableEditor, int columnIndex,
TableEditorController controller)
{
this.table = table;
this.tableEditor = tableEditor;
this.columnIndex = columnIndex;
this.controller = controller;
}
@Override
public void keyTraversed(TraverseEvent e)
{
Text editor = (Text) tableEditor.getEditor();
if (editor != null && editor.isDisposed()) {
editor = null;
}
if (e.detail == SWT.TRAVERSE_RETURN) {
if (editor != null) {
tableEditor.getItem().setText(columnIndex, editor.getText());
controller.closeEditor(tableEditor);
} else {
TableItem[] selection = table.getSelection();
if (selection != null && selection.length >= 1) {
controller.showEditor(selection[0]);
}
}
e.doit = false;
e.detail = SWT.TRAVERSE_NONE;
} else if (e.detail == SWT.TRAVERSE_ESCAPE && editor != null) {
controller.closeEditor(tableEditor);
e.doit = false;
e.detail = SWT.TRAVERSE_NONE;
}
}
}
}
......@@ -72,6 +72,9 @@ public abstract class CustomTableEditor implements MouseListener, TraverseListen
closeEditor();
table.showItem(item);
final Control editor = createEditor(table, columnIndex, item);
if (editor == null) {
return;
}
editor.setFocus();
editor.addFocusListener(new FocusAdapter() {
@Override
......
......@@ -40,6 +40,7 @@ import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.ui.DBIcon;
import org.jkiss.dbeaver.ui.IHelpContextIds;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CustomTableEditor;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.dialogs.HelpEnabledDialog;
import org.jkiss.utils.CommonUtils;
......@@ -113,26 +114,62 @@ class FilterSettingsDialog extends HelpEnabledDialog {
UIUtils.createTableColumn(columnsTable, SWT.LEFT, CoreMessages.controls_resultset_filter_column_order);
criteriaColumn = UIUtils.createTableColumn(columnsTable, SWT.LEFT, CoreMessages.controls_resultset_filter_column_criteria);
//columnsTable.addListener(SWT.PaintItem, new ColumnPaintListener());
final TableEditor tableEditor = new TableEditor(columnsTable);
tableEditor.horizontalAlignment = SWT.CENTER;
tableEditor.verticalAlignment = SWT.TOP;
tableEditor.grabHorizontal = true;
tableEditor.minimumWidth = 50;
final CustomTableEditor tableEditor = new CustomTableEditor(columnsTable) {
@Override
protected Control createEditor(Table table, int index, TableItem item) {
if (index == 2) {
toggleColumnOrder(item);
return null;
} else if (index == 3 && resultSetViewer.supportsDataFilter()) {
Text text = new Text(columnsTable, SWT.BORDER);
text.setText(item.getText(index));
text.selectAll();
return text;
}
return null;
}
@Override
protected void saveEditorValue(Control control, int index, TableItem item) {
Text text = (Text) control;
String criteria = text.getText().trim();
DBDAttributeConstraint constraint = (DBDAttributeConstraint) item.getData();
if (CommonUtils.isEmpty(criteria)) {
constraint.setCriteria(null);
} else {
constraint.setCriteria(criteria);
}
item.setText(3, criteria);
}
private void toggleColumnOrder(TableItem item)
{
DBDAttributeConstraint constraint = (DBDAttributeConstraint) item.getData();
if (constraint.getOrderPosition() == 0) {
// Add new ordered column
constraint.setOrderPosition(dataFilter.getMaxOrderingPosition() + 1);
constraint.setOrderDescending(false);
} else if (!constraint.isOrderDescending()) {
constraint.setOrderDescending(true);
} else {
// Remove ordered column
for (DBDAttributeConstraint con2 : dataFilter.getConstraints()) {
if (con2.getOrderPosition() > constraint.getOrderPosition()) {
con2.setOrderPosition(con2.getOrderPosition() - 1);
}
}
constraint.setOrderPosition(0);
constraint.setOrderDescending(false);
}
columnsViewer.refresh();
}
};
columnsViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event)
{
public void checkStateChanged(CheckStateChangedEvent event) {
((DBDAttributeConstraint) event.getElement()).setVisible(event.getChecked());
}
});
ColumnsMouseListener mouseListener = new ColumnsMouseListener(tableEditor, columnsTable);
columnsTable.addMouseListener(mouseListener);
columnsTable.addTraverseListener(
new UIUtils.ColumnTextEditorTraverseListener(columnsTable, tableEditor, 3, mouseListener));
{
Composite controlGroup = new Composite(columnsGroup, SWT.NONE);
gd = new GridData(GridData.FILL_HORIZONTAL);
......@@ -371,97 +408,6 @@ class FilterSettingsDialog extends HelpEnabledDialog {
}
private class ColumnsMouseListener extends MouseAdapter implements UIUtils.TableEditorController {
private final TableEditor tableEditor;
private final Table columnsTable;
public ColumnsMouseListener(TableEditor tableEditor, Table columnsTable)
{
this.tableEditor = tableEditor;
this.columnsTable = columnsTable;
}
@Override
public void mouseUp(MouseEvent e)
{
// Clean up any previous editor control
closeEditor(tableEditor);
TableItem item = columnsTable.getItem(new Point(e.x, e.y));
if (item == null) {
return;
}
int columnIndex = UIUtils.getColumnAtPos(item, e.x, e.y);
if (columnIndex <= 0) {
return;
}
if (columnIndex == 2) {
//if (isDef) {
toggleColumnOrder(item);
//}
} else if (columnIndex == 3 && resultSetViewer.supportsDataFilter()) {
showEditor(item);
}
}
private void toggleColumnOrder(TableItem item)
{
DBDAttributeConstraint constraint = (DBDAttributeConstraint) item.getData();
if (constraint.getOrderPosition() == 0) {
// Add new ordered column
constraint.setOrderPosition(dataFilter.getMaxOrderingPosition() + 1);
constraint.setOrderDescending(false);
} else if (!constraint.isOrderDescending()) {
constraint.setOrderDescending(true);
} else {
// Remove ordered column
for (DBDAttributeConstraint con2 : dataFilter.getConstraints()) {
if (con2.getOrderPosition() > constraint.getOrderPosition()) {
con2.setOrderPosition(con2.getOrderPosition() - 1);
}
}
constraint.setOrderPosition(0);
constraint.setOrderDescending(false);
}
columnsViewer.refresh();
}
@Override
public void showEditor(final TableItem item) {
// Identify the selected row
Text text = new Text(columnsTable, SWT.BORDER);
text.setText(item.getText(3));
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
Text text = (Text) tableEditor.getEditor();
String criteria = text.getText().trim();
DBDAttributeConstraint constraint = (DBDAttributeConstraint) item.getData();
if (CommonUtils.isEmpty(criteria)) {
constraint.setCriteria(null);
} else {
constraint.setCriteria(criteria);
}
tableEditor.getItem().setText(3, criteria);
}
});
text.selectAll();
// Selected by mouse
text.setFocus();
tableEditor.setEditor(text, item, 3);
}
@Override
public void closeEditor(TableEditor tableEditor)
{
Control oldEditor = this.tableEditor.getEditor();
if (oldEditor != null) oldEditor.dispose();
}
}
class CheckStateProvider implements ICheckStateProvider {
@Override
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册