diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/DBSEntityAssociationLazy.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/DBSEntityAssociationLazy.java new file mode 100644 index 0000000000000000000000000000000000000000..06dba766322f39f21b759d7b6c78dabc9da2b25c --- /dev/null +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/struct/DBSEntityAssociationLazy.java @@ -0,0 +1,32 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jkiss.dbeaver.model.struct; + +import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; + +/** + * DBSEntityAssociationLazy + */ +public interface DBSEntityAssociationLazy extends DBSEntityAssociation { + + @Nullable + DBSEntityConstraint getReferencedConstraint(DBRProgressMonitor monitor) throws DBException; + + DBSEntity getAssociatedEntity(DBRProgressMonitor monitor) throws DBException; +} \ No newline at end of file diff --git a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java index 90224e26083fcaecdb054e3fea540e8a292906c0..ec290b0583fb80157396f9a5a8434b34279a7fd8 100644 --- a/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java +++ b/plugins/org.jkiss.dbeaver.model/src/org/jkiss/dbeaver/model/virtual/DBVEntityForeignKey.java @@ -38,7 +38,7 @@ import java.util.List; /** * Virtual foreign key */ -public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityReferrer, DBSTableForeignKey { +public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityAssociationLazy, DBSEntityReferrer, DBSTableForeignKey { private static final Log log = Log.getLog(DBVEntityForeignKey.class); @@ -68,6 +68,12 @@ public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityReferr } } + @NotNull + @Override + public DBSEntityConstraint getReferencedConstraint(DBRProgressMonitor monitor) throws DBException { + return getRealReferenceConatraint(monitor); + } + public String getRefEntityId() { return refEntityId; } @@ -119,6 +125,11 @@ public class DBVEntityForeignKey implements DBSEntityConstraint, DBSEntityReferr return getReferencedConstraint().getParentObject(); } + @Override + public DBSEntity getAssociatedEntity(DBRProgressMonitor monitor) throws DBException { + return getReferencedConstraint(monitor).getParentObject(); + } + @Override public List getAttributeReferences(@Nullable DBRProgressMonitor monitor) throws DBException { return attributes; diff --git a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/ReferenceValueEditor.java b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/ReferenceValueEditor.java index 7fdbe389b47206ce0c393b03ea1b3b7be652c9ab..ea06937f0948db45244bd5c346f9f57914ab5411 100644 --- a/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/ReferenceValueEditor.java +++ b/plugins/org.jkiss.dbeaver.ui.editors.data/src/org/jkiss/dbeaver/ui/data/editors/ReferenceValueEditor.java @@ -34,8 +34,6 @@ import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.*; -import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose; -import org.jkiss.dbeaver.model.exec.DBCSession; import org.jkiss.dbeaver.model.navigator.DBNDatabaseNode; import org.jkiss.dbeaver.model.navigator.DBNUtils; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; @@ -44,14 +42,14 @@ import org.jkiss.dbeaver.model.runtime.load.AbstractLoadService; import org.jkiss.dbeaver.model.struct.*; import org.jkiss.dbeaver.ui.LoadingJob; import org.jkiss.dbeaver.ui.UIUtils; -import org.jkiss.dbeaver.ui.controls.resultset.internal.ResultSetMessages; -import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerObjectOpen; import org.jkiss.dbeaver.ui.controls.ProgressLoaderVisualizer; +import org.jkiss.dbeaver.ui.controls.resultset.internal.ResultSetMessages; import org.jkiss.dbeaver.ui.data.IAttributeController; import org.jkiss.dbeaver.ui.data.IValueController; import org.jkiss.dbeaver.ui.data.IValueEditor; import org.jkiss.dbeaver.ui.editors.data.DatabaseDataEditor; import org.jkiss.dbeaver.ui.editors.object.struct.EditDictionaryPage; +import org.jkiss.dbeaver.ui.navigator.actions.NavigatorHandlerObjectOpen; import org.jkiss.utils.CommonUtils; import java.lang.reflect.InvocationTargetException; @@ -106,16 +104,28 @@ public class ReferenceValueEditor { if (entityAttribute != null) { List refs = DBUtils.getAttributeReferrers(new VoidProgressMonitor(), entityAttribute, true); DBSEntityReferrer constraint = refs.isEmpty() ? null : refs.get(0); - if (constraint instanceof DBSEntityAssociation && - ((DBSEntityAssociation)constraint).getAssociatedEntity() instanceof DBSDictionary) - { - final DBSDictionary dictionary = (DBSDictionary) ((DBSEntityAssociation) constraint).getAssociatedEntity(); - if (dictionary != null && dictionary.supportsDictionaryEnumeration()) { + + DBSEntity[] associatedEntity = new DBSEntity[1]; + if (constraint instanceof DBSEntityAssociationLazy) { + UIUtils.runInProgressService(monitor -> { + try { + associatedEntity[0] = ((DBSEntityAssociationLazy) constraint).getAssociatedEntity(monitor); + } catch (DBException e) { + throw new InvocationTargetException(e); + } + }); + } else if (constraint instanceof DBSEntityAssociation) { + associatedEntity[0] = ((DBSEntityAssociation) constraint).getAssociatedEntity(); + } + + if (associatedEntity[0] instanceof DBSDictionary) { + final DBSDictionary dictionary = (DBSDictionary)associatedEntity[0]; + if (dictionary.supportsDictionaryEnumeration()) { return constraint; } } } - } catch (DBException e) { + } catch (Throwable e) { log.error(e); } return null; @@ -240,7 +250,7 @@ public class ReferenceValueEditor { if (curTextValue.equalsIgnoreCase(item.getText(0)) || curTextValue.equalsIgnoreCase(item.getText(1))) { editorSelector.select(editorSelector.indexOf(item)); editorSelector.showItem(item); - editorSelector.setTopIndex(i); + //editorSelector.setTopIndex(i); valueFound = true; break; }