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 ecd018c4fd..e5add31a37 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 @@ -16,9 +16,16 @@ */ package io.cloudbeaver.service.sql; +import org.jkiss.dbeaver.DBException; +import org.jkiss.dbeaver.model.DBPEvaluationContext; +import org.jkiss.dbeaver.model.DBUtils; 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.DBSDataContainer; +import org.jkiss.dbeaver.model.struct.DBSEntity; +import org.jkiss.dbeaver.model.struct.DBSEntityAttribute; import org.jkiss.utils.CommonUtils; import java.util.ArrayList; @@ -89,13 +96,20 @@ public class WebSQLDataFilter { return where; } - public DBDDataFilter makeDataFilter() { + public DBDDataFilter makeDataFilter(DBRProgressMonitor monitor, DBSDataContainer dataContainer) throws DBException { DBDDataFilter dataFilter = new DBDDataFilter(); dataFilter.setWhere(where); if (!CommonUtils.isEmpty(constraints)) { + if (!(dataContainer instanceof DBSEntity)) { + throw new DBException("Cannot apply filter criteria to non-entity data container"); + } List dbdConstraints = new ArrayList<>(); for (WebSQLDataFilterConstraint webConstr : constraints) { - DBDAttributeConstraint dbConstraint = new DBDAttributeConstraint(webConstr.getAttribute(), -1); + DBSEntityAttribute attribute = ((DBSEntity) dataContainer).getAttribute(monitor, webConstr.getAttribute()); + if (attribute == null) { + throw new DBException("Attribute '" + webConstr.getAttribute() + "' not found in '" + DBUtils.getObjectFullName(dataContainer, DBPEvaluationContext.UI) + "'"); + } + DBDAttributeConstraint dbConstraint = new DBDAttributeConstraint(attribute, -1); if (webConstr.getOrderPosition() != null) { dbConstraint.setOrderPosition(webConstr.getOrderPosition()); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java index 07a9caa7b8..c64cd90374 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java @@ -25,6 +25,7 @@ import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataKind; +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.DBDDataFilter; @@ -154,22 +155,22 @@ public class WebSQLProcessor { DBCExecutionContext context = getExecutionContext(dataContainer); - { - DBDDataFilter dataFilter = filter.makeDataFilter(); - if (dataFilter.hasFilters()) { - sql = context.getDataSource().getSQLDialect().addFiltersToQuery( - monitor, - context.getDataSource(), - sql, - dataFilter); - } - } - - final WebSQLDataFilter dataFilter = filter; - final String sqlQueryText = sql; - SQLQuery sqlQuery = new SQLQuery(context.getDataSource(), sqlQueryText); - try { + { + DBDDataFilter dataFilter = filter.makeDataFilter(monitor, dataContainer); + if (dataFilter.hasFilters()) { + sql = context.getDataSource().getSQLDialect().addFiltersToQuery( + monitor, + context.getDataSource(), + sql, + dataFilter); + } + } + + final WebSQLDataFilter dataFilter = filter; + final String sqlQueryText = sql; + SQLQuery sqlQuery = new SQLQuery(context.getDataSource(), sqlQueryText); + DBExecUtils.tryExecuteRecover(monitor, connection.getDataSource(), param -> { try (DBCSession session = context.openSession(monitor, DBCExecutionPurpose.USER, "Execute SQL")) { AbstractExecutionSource source = new AbstractExecutionSource( @@ -216,7 +217,7 @@ public class WebSQLProcessor { WebSQLExecuteInfo executeInfo = new WebSQLExecuteInfo(); DBCExecutionContext executionContext = getExecutionContext(dataContainer); - DBDDataFilter dataFilter = filter.makeDataFilter(); + DBDDataFilter dataFilter = filter.makeDataFilter(monitor, dataContainer); DBExecUtils.tryExecuteRecover(monitor, connection.getDataSource(), param -> { try (DBCSession session = executionContext.openSession(monitor, DBCExecutionPurpose.USER, "Read data from container")) { try (WebSQLQueryDataReceiver dataReceiver = new WebSQLQueryDataReceiver(contextInfo, dataContainer, dataFormat)) { @@ -235,6 +236,7 @@ public class WebSQLProcessor { WebSQLQueryResultSet resultSet = dataReceiver.getResultSet(); results.setResultSet(resultSet); executeInfo.setResults(new WebSQLQueryResults[]{results}); + setResultFilterText(dataContainer, session.getDataSource(), executeInfo, filter); if (resultSet != null && resultSet.getRows() != null) { executeInfo.setStatusMessage(resultSet.getRows().length + " row(s) fetched"); @@ -508,9 +510,18 @@ public class WebSQLProcessor { executeInfo.setResults(resultList.toArray(new WebSQLQueryResults[0])); + setResultFilterText(dataContainer, dbStat.getSession().getDataSource(), executeInfo, filter); + } + + private void setResultFilterText(@NotNull DBSDataContainer dataContainer, @NotNull DBPDataSource dataSource, @NotNull WebSQLExecuteInfo executeInfo, @NotNull WebSQLDataFilter filter) throws DBException { if (!filter.getConstraints().isEmpty() || !CommonUtils.isEmpty(filter.getWhere())) { StringBuilder where = new StringBuilder(); - SQLUtils.appendConditionString(filter.makeDataFilter(), dbStat.getSession().getDataSource(), null, where, true); + SQLUtils.appendConditionString( + filter.makeDataFilter(webSession.getProgressMonitor(), dataContainer), + dataSource, + null, + where, + true); executeInfo.setFilterText(where.toString()); } } diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java index c5c4559b7e..1182c0f3c3 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java @@ -207,7 +207,9 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { exporter, properties); - DatabaseTransferProducer producer = new DatabaseTransferProducer(dataContainer, parameters.getFilter() == null ? null : parameters.getFilter().makeDataFilter()); + DatabaseTransferProducer producer = new DatabaseTransferProducer( + dataContainer, + parameters.getFilter() == null ? null : parameters.getFilter().makeDataFilter(monitor, dataContainer)); DatabaseProducerSettings producerSettings = new DatabaseProducerSettings(); producerSettings.setExtractType(DatabaseProducerSettings.ExtractType.SINGLE_QUERY); producerSettings.setQueryRowCount(false);