Merge pull request #655 from dbeaver/feature/CB-1569

CB-1569 use column position for order
This commit is contained in:
Serge Rider
2022-02-16 15:20:06 +03:00
committed by GitHub
3 changed files with 11 additions and 36 deletions
@@ -49,7 +49,7 @@ type SQLContextInfo {
}
input SQLDataFilterConstraint {
attribute: String!
attributePosition: Int!
orderPosition: Int
orderAsc: Boolean
@@ -19,7 +19,6 @@ package io.cloudbeaver.service.sql;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.data.DBDAttributeBindingMeta;
import org.jkiss.dbeaver.model.data.DBDAttributeConstraint;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
import org.jkiss.dbeaver.model.exec.DBCLogicalOperator;
@@ -133,45 +132,21 @@ public class WebSQLDataFilter {
result = Arrays.asList(resultInfo.getAttributes());
}
return result.stream()
.map(attribute -> new DBDAttributeConstraint(attribute, -1))
.collect(Collectors.toList());
.filter(attribute -> attribute.getOrdinalPosition() >= 0)
.map(attribute -> new DBDAttributeConstraint(attribute, -1))
.collect(Collectors.toList());
}
private void fillEmptyConstrains(@NotNull List<DBDAttributeConstraint> emptyConstraints) throws DBException {
Map<String, List<DBDAttributeConstraint>> dbdConstraintByAttributeName = mapConstraintsByLabel(emptyConstraints);
for (WebSQLDataFilterConstraint webConstr : constraints) {
DBDAttributeConstraint dbConstr;
if (dbdConstraintByAttributeName.containsKey(webConstr.getAttribute())) {
List<DBDAttributeConstraint> constraintsWithSameName = dbdConstraintByAttributeName.get(webConstr.getAttribute());
if (constraintsWithSameName.size() > 1) {
throw new DBException(MessageFormat.format("Column ''{0}'' in order clause is ambiguous", webConstr.getAttribute()));
}
dbConstr = constraintsWithSameName.get(0);
} else {
dbConstr = new DBDAttributeConstraint(webConstr.getAttribute(), -1);
emptyConstraints.add(dbConstr);
if(webConstr.getAttributePosition() >= emptyConstraints.size()) {
throw new DBException(MessageFormat.format("Incorrect column position ''{0}'' in order clause", webConstr.getAttributePosition()));
}
DBDAttributeConstraint dbConstr = emptyConstraints.get(webConstr.getAttributePosition());
fillEmptyConstraint(dbConstr, webConstr);
}
}
@NotNull
private Map<String, List<DBDAttributeConstraint>> mapConstraintsByLabel(@NotNull List<DBDAttributeConstraint> constraints) {
Map <String, List<DBDAttributeConstraint>> dbdConstraintByLabel = new HashMap<>();
for (DBDAttributeConstraint constraint : constraints) {
String attributeName;
DBSAttributeBase attributeBase = constraint.getAttribute();
if (attributeBase instanceof DBDAttributeBindingMeta) {
attributeName = ((DBDAttributeBindingMeta) attributeBase).getLabel();
} else {
attributeName = constraint.getAttributeName();
}
dbdConstraintByLabel.computeIfAbsent(attributeName, k -> new ArrayList<>()).add(constraint);
}
return dbdConstraintByLabel;
}
private DBDAttributeConstraint fillEmptyConstraint(@NotNull DBDAttributeConstraint dbConstr,
@NotNull WebSQLDataFilterConstraint webConstr) {
dbConstr.setPlainNameReference(true);
@@ -25,7 +25,7 @@ import java.util.Map;
*/
public class WebSQLDataFilterConstraint {
private String attribute;
private Integer attributePosition;
private Integer orderPosition;
private Boolean orderAsc;
@@ -34,7 +34,7 @@ public class WebSQLDataFilterConstraint {
private Object value;
public WebSQLDataFilterConstraint(Map<String, Object> map) {
this.attribute = CommonUtils.toString(map.get("attribute"));
this.attributePosition = CommonUtils.toInt(map.get("attributePosition"));
this.orderPosition = map.containsKey("orderPosition") ?
CommonUtils.toInt(map.get("orderPosition")) + 1 : // Use position + 1 because 0 means no ordering (because of legacy compatibility)
null;
@@ -45,8 +45,8 @@ public class WebSQLDataFilterConstraint {
this.value = CommonUtils.toString(map.get("value"), null);
}
public String getAttribute() {
return attribute;
public Integer getAttributePosition() {
return attributePosition;
}
public Integer getOrderPosition() {