QPID-8104: [Broker-J] [Query] Generalise the implementation so that aliases may appear within expressions within the order-by clause
(cherry picked from commit 38819bcac6dc5481357d2c05aaf281e7c83532fe) Project: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/commit/7c69d170 Tree: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/tree/7c69d170 Diff: http://git-wip-us.apache.org/repos/asf/qpid-broker-j/diff/7c69d170 Branch: refs/heads/7.0.x Commit: 7c69d1704b26064da9831a1c076fa0d3d43e6db8 Parents: 40f1b09 Author: Keith Wall <kw...@apache.org> Authored: Fri Feb 23 09:21:04 2018 +0000 Committer: Alex Rudyy <oru...@apache.org> Committed: Mon Feb 26 16:28:13 2018 +0000 ---------------------------------------------------------------------- .../qpid/server/filter/OrderByExpression.java | 10 ------ .../servlet/query/ConfiguredObjectQuery.java | 33 +++++++++++++------- .../query/ConfiguredObjectQueryTest.java | 18 +++++++++++ 3 files changed, 39 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/7c69d170/broker-core/src/main/java/org/apache/qpid/server/filter/OrderByExpression.java ---------------------------------------------------------------------- diff --git a/broker-core/src/main/java/org/apache/qpid/server/filter/OrderByExpression.java b/broker-core/src/main/java/org/apache/qpid/server/filter/OrderByExpression.java index 20120dc..87d45d1 100644 --- a/broker-core/src/main/java/org/apache/qpid/server/filter/OrderByExpression.java +++ b/broker-core/src/main/java/org/apache/qpid/server/filter/OrderByExpression.java @@ -58,14 +58,4 @@ public class OrderByExpression implements Expression { return ((Number)((ConstantExpression)_expression).getValue()).intValue(); } - - public boolean isNamed() - { - return (_expression instanceof NamedExpression); - } - - public String getName() - { - return ((NamedExpression) _expression).getName(); - } } http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/7c69d170/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java ---------------------------------------------------------------------- diff --git a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java index 1b22da0..f06051d 100644 --- a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java +++ b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQuery.java @@ -266,9 +266,8 @@ public final class ConfiguredObjectQuery private final List<OrderByExpression> _orderByExpressions; public OrderByComparator(final List<OrderByExpression> orderByExpressions, - final HeadersAndValueExpressions headersAndValue) + final List<Expression> valueExpressions) { - final List<Expression> valueExpressions = headersAndValue.getValueExpressions(); _orderByExpressions = new ArrayList<>(orderByExpressions); for (ListIterator<OrderByExpression> iterator = _orderByExpressions.listIterator(); iterator.hasNext(); ) { @@ -287,12 +286,6 @@ public final class ConfiguredObjectQuery iterator.set(orderByExpression); } } - else if (orderByExpression.isNamed() && headersAndValue.hasHeader(orderByExpression.getName())) - { - Expression expression = headersAndValue.getValueExpressionForHeader(orderByExpression.getName()); - orderByExpression = new OrderByExpression(expression, orderByExpression.getOrder()); - iterator.set(orderByExpression); - } } } @@ -343,19 +336,35 @@ public final class ConfiguredObjectQuery final String orderByClause, final HeadersAndValueExpressions headersAndValue) { - List<OrderByExpression> orderByExpressions = parseOrderByClause(orderByClause); + List<OrderByExpression> orderByExpressions = parseOrderByClause(orderByClause, headersAndValue); List<ConfiguredObject<?>> orderedObjects = new ArrayList<>(unorderedResults.size()); orderedObjects.addAll(unorderedResults); - Comparator<Object> comparator = new OrderByComparator(orderByExpressions, headersAndValue); + Comparator<Object> comparator = new OrderByComparator(orderByExpressions, headersAndValue.getValueExpressions()); Collections.sort(orderedObjects, comparator); return orderedObjects; } - private List<OrderByExpression> parseOrderByClause(final String orderByClause) + private List<OrderByExpression> parseOrderByClause(final String orderByClause, + final HeadersAndValueExpressions headersAndValue) { final List<OrderByExpression> orderByExpressions; ConfiguredObjectFilterParser parser = new ConfiguredObjectFilterParser(); - parser.setConfiguredObjectExpressionFactory(_expressionFactory); + parser.setConfiguredObjectExpressionFactory(new ConfiguredObjectExpressionFactory() + { + @Override + public ConfiguredObjectExpression createConfiguredObjectExpression(final String propertyName) + { + if (headersAndValue.hasHeader(propertyName)) + { + Expression expression = headersAndValue.getValueExpressionForHeader(propertyName); + return object -> expression.evaluate(object); + } + else + { + return super.createConfiguredObjectExpression(propertyName); + } + } + }); try { orderByExpressions = parser.parseOrderBy(orderByClause); http://git-wip-us.apache.org/repos/asf/qpid-broker-j/blob/7c69d170/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java ---------------------------------------------------------------------- diff --git a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java index b903a41..a660ec7 100644 --- a/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java +++ b/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/servlet/query/ConfiguredObjectQueryTest.java @@ -568,6 +568,24 @@ public class ConfiguredObjectQueryTest extends QpidTestCase assertQueryResults(new Object[][]{{1}, {2}, {4}}, _query.getResults()); } + public void testExpressionToTermsOfAliasInOrderByClause() + { + _objects.add(createCO(new HashMap<String, Object>() + {{ + put("foo1", "A"); + put("foo2", "B"); + }})); + + _objects.add(createCO(new HashMap<String, Object>() + {{ + put("foo1", "A"); + put("foo2", "A"); + }})); + + _query = new ConfiguredObjectQuery(_objects, "foo1 AS bar1, foo2", null, "CONCAT(bar, foo2) ASC"); + assertQueryResults(new Object[][]{{"A", "A"}, {"A", "B"}}, _query.getResults()); + } + public void testDelimitedAliasInOrderByClause() { _objects.add(createCO(new HashMap<String, Object>() --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org