diff --git a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls index 15b44aa3f7..2d10cea359 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls @@ -49,7 +49,7 @@ type SQLContextInfo { } input SQLDataFilterConstraint { - attribute: String! + attributePosition: Int! orderPosition: Int orderAsc: Boolean 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 55d38440a4..fef40b1580 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 @@ -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 emptyConstraints) throws DBException { - Map> dbdConstraintByAttributeName = mapConstraintsByLabel(emptyConstraints); for (WebSQLDataFilterConstraint webConstr : constraints) { - DBDAttributeConstraint dbConstr; - if (dbdConstraintByAttributeName.containsKey(webConstr.getAttribute())) { - List 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> mapConstraintsByLabel(@NotNull List constraints) { - Map > 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); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilterConstraint.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilterConstraint.java index 0132510e22..c6f9a6d001 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilterConstraint.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLDataFilterConstraint.java @@ -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 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() {