mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-09-24 16:04:36 +08:00
Merge pull request #655 from dbeaver/feature/CB-1569
CB-1569 use column position for order
This commit is contained in:
@@ -49,7 +49,7 @@ type SQLContextInfo {
|
||||
}
|
||||
|
||||
input SQLDataFilterConstraint {
|
||||
attribute: String!
|
||||
attributePosition: Int!
|
||||
orderPosition: Int
|
||||
orderAsc: Boolean
|
||||
|
||||
|
||||
+6
-31
@@ -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);
|
||||
|
||||
+4
-4
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user