提交 155bf0c4 编写于 作者: S serge-rider

Merge remote-tracking branch 'origin/devel' into devel

......@@ -89,7 +89,9 @@ command.org.jkiss.dbeaver.core.object.create.description=Create new database obj
command.org.jkiss.dbeaver.core.object.delete.name=Delete Object
command.org.jkiss.dbeaver.core.object.delete.description=Delete database object
command.org.jkiss.dbeaver.core.object.filter.name=Filter
command.org.jkiss.dbeaver.core.object.filter.description=Filter objects
command.org.jkiss.dbeaver.core.object.filter.description=Configure objects filter
command.org.jkiss.dbeaver.core.object.filter.add.name=Filter object
command.org.jkiss.dbeaver.core.object.filter.add.description=Filter selected object
command.org.jkiss.dbeaver.core.object.goto.name=Open Database Object ...
command.org.jkiss.dbeaver.core.object.goto.description=Open database meta object
......
......@@ -70,7 +70,7 @@
class="org.jkiss.dbeaver.ui.actions.ObjectPropertyTester"
id="org.jkiss.dbeaver.ui.actions.ObjectPropertyTester"
namespace="org.jkiss.dbeaver.core.object"
properties="canOpen,canCreate,canPaste,canDelete,canRename,canFilter"
properties="canOpen,canCreate,canPaste,canDelete,canRename,canFilter,canFilterObject"
type="org.jkiss.dbeaver.model.navigator.DBNNode"/>
<propertyTester
class="org.jkiss.dbeaver.ui.actions.ResourcePropertyTester"
......@@ -206,6 +206,7 @@
<command id="org.jkiss.dbeaver.core.object.create" name="%command.org.jkiss.dbeaver.core.object.create.name" description="%command.org.jkiss.dbeaver.core.object.create.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.delete" name="%command.org.jkiss.dbeaver.core.object.delete.name" description="%command.org.jkiss.dbeaver.core.object.delete.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.filter" name="%command.org.jkiss.dbeaver.core.object.filter.name" description="%command.org.jkiss.dbeaver.core.object.filter.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.filter.add" name="%command.org.jkiss.dbeaver.core.object.filter.add.name" description="%command.org.jkiss.dbeaver.core.object.filter.add.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.core.object.goto" name="%command.org.jkiss.dbeaver.core.object.goto.name" description="%command.org.jkiss.dbeaver.core.object.goto.description" categoryId="org.jkiss.dbeaver.core.database"/>
<command id="org.jkiss.dbeaver.ui.editors.sql.run.statement" name="%command.org.jkiss.dbeaver.ui.editors.sql.run.statement.name" description="%command.org.jkiss.dbeaver.ui.editors.sql.run.statement.description" categoryId="org.jkiss.dbeaver.core.sql"/>
......@@ -295,6 +296,7 @@
<image commandId="org.jkiss.dbeaver.core.object.create" icon="IMG_TOOL_NEW_WIZARD"/>
<image commandId="org.jkiss.dbeaver.core.object.delete" icon="IMG_ETOOL_DELETE"/>
<image commandId="org.jkiss.dbeaver.core.object.filter" icon="icons/misc/filter.png"/>
<image commandId="org.jkiss.dbeaver.core.object.filter.add" icon="icons/misc/filter_add.png"/>
<image commandId="org.jkiss.dbeaver.ui.editors.sql.run.statement" icon="icons/sql/sql_exec.png"/>
<image commandId="org.jkiss.dbeaver.ui.editors.sql.run.statementNew" icon="icons/sql/sql_exec_new.png"/>
......@@ -705,6 +707,18 @@
</with>
</enabledWhen>
</handler>
<handler commandId="org.jkiss.dbeaver.core.object.filter.add" class="org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerFilterObjects">
<enabledWhen>
<with variable="selection">
<iterate operator="and">
<and>
<instanceof value="org.jkiss.dbeaver.model.navigator.DBNNode"/>
<test property="org.jkiss.dbeaver.core.object.canFilterObject"/>
</and>
</iterate>
</with>
</enabledWhen>
</handler>
<handler commandId="org.eclipse.ui.edit.paste" class="org.jkiss.dbeaver.ui.actions.navigator.NavigatorHandlerObjectCreateCopy">
<activeWhen><reference definitionId="org.jkiss.dbeaver.core.ui.navigator.part"/></activeWhen>
......@@ -1561,6 +1575,9 @@
<command commandId="org.eclipse.ui.edit.rename">
<visibleWhen checkEnabled="true"/>
</command>
<command commandId="org.jkiss.dbeaver.core.object.filter.add">
<visibleWhen checkEnabled="true"/>
</command>
<command commandId="org.jkiss.dbeaver.core.sql.script.associate">
<visibleWhen checkEnabled="true"/>
......
......@@ -687,7 +687,7 @@ public class CoreMessages extends NLS {
public static String dialog_filter_button_enable;
public static String dialog_filter_button_remove;
public static String dialog_filter_button_clear;
public static String dialog_filter_global_link;
public static String dialog_filter_list_exclude;
......
......@@ -416,6 +416,7 @@ data_transfer_wizard_settings_title=Settings
dialog_filter_button_add=Add
dialog_filter_button_enable=Enable
dialog_filter_button_remove=Remove
dialog_filter_button_clear=Clear
dialog_filter_global_link=<a>Show global filter</a>
dialog_filter_list_exclude=Exclude
dialog_filter_list_include=Include
......
......@@ -44,6 +44,7 @@ public class ObjectPropertyTester extends PropertyTester
public static final String PROP_CAN_DELETE = "canDelete";
public static final String PROP_CAN_RENAME = "canRename";
public static final String PROP_CAN_FILTER = "canFilter";
public static final String PROP_CAN_FILTER_OBJECT = "canFilterObject";
public ObjectPropertyTester() {
super();
......@@ -162,6 +163,12 @@ public class ObjectPropertyTester extends PropertyTester
}
break;
}
case PROP_CAN_FILTER_OBJECT: {
if (node.getParentNode() instanceof DBNDatabaseFolder && ((DBNDatabaseFolder) node.getParentNode()).getItemsMeta() != null) {
return true;
}
break;
}
}
return false;
}
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2016 Serge Rieder (serge@jkiss.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License (version 2)
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.actions.navigator;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;
import org.jkiss.dbeaver.model.navigator.DBNDatabaseFolder;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.model.struct.DBSObjectFilter;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.navigator.NavigatorUtils;
import java.util.HashMap;
import java.util.Map;
public class NavigatorHandlerFilterObjects extends NavigatorHandlerObjectCreateBase implements IElementUpdater {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
final ISelection selection = HandlerUtil.getCurrentSelection(event);
if (selection instanceof IStructuredSelection) {
Map<DBNDatabaseFolder, DBSObjectFilter> folders = new HashMap<>();
for (Object item : ((IStructuredSelection)selection).toArray()) {
if (item instanceof DBNNode) {
final DBNNode node = (DBNNode) item;
DBNDatabaseFolder folder = (DBNDatabaseFolder) node.getParentNode();
DBSObjectFilter nodeFilter = folders.get(folder);
if (nodeFilter == null) {
nodeFilter = folder.getNodeFilter(folder.getItemsMeta(), true);
if (nodeFilter == null) {
nodeFilter = new DBSObjectFilter();
}
folders.put(folder, nodeFilter);
}
nodeFilter.addExclude(node.getNodeName());
nodeFilter.setEnabled(true);
}
}
// Save folders
for (Map.Entry<DBNDatabaseFolder, DBSObjectFilter> entry : folders.entrySet()) {
entry.getKey().setNodeFilter(entry.getKey().getItemsMeta(), entry.getValue());
}
// Refresh all folders
NavigatorHandlerRefresh.refreshNavigator(folders.keySet());
}
return null;
}
@Override
public void updateElement(UIElement element, Map parameters)
{
if (!updateUI) {
return;
}
ISelectionProvider selectionProvider = UIUtils.getSelectionProvider(element.getServiceLocator());
if (selectionProvider != null) {
final ISelection selection = selectionProvider.getSelection();
if (selection instanceof IStructuredSelection) {
final int objectCount = ((IStructuredSelection) selection).size();
if (objectCount > 1) {
element.setText("Filter " + objectCount + " objects");
} else {
DBNNode node = NavigatorUtils.getSelectedNode(selection);
if (node != null) {
element.setText("Filter " + node.getNodeType());
}
}
}
}
}
}
\ No newline at end of file
......@@ -37,18 +37,19 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSAttributeEnumerable;
import org.jkiss.dbeaver.model.struct.DBSEntityReferrer;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.data.IValueController;
import org.jkiss.dbeaver.ui.data.IValueEditor;
import org.jkiss.dbeaver.ui.data.editors.ReferenceValueEditor;
import org.jkiss.dbeaver.ui.dialogs.BaseDialog;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.TreeMap;
import java.util.*;
class FilterValueEditDialog extends BaseDialog {
......@@ -138,14 +139,19 @@ class FilterValueEditDialog extends BaseDialog {
}
private void createMultiValueSelector(Composite composite) {
table = new Table(composite, SWT.BORDER | SWT.SINGLE | SWT.CHECK);
table = new Table(composite, SWT.BORDER | SWT.SINGLE | SWT.CHECK | SWT.FULL_SELECTION);
table.setLinesVisible(true);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 400;
gd.heightHint = 300;
table.setLayoutData(gd);
UIUtils.createTableColumn(table, SWT.LEFT, "Value");
UIUtils.createTableColumn(table, SWT.LEFT, "Description");
if (attr.getEntityAttribute() instanceof DBSAttributeEnumerable) {
final DBSEntityReferrer enumerableConstraint = ReferenceValueEditor.getEnumerableConstraint(attr);
if (enumerableConstraint != null) {
} else if (attr.getEntityAttribute() instanceof DBSAttributeEnumerable) {
loadAttributeEnum((DBSAttributeEnumerable) attr.getEntityAttribute());
} else {
java.util.Map<String, DBDLabelValuePair> enumList = new TreeMap<>();
......@@ -184,18 +190,23 @@ class FilterValueEditDialog extends BaseDialog {
}
private void loadMultiValueList(Collection<DBDLabelValuePair> values) {
for (DBDLabelValuePair row : values) {
java.util.List<DBDLabelValuePair> sortedList = new ArrayList<>(values);
Collections.sort(sortedList);
for (DBDLabelValuePair row : sortedList) {
Object cellValue = row.getValue();
String itemString = attr.getValueHandler().getValueDisplayString(attr, cellValue, DBDDisplayFormat.UI);
TableItem item = new TableItem(table, SWT.LEFT);
item.setData(cellValue);
item.setText(itemString);
item.setText(0, itemString);
if (!CommonUtils.isEmpty(row.getLabel())) {
item.setText(1, row.getLabel());
}
if (ArrayUtils.contains(rows, row)) {
item.setChecked(true);
}
}
UIUtils.packColumns(table);
UIUtils.packColumns(table, false);
}
@Override
......
......@@ -21,7 +21,10 @@ import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
......@@ -36,7 +39,10 @@ import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDValue;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.resultset.IResultSetController;
import org.jkiss.dbeaver.ui.data.IValueController;
import org.jkiss.dbeaver.ui.data.IValueEditor;
......@@ -212,9 +218,6 @@ abstract class ViewValuePanel extends Composite {
}
if (valueViewer != null) {
try {
if (referenceValueEditor != null) {
referenceValueEditor.setHandleEditorChange(false);
}
Object newValue = previewController.getValue();
if (newValue instanceof DBDValue) {
// Do not check for difference
......@@ -227,10 +230,6 @@ abstract class ViewValuePanel extends Composite {
}
} catch (DBException e) {
log.error(e);
} finally {
if (referenceValueEditor != null) {
referenceValueEditor.setHandleEditorChange(true);
}
}
valueViewer.setDirty(false);
}
......
......@@ -75,7 +75,6 @@ public class ReferenceValueEditor {
private IValueEditor valueEditor;
private DBSEntityReferrer refConstraint;
private Table editorSelector;
private boolean handleEditorChange;
private SelectorLoaderJob loaderJob = null;
public ReferenceValueEditor(IValueController valueController, IValueEditor valueEditor) {
......@@ -92,21 +91,28 @@ public class ReferenceValueEditor {
private DBSEntityReferrer getEnumerableConstraint()
{
if (valueController instanceof IAttributeController) {
try {
DBSEntityAttribute entityAttribute = ((IAttributeController) valueController).getBinding().getEntityAttribute();
if (entityAttribute != null) {
List<DBSEntityReferrer> refs = DBUtils.getAttributeReferrers(VoidProgressMonitor.INSTANCE, entityAttribute);
DBSEntityReferrer constraint = refs.isEmpty() ? null : refs.get(0);
if (constraint instanceof DBSEntityAssociation &&
((DBSEntityAssociation)constraint).getReferencedConstraint() instanceof DBSConstraintEnumerable &&
((DBSConstraintEnumerable)((DBSEntityAssociation)constraint).getReferencedConstraint()).supportsEnumeration())
{
return getEnumerableConstraint(((IAttributeController) valueController).getBinding());
}
return null;
}
public static DBSEntityReferrer getEnumerableConstraint(DBDAttributeBinding binding) {
try {
DBSEntityAttribute entityAttribute = binding.getEntityAttribute();
if (entityAttribute != null) {
List<DBSEntityReferrer> refs = DBUtils.getAttributeReferrers(VoidProgressMonitor.INSTANCE, entityAttribute);
DBSEntityReferrer constraint = refs.isEmpty() ? null : refs.get(0);
if (constraint instanceof DBSEntityAssociation &&
((DBSEntityAssociation)constraint).getReferencedConstraint() instanceof DBSConstraintEnumerable)
{
final DBSConstraintEnumerable refConstraint = (DBSConstraintEnumerable) ((DBSEntityAssociation) constraint).getReferencedConstraint();
if (refConstraint != null && refConstraint.supportsEnumeration()) {
return constraint;
}
}
} catch (DBException e) {
log.error(e);
}
} catch (DBException e) {
log.error(e);
}
return null;
}
......@@ -185,7 +191,6 @@ public class ReferenceValueEditor {
{
TableItem[] selection = editorSelector.getSelection();
if (selection != null && selection.length > 0) {
handleEditorChange = false;
Object value = selection[0].getData();
//editorControl.setText(selection[0].getText());
try {
......@@ -193,7 +198,6 @@ public class ReferenceValueEditor {
} catch (DBException e1) {
log.error(e1);
}
handleEditorChange = true;
}
}
});
......@@ -210,7 +214,23 @@ public class ReferenceValueEditor {
log.error(e1);
return;
}
if (handleEditorChange) {
// Try to select current value in the table
final String curTextValue = valueController.getValueHandler().getValueDisplayString(
((IAttributeController) valueController).getBinding(),
curEditorValue,
DBDDisplayFormat.UI);
boolean valueFound = false;
for (TableItem item : editorSelector.getItems()) {
if (item.getText(0).equals(curTextValue)) {
editorSelector.select(editorSelector.indexOf(item));
editorSelector.showItem(item);
valueFound = true;
break;
}
}
if (!valueFound) {
// Read dictionary
if (loaderJob.getState() == Job.RUNNING) {
// Cancel it and create new one
loaderJob.cancel();
......@@ -218,21 +238,7 @@ public class ReferenceValueEditor {
}
loaderJob.setPattern(curEditorValue);
if (loaderJob.getState() != Job.WAITING) {
loaderJob.schedule(500);
}
} else {
// Just select current value in the table
final String curTextValue = valueController.getValueHandler().getValueDisplayString(
((IAttributeController) valueController).getBinding(),
curEditorValue,
DBDDisplayFormat.UI);
for (TableItem item : editorSelector.getItems()) {
if (item.getText(0).equals(curTextValue)) {
editorSelector.select(editorSelector.indexOf(item));
editorSelector.showItem(item);
break;
}
loaderJob.schedule(100);
}
}
}
......@@ -242,18 +248,17 @@ public class ReferenceValueEditor {
} else if (control instanceof StyledText) {
((StyledText)control).addModifyListener(modifyListener);
}
handleEditorChange = true;
loaderJob = new SelectorLoaderJob();
final Object curValue = valueController.getValue();
if (curValue instanceof Number) {
loaderJob.setPattern(curValue);
}
loaderJob.schedule(500);
return true;
}
public void setHandleEditorChange(boolean handleEditorChange) {
this.handleEditorChange = handleEditorChange;
}
private void updateDictionarySelector(Map<Object, String> keyValues, DBSEntityAttributeRef keyColumn, DBDValueHandler keyHandler) {
if (editorSelector == null || editorSelector.isDisposed()) {
return;
......
......@@ -165,6 +165,18 @@ public class EditObjectFilterDialog extends HelpEnabledDialog {
});
removeButton.setEnabled(false);
final Button clearButton = new Button(buttonsGroup, SWT.PUSH);
clearButton.setText(CoreMessages.dialog_filter_button_clear);
clearButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
clearButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tableEditor.closeEditor();
valueTable.removeAll();
removeButton.setEnabled(false);
}
});
valueTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
......
......@@ -21,7 +21,7 @@ package org.jkiss.dbeaver.model.data;
/**
* Label value pair
*/
public class DBDLabelValuePair {
public class DBDLabelValuePair implements Comparable {
private final String label;
private final Object value;
......@@ -38,4 +38,29 @@ public class DBDLabelValuePair {
public Object getValue() {
return value;
}
@Override
public String toString() {
return value + " (" + label + ")";
}
@Override
public int compareTo(Object o) {
if (o instanceof DBDLabelValuePair) {
final DBDLabelValuePair lvp = (DBDLabelValuePair) o;
if (value == lvp.value) {
return 0;
}
if (value == null) {
return -1;
}
if (lvp.value == null) {
return 1;
}
if (value instanceof Comparable && lvp.value instanceof Comparable) {
return ((Comparable) value).compareTo(lvp.value);
}
}
return 0;
}
}
......@@ -160,10 +160,11 @@ public abstract class JDBCTableColumn<TABLE_TYPE extends DBSEntity> extends JDBC
DBDValueHandler valueHandler = DBUtils.findValueHandler(session, this);
StringBuilder query = new StringBuilder();
query.append("SELECT DISTINCT ").append(DBUtils.getQuotedIdentifier(this));
String descColumns = DBVUtils.getDictionaryDescriptionColumns(session.getProgressMonitor(), this);
if (descColumns != null) {
query.append(", ").append(descColumns);
}
// Do not use description columns because they duplicate distinct value
// String descColumns = DBVUtils.getDictionaryDescriptionColumns(session.getProgressMonitor(), this);
// if (descColumns != null) {
// query.append(", ").append(descColumns);
// }
query.append(" FROM ").append(DBUtils.getObjectFullName(getTable()));
try (DBCStatement dbStat = session.prepareStatement(DBCStatementType.QUERY, query.toString(), false, false, false)) {
......
......@@ -20,7 +20,6 @@ package org.jkiss.dbeaver.model.impl.jdbc.struct;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPSaveableObject;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeValue;
......@@ -38,6 +37,7 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
import org.jkiss.dbeaver.model.struct.DBSEntityConstraintType;
import org.jkiss.dbeaver.model.virtual.DBVUtils;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
......@@ -50,8 +50,6 @@ public abstract class JDBCTableConstraint<TABLE extends JDBCTable>
extends AbstractTableConstraint<TABLE>
implements DBSConstraintEnumerable, DBPSaveableObject
{
private static final Log log = Log.getLog(JDBCTableConstraint.class);
private boolean persisted;
protected JDBCTableConstraint(TABLE table, String name, @Nullable String description, DBSEntityConstraintType constraintType, boolean persisted) {
......@@ -170,6 +168,23 @@ public abstract class JDBCTableConstraint<TABLE extends JDBCTable>
keyPattern = keyPattern.toString() + "%";
}
if (keyPattern != null) {
if (keyPattern instanceof Number) {
// Subtract gap value to see some values before specified
int gapSize = maxResults / 2;
if (keyPattern instanceof Integer) {
keyPattern = (Integer) keyPattern - gapSize;
} else if (keyPattern instanceof Short) {
keyPattern = (Short) keyPattern - gapSize;
} else if (keyPattern instanceof Long) {
keyPattern = (Long) keyPattern - gapSize;
} else if (keyPattern instanceof Float) {
keyPattern = (Float) keyPattern - gapSize;
} else if (keyPattern instanceof Double) {
keyPattern = (Double) keyPattern - gapSize;
} else if (keyPattern instanceof BigInteger) {
keyPattern = ((BigInteger) keyPattern).subtract(BigInteger.valueOf(gapSize));
}
}
keyValueHandler.bindValueObject(session, dbStat, keyColumn, paramPos++, keyPattern);
}
......
......@@ -46,7 +46,6 @@ import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -148,6 +147,11 @@ public final class SQLUtils {
return false;
}
public static boolean isLikePattern(String like)
{
return like.indexOf('%') != -1;// || like.indexOf('_') != -1;
}
public static String makeLikePattern(String like)
{
return like.replace("%", ".*").replace("_", ".?");
......
......@@ -17,6 +17,7 @@
*/
package org.jkiss.dbeaver.model.struct;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.utils.CommonUtils;
......@@ -36,8 +37,8 @@ public class DBSObjectFilter
private List<String> include;
private List<String> exclude;
private transient List<Pattern> includePatterns = null;
private transient List<Pattern> excludePatterns = null;
private transient List<Object> includePatterns = null;
private transient List<Object> excludePatterns = null;
public DBSObjectFilter()
{
......@@ -156,16 +157,15 @@ public class DBSObjectFilter
includePatterns = new ArrayList<>(include.size());
for (String inc : include) {
if (!inc.isEmpty()) {
includePatterns.add(Pattern.compile(
SQLUtils.makeLikePattern(inc), Pattern.CASE_INSENSITIVE | Pattern.MULTILINE));
includePatterns.add(makePattern(inc));
}
}
}
if (includePatterns != null) {
// Match includes (at least one should match)
boolean matched = false;
for (Pattern pattern : includePatterns) {
if (pattern.matcher(name).matches()) {
for (Object pattern : includePatterns) {
if (matchesPattern(pattern, name)) {
matched = true;
break;
}
......@@ -179,15 +179,14 @@ public class DBSObjectFilter
excludePatterns = new ArrayList<>(exclude.size());
for (String exc : exclude) {
if (!exc.isEmpty()) {
excludePatterns.add(Pattern.compile(
SQLUtils.makeLikePattern(exc), Pattern.CASE_INSENSITIVE | Pattern.MULTILINE));
excludePatterns.add(makePattern(exc));
}
}
}
if (excludePatterns != null) {
// Match excludes
for (Pattern pattern : excludePatterns) {
if (pattern.matcher(name).matches()) {
for (Object pattern : excludePatterns) {
if (matchesPattern(pattern, name)) {
return false;
}
}
......@@ -196,4 +195,22 @@ public class DBSObjectFilter
return true;
}
private static boolean matchesPattern(Object pattern, String name) {
if (pattern instanceof Pattern) {
return ((Pattern)pattern).matcher(name).matches();
} else {
return ((String)pattern).equalsIgnoreCase(name);
}
}
@NotNull
private static Object makePattern(String str) {
if (SQLUtils.isLikePattern(str)) {
return Pattern.compile(
SQLUtils.makeLikePattern(str), Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
} else {
return str;
}
}
}
......@@ -139,11 +139,14 @@ public abstract class DBVUtils {
public static String getDictionaryDescriptionColumns(DBRProgressMonitor monitor, DBSEntityAttribute attribute) throws DBException {
DBVEntity dictionary = DBVUtils.findVirtualEntity(attribute.getParentObject(), false);
String descColumns = null;
if (dictionary != null) {
return dictionary.getDescriptionColumnNames();
} else {
return DBVEntity.getDefaultDescriptionColumn(monitor, attribute);
descColumns = dictionary.getDescriptionColumnNames();
}
if (descColumns == null) {
descColumns = DBVEntity.getDefaultDescriptionColumn(monitor, attribute);
}
return descColumns;
}
@NotNull
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册