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

Reply via email to