CB-974 Filter constraints handle fix + text in execution results

This commit is contained in:
Serge Rider
2021-05-25 11:29:02 +03:00
parent 91467aea56
commit 9155798e8b
3 changed files with 47 additions and 20 deletions
@@ -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<DBDAttributeConstraint> 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());
}
@@ -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());
}
}
@@ -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);