From 19f8c8b6a6581bc6d366cb137300ec647f640b02 Mon Sep 17 00:00:00 2001 From: Alexander Skoblikov Date: Tue, 15 Feb 2022 18:49:37 +0300 Subject: [PATCH 1/2] CB-1569 use column position for order --- .../schema/service.sql.graphqls | 2 +- .../service/sql/WebSQLDataFilter.java | 31 ++----------------- .../sql/WebSQLDataFilterConstraint.java | 8 ++--- 3 files changed, 8 insertions(+), 33 deletions(-) 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..8720155f45 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 @@ -138,40 +138,15 @@ public class WebSQLDataFilter { } 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() { From 4c15292dfdded04f4ce338c06d761a092f44556f Mon Sep 17 00:00:00 2001 From: Alexander Skoblikov Date: Tue, 15 Feb 2022 21:47:51 +0300 Subject: [PATCH 2/2] CB-1569 skip tech columns in sorting --- .../src/io/cloudbeaver/service/sql/WebSQLDataFilter.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 8720155f45..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,8 +132,9 @@ 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 {