提交 9c4f69c3 编写于 作者: S Serge Rider

Dictionary/enum reading refactoring (support cross-database queries)


Former-commit-id: 4f1ee1c7
上级 70696a8e
......@@ -24,6 +24,7 @@ import org.jkiss.dbeaver.ModelPreferences;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.data.*;
import org.jkiss.dbeaver.model.exec.*;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCStatement;
import org.jkiss.dbeaver.model.impl.DBObjectNameCaseTransformer;
import org.jkiss.dbeaver.model.impl.data.ExecuteBatchImpl;
......@@ -554,7 +555,7 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
/**
* Returns prepared statements for enumeration fetch
* @param session execution context
* @param monitor execution context
* @param keyColumn enumeration column.
* @param keyPattern pattern for enumeration values. If null or empty then returns full enumration set
* @param preceedingKeys other constrain key values. May be null.
......@@ -565,7 +566,7 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
@NotNull
@Override
public List<DBDLabelValuePair> getDictionaryEnumeration(
@NotNull DBCSession session,
@NotNull DBRProgressMonitor monitor,
@NotNull DBSEntityAttribute keyColumn,
Object keyPattern,
List<DBDAttributeValue> preceedingKeys,
......@@ -576,7 +577,7 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
{
// Use default one
return readKeyEnumeration(
session,
monitor,
keyColumn,
keyPattern,
preceedingKeys,
......@@ -588,19 +589,19 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
@NotNull
@Override
public List<DBDLabelValuePair> getDictionaryValues(
@NotNull DBCSession session,
@NotNull DBRProgressMonitor monitor,
@NotNull DBSEntityAttribute keyColumn,
@NotNull List<Object> keyValues,
@Nullable List<DBDAttributeValue> preceedingKeys,
boolean sortByValue,
boolean sortAsc) throws DBException
{
DBDValueHandler keyValueHandler = DBUtils.findValueHandler(session, keyColumn);
DBDValueHandler keyValueHandler = DBUtils.findValueHandler(keyColumn.getDataSource(), keyColumn);
StringBuilder query = new StringBuilder();
query.append("SELECT ").append(DBUtils.getQuotedIdentifier(keyColumn));
String descColumns = DBVUtils.getDictionaryDescriptionColumns(session.getProgressMonitor(), keyColumn);
String descColumns = DBVUtils.getDictionaryDescriptionColumns(monitor, keyColumn);
if (descColumns != null) {
query.append(", ").append(descColumns);
}
......@@ -633,30 +634,32 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
query.append(" DESC");
}
try (DBCStatement dbStat = session.prepareStatement(DBCStatementType.QUERY, query.toString(), false, false, false)) {
int paramPos = 0;
if (preceedingKeys != null && !preceedingKeys.isEmpty()) {
for (DBDAttributeValue precAttribute : preceedingKeys) {
DBDValueHandler precValueHandler = DBUtils.findValueHandler(session, precAttribute.getAttribute());
precValueHandler.bindValueObject(session, dbStat, precAttribute.getAttribute(), paramPos++, precAttribute.getValue());
try (JDBCSession session = DBUtils.openUtilSession(monitor, this, "Load dictionary values")) {
try (DBCStatement dbStat = session.prepareStatement(DBCStatementType.QUERY, query.toString(), false, false, false)) {
int paramPos = 0;
if (preceedingKeys != null && !preceedingKeys.isEmpty()) {
for (DBDAttributeValue precAttribute : preceedingKeys) {
DBDValueHandler precValueHandler = DBUtils.findValueHandler(session, precAttribute.getAttribute());
precValueHandler.bindValueObject(session, dbStat, precAttribute.getAttribute(), paramPos++, precAttribute.getValue());
}
}
}
for (Object value : keyValues) {
keyValueHandler.bindValueObject(session, dbStat, keyColumn, paramPos++, value);
}
dbStat.setLimit(0, keyValues.size());
if (dbStat.executeStatement()) {
try (DBCResultSet dbResult = dbStat.openResultSet()) {
return DBVUtils.readDictionaryRows(session, keyColumn, keyValueHandler, dbResult);
for (Object value : keyValues) {
keyValueHandler.bindValueObject(session, dbStat, keyColumn, paramPos++, value);
}
dbStat.setLimit(0, keyValues.size());
if (dbStat.executeStatement()) {
try (DBCResultSet dbResult = dbStat.openResultSet()) {
return DBVUtils.readDictionaryRows(session, keyColumn, keyValueHandler, dbResult);
}
} else {
return Collections.emptyList();
}
} else {
return Collections.emptyList();
}
}
}
private List<DBDLabelValuePair> readKeyEnumeration(
DBCSession session,
DBRProgressMonitor monitor,
DBSEntityAttribute keyColumn,
Object keyPattern,
List<DBDAttributeValue> preceedingKeys,
......@@ -669,7 +672,7 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
throw new IllegalArgumentException("Bad key column argument");
}
DBDValueHandler keyValueHandler = DBUtils.findValueHandler(session, keyColumn);
DBDValueHandler keyValueHandler = DBUtils.findValueHandler(keyColumn.getDataSource(), keyColumn);
boolean searchInKeys = keyPattern != null;
......@@ -721,10 +724,10 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
StringBuilder query = new StringBuilder();
query.append("SELECT ").append(DBUtils.getQuotedIdentifier(keyColumn));
String descColumns = DBVUtils.getDictionaryDescriptionColumns(session.getProgressMonitor(), keyColumn);
String descColumns = DBVUtils.getDictionaryDescriptionColumns(monitor, keyColumn);
Collection<DBSEntityAttribute> descAttributes = null;
if (descColumns != null) {
descAttributes = DBVEntity.getDescriptionColumns(session.getProgressMonitor(), this, descColumns);
descAttributes = DBVEntity.getDescriptionColumns(monitor, this, descColumns);
query.append(", ").append(descColumns);
}
query.append(" FROM ").append(DBUtils.getObjectFullName(this, DBPEvaluationContext.DML));
......@@ -791,38 +794,40 @@ public abstract class JDBCTable<DATASOURCE extends DBPDataSource, CONTAINER exte
query.append(" DESC");
}
try (DBCStatement dbStat = session.prepareStatement(DBCStatementType.QUERY, query.toString(), false, false, false)) {
int paramPos = 0;
try (JDBCSession session = DBUtils.openUtilSession(monitor, this, "Load attribute value enumeration")) {
try (DBCStatement dbStat = session.prepareStatement(DBCStatementType.QUERY, query.toString(), false, false, false)) {
int paramPos = 0;
if (preceedingKeys != null && !preceedingKeys.isEmpty()) {
for (DBDAttributeValue precAttribute : preceedingKeys) {
DBDValueHandler precValueHandler = DBUtils.findValueHandler(session, precAttribute.getAttribute());
precValueHandler.bindValueObject(session, dbStat, precAttribute.getAttribute(), paramPos++, precAttribute.getValue());
if (preceedingKeys != null && !preceedingKeys.isEmpty()) {
for (DBDAttributeValue precAttribute : preceedingKeys) {
DBDValueHandler precValueHandler = DBUtils.findValueHandler(session, precAttribute.getAttribute());
precValueHandler.bindValueObject(session, dbStat, precAttribute.getAttribute(), paramPos++, precAttribute.getValue());
}
}
}
if (keyPattern != null && searchInKeys) {
keyValueHandler.bindValueObject(session, dbStat, keyColumn, paramPos++,
keyColumn.getDataKind() == DBPDataKind.STRING ? "%" + keyPattern + "%" : keyPattern);
}
if (keyPattern != null && searchInKeys) {
keyValueHandler.bindValueObject(session, dbStat, keyColumn, paramPos++,
keyColumn.getDataKind() == DBPDataKind.STRING ? "%" + keyPattern + "%" : keyPattern);
}
if (searchInDesc) {
for (DBSEntityAttribute descAttr : descAttributes) {
if (descAttr.getDataKind() == DBPDataKind.STRING) {
final DBDValueHandler valueHandler = DBUtils.findValueHandler(session, descAttr);
valueHandler.bindValueObject(session, dbStat, descAttr, paramPos++,
descAttr.getDataKind() == DBPDataKind.STRING ? "%" + keyPattern + "%": keyPattern);
if (searchInDesc) {
for (DBSEntityAttribute descAttr : descAttributes) {
if (descAttr.getDataKind() == DBPDataKind.STRING) {
final DBDValueHandler valueHandler = DBUtils.findValueHandler(session, descAttr);
valueHandler.bindValueObject(session, dbStat, descAttr, paramPos++,
descAttr.getDataKind() == DBPDataKind.STRING ? "%" + keyPattern + "%" : keyPattern);
}
}
}
}
dbStat.setLimit(0, maxResults);
if (dbStat.executeStatement()) {
try (DBCResultSet dbResult = dbStat.openResultSet()) {
return DBVUtils.readDictionaryRows(session, keyColumn, keyValueHandler, dbResult);
dbStat.setLimit(0, maxResults);
if (dbStat.executeStatement()) {
try (DBCResultSet dbResult = dbStat.openResultSet()) {
return DBVUtils.readDictionaryRows(session, keyColumn, keyValueHandler, dbResult);
}
} else {
return Collections.emptyList();
}
} else {
return Collections.emptyList();
}
}
}
......
......@@ -21,7 +21,7 @@ import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.data.DBDAttributeValue;
import org.jkiss.dbeaver.model.data.DBDLabelValuePair;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.util.List;
......@@ -40,7 +40,7 @@ public interface DBSDictionary
/**
* Gets enumeration values
* @param session session
* @param monitor session
* @param keyColumn enumeration column.
* @param keyPattern pattern for enumeration values. If null or empty then returns full enumration set
* @param preceedingKeys other constrain key values. May be null.
......@@ -51,7 +51,7 @@ public interface DBSDictionary
*/
@NotNull
List<DBDLabelValuePair> getDictionaryEnumeration(
@NotNull DBCSession session,
@NotNull DBRProgressMonitor monitor,
@NotNull DBSEntityAttribute keyColumn,
Object keyPattern,
@Nullable List<DBDAttributeValue> preceedingKeys,
......@@ -62,7 +62,7 @@ public interface DBSDictionary
@NotNull
List<DBDLabelValuePair> getDictionaryValues(
@NotNull DBCSession session,
@NotNull DBRProgressMonitor monitor,
@NotNull DBSEntityAttribute keyColumn,
@NotNull List<Object> keyValues,
@Nullable List<DBDAttributeValue> preceedingKeys,
......
......@@ -602,19 +602,27 @@ public class DBVEntity extends DBVObject implements DBSEntity, DBPQualifiedObjec
@NotNull
@Override
public List<DBDLabelValuePair> getDictionaryEnumeration(@NotNull DBCSession session, @NotNull DBSEntityAttribute keyColumn, Object keyPattern, @Nullable List<DBDAttributeValue> preceedingKeys, boolean sortByValue, boolean sortAsc, int maxResults) throws DBException {
DBSEntity realEntity = getRealEntity(session.getProgressMonitor());
return realEntity instanceof DBSDictionary ?
((DBSDictionary) realEntity).getDictionaryEnumeration(session, keyColumn, keyPattern, preceedingKeys, sortByValue, sortAsc, maxResults) :
Collections.emptyList();
public List<DBDLabelValuePair> getDictionaryEnumeration(@NotNull DBRProgressMonitor monitor, @NotNull DBSEntityAttribute keyColumn, Object keyPattern, @Nullable List<DBDAttributeValue> preceedingKeys, boolean sortByValue, boolean sortAsc, int maxResults) throws DBException {
DBSEntity realEntity = getRealEntity(monitor);
if (realEntity instanceof DBSDictionary) {
return ((DBSDictionary) realEntity).getDictionaryEnumeration(
monitor,
keyColumn,
keyPattern,
preceedingKeys,
sortByValue,
sortAsc,
maxResults);
}
return Collections.emptyList();
}
@NotNull
@Override
public List<DBDLabelValuePair> getDictionaryValues(@NotNull DBCSession session, @NotNull DBSEntityAttribute keyColumn, @NotNull List<Object> keyValues, @Nullable List<DBDAttributeValue> preceedingKeys, boolean sortByValue, boolean sortAsc) throws DBException {
DBSEntity realEntity = getRealEntity(session.getProgressMonitor());
public List<DBDLabelValuePair> getDictionaryValues(@NotNull DBRProgressMonitor monitor, @NotNull DBSEntityAttribute keyColumn, @NotNull List<Object> keyValues, @Nullable List<DBDAttributeValue> preceedingKeys, boolean sortByValue, boolean sortAsc) throws DBException {
DBSEntity realEntity = getRealEntity(monitor);
return realEntity instanceof DBSDictionary ?
((DBSDictionary) realEntity).getDictionaryValues(session, keyColumn, keyValues, preceedingKeys, sortByValue, sortAsc) :
((DBSDictionary) realEntity).getDictionaryValues(monitor, keyColumn, keyValues, preceedingKeys, sortByValue, sortAsc) :
Collections.emptyList();
}
}
......@@ -39,7 +39,6 @@ import org.jkiss.dbeaver.model.data.DBDAttributeConstraint;
import org.jkiss.dbeaver.model.data.DBDDisplayFormat;
import org.jkiss.dbeaver.model.data.DBDLabelValuePair;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.exec.DBCExecutionPurpose;
import org.jkiss.dbeaver.model.exec.DBCLogicalOperator;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
......@@ -181,12 +180,12 @@ class GenericFilterValueEdit {
private void loadConstraintEnum(final DBSEntityReferrer refConstraint) {
loadJob = new KeyLoadJob("Load constraint '" + refConstraint.getName() + "' values") {
@Override
List<DBDLabelValuePair> readEnumeration(DBCSession session) throws DBException {
List<DBDLabelValuePair> readEnumeration(DBRProgressMonitor monitor) throws DBException {
final DBSEntityAttribute tableColumn = attr.getEntityAttribute();
if (tableColumn == null) {
return null;
}
final DBSEntityAttributeRef fkColumn = DBUtils.getConstraintAttribute(session.getProgressMonitor(), refConstraint, tableColumn);
final DBSEntityAttributeRef fkColumn = DBUtils.getConstraintAttribute(monitor, refConstraint, tableColumn);
if (fkColumn == null) {
return null;
}
......@@ -196,7 +195,7 @@ class GenericFilterValueEdit {
} else {
return null;
}
final DBSEntityAttribute refColumn = DBUtils.getReferenceAttribute(session.getProgressMonitor(), association, tableColumn, false);
final DBSEntityAttribute refColumn = DBUtils.getReferenceAttribute(monitor, association, tableColumn, false);
if (refColumn == null) {
return null;
}
......@@ -205,13 +204,13 @@ class GenericFilterValueEdit {
final DBSDictionary enumConstraint = (DBSDictionary) refConstraint.getParentObject();
if (fkAttribute != null && enumConstraint != null) {
return enumConstraint.getDictionaryEnumeration(
session,
refColumn,
filterPattern,
null,
true,
true,
MAX_MULTI_VALUES);
monitor,
refColumn,
filterPattern,
null,
true,
true,
MAX_MULTI_VALUES);
}
return null;
}
......@@ -226,8 +225,10 @@ class GenericFilterValueEdit {
tableViewer.getTable().getColumn(1).setText("Count");
loadJob = new KeyLoadJob("Load '" + attr.getName() + "' values") {
@Override
List<DBDLabelValuePair> readEnumeration(DBCSession session) throws DBException {
return attributeEnumerable.getValueEnumeration(session, filterPattern, MAX_MULTI_VALUES);
List<DBDLabelValuePair> readEnumeration(DBRProgressMonitor monitor) throws DBException {
try (DBCSession session = DBUtils.openUtilSession(monitor, attributeEnumerable, "Read value enumeration")) {
return attributeEnumerable.getValueEnumeration(session, filterPattern, MAX_MULTI_VALUES);
}
}
};
loadJob.schedule();
......@@ -382,8 +383,8 @@ class GenericFilterValueEdit {
if (executionContext == null) {
return Status.OK_STATUS;
}
try (DBCSession session = executionContext.openSession(monitor, DBCExecutionPurpose.UTIL, "Read value enumeration")) {
final List<DBDLabelValuePair> valueEnumeration = readEnumeration(session);
try {
final List<DBDLabelValuePair> valueEnumeration = readEnumeration(monitor);
if (valueEnumeration == null) {
return Status.OK_STATUS;
} else {
......@@ -397,7 +398,7 @@ class GenericFilterValueEdit {
}
@Nullable
abstract List<DBDLabelValuePair> readEnumeration(DBCSession session) throws DBException;
abstract List<DBDLabelValuePair> readEnumeration(DBRProgressMonitor monitor) throws DBException;
boolean mergeResultsWithData() {
return CommonUtils.isEmpty(filterPattern);
......
......@@ -491,27 +491,22 @@ public class ReferenceValueEditor {
final DBSEntityConstraint refConstraint = association.getReferencedConstraint();
final DBSDictionary enumConstraint = (DBSDictionary) refConstraint.getParentObject();
if (fkAttribute != null && enumConstraint != null) {
try (DBCSession session = valueController.getExecutionContext().openSession(
Collection<DBDLabelValuePair> enumValues = enumConstraint.getDictionaryEnumeration(
monitor,
DBCExecutionPurpose.UTIL,
NLS.bind(ResultSetMessages.dialog_value_view_context_name, fkAttribute.getName()))) {
Collection<DBDLabelValuePair> enumValues = enumConstraint.getDictionaryEnumeration(
session,
refColumn,
pattern,
precedingKeys,
sortByValue,
sortAsc,
200);
refColumn,
pattern,
precedingKeys,
sortByValue,
sortAsc,
200);
// for (DBDLabelValuePair pair : enumValues) {
// keyValues.put(pair.getValue(), pair.getLabel());
// }
if (monitor.isCanceled()) {
return null;
}
final DBDValueHandler colHandler = DBUtils.findValueHandler(session, fkAttribute);
return new EnumValuesData(enumValues, fkColumn, colHandler);
if (monitor.isCanceled()) {
return null;
}
final DBDValueHandler colHandler = DBUtils.findValueHandler(fkAttribute.getDataSource(), fkAttribute);
return new EnumValuesData(enumValues, fkColumn, colHandler);
}
} catch (DBException e) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册