From f7968ac57a30ee87575d8c05779654d9bd716aec Mon Sep 17 00:00:00 2001 From: Serge Rider Date: Thu, 30 Sep 2021 15:30:15 +0300 Subject: [PATCH] CB-1157 Use result info to detect proper attribute data type --- .../service/sql/WebSQLDataFilter.java | 7 ++++-- .../service/sql/WebSQLResultsInfo.java | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilter.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilter.java index 12516f5269..7939029b84 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilter.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilter.java @@ -23,9 +23,9 @@ import org.jkiss.dbeaver.model.data.DBDAttributeConstraint; import org.jkiss.dbeaver.model.data.DBDDataFilter; import org.jkiss.dbeaver.model.exec.DBCLogicalOperator; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; +import org.jkiss.dbeaver.model.struct.DBSAttributeBase; import org.jkiss.dbeaver.model.struct.DBSDataContainer; import org.jkiss.dbeaver.model.struct.DBSEntity; -import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.ArrayList; @@ -108,7 +108,10 @@ public class WebSQLDataFilter { for (WebSQLDataFilterConstraint webConstr : constraints) { DBDAttributeConstraint dbConstraint; if (dataContainer instanceof DBSEntity) { - DBSEntityAttribute attribute = ((DBSEntity) dataContainer).getAttribute(monitor, webConstr.getAttribute()); + DBSAttributeBase attribute = ((DBSEntity) dataContainer).getAttribute(monitor, webConstr.getAttribute()); + if (attribute == null && resultInfo != null) { + attribute = resultInfo.getAttribute(webConstr.getAttribute()); + } if (attribute == null) { dbConstraint = new DBDAttributeConstraint(webConstr.getAttribute(), -1); } else { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultsInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultsInfo.java index e688728990..c6eef050cd 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultsInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLResultsInfo.java @@ -18,10 +18,15 @@ package io.cloudbeaver.service.sql; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; +import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.data.DBDAttributeBinding; import org.jkiss.dbeaver.model.data.DBDRowIdentifier; +import org.jkiss.dbeaver.model.struct.DBSAttributeBase; import org.jkiss.dbeaver.model.struct.DBSDataContainer; +import java.util.List; + /** * Web query results info. */ @@ -67,4 +72,24 @@ public class WebSQLResultsInfo { return null; } + public DBSAttributeBase getAttribute(String attributeName) { + DBPDataSource dataSource = dataContainer.getDataSource(); + + DBDAttributeBinding[] attrList = attributes; + DBDAttributeBinding binding = null; + for (String san : attributeName.split("\\.")) { + if (dataSource != null) { + san = DBUtils.getUnQuotedIdentifier(dataSource, san); + } + binding = DBUtils.findObject(attrList, san); + if (binding == null) { + return null; + } + List nestedBindings = binding.getNestedBindings(); + if (nestedBindings != null && !nestedBindings.isEmpty()) { + attrList = nestedBindings.toArray(new DBDAttributeBinding[0]); + } + } + return binding == null ? null : binding.getAttribute(); + } }