You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by va...@apache.org on 2022/07/11 09:15:16 UTC

[qpid-broker-j] branch main updated: QPID-8592: [Broker-J] Pass context value from parent query into the subquery (#130)

This is an automated email from the ASF dual-hosted git repository.

vavrtom pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git


The following commit(s) were added to refs/heads/main by this push:
     new 814473dafa QPID-8592: [Broker-J] Pass context value from parent query into the subquery (#130)
814473dafa is described below

commit 814473dafa189df8bef231d18c156a61375ab363
Author: Daniil Kirilyuk <da...@gmail.com>
AuthorDate: Mon Jul 11 11:15:11 2022 +0200

    QPID-8592: [Broker-J] Pass context value from parent query into the subquery (#130)
---
 broker-plugins/broker-query-engine/README.md       | 141 ++++++-
 broker-plugins/broker-query-engine/pom.xml         |   1 -
 .../src/main/grammar/ExpressionParser.jj           |   8 +-
 .../query/engine/evaluator/QueryEvaluator.java     |  14 +
 .../query/engine/evaluator/SelectEvaluator.java    |  22 +-
 .../query/engine/parsing/query/FromExpression.java |   8 +
 .../query/engine/retriever/AclRuleRetriever.java   |  14 +-
 .../query/engine/retriever/BindingRetriever.java   |  15 +-
 .../engine/retriever/CertificateRetriever.java     |  21 +-
 .../retriever/ConnectionLimitRuleRetriever.java    |  15 +-
 .../query/engine/retriever/SessionRetriever.java   | 127 ++++++
 .../qpid/server/query/engine/TestBroker.java       | 424 ++++++++++++---------
 .../query/engine/broker/BindingQueryTest.java      |  28 ++
 .../query/engine/broker/BrokerDigestQueryTest.java |  75 +++-
 .../query/engine/broker/CertificateQueryTest.java  |   5 +-
 .../query/engine/broker/ConnectionQueryTest.java   |   3 +
 ...indingQueryTest.java => ConsumerQueryTest.java} |  50 ++-
 .../query/engine/broker/DomainQueryTest.java       |   3 +
 .../{DomainQueryTest.java => PortQueryTest.java}   |  24 +-
 .../server/query/engine/broker/QueueQueryTest.java |  23 +-
 .../SessionQueryTest.java}                         |  37 +-
 ...ueryTest.java => VirtualHostNodeQueryTest.java} |  24 +-
 ...ainQueryTest.java => VirtualHostQueryTest.java} |  23 +-
 .../query/engine/evaluator/QueryEvaluatorTest.java |   3 +
 .../parsing/converter/DateTimeConverterTest.java   |   8 +-
 .../expression/accessor/ChainedAccessorTest.java   |   3 +
 .../arithmetic/ArithmeticExpressionsTest.java      |   3 +
 .../arithmetic/NumericTypeConversionsTest.java     |   3 +
 .../comparison/BetweenExpressionTest.java          |   3 +
 .../expression/comparison/EqualExpressionTest.java |   3 +
 .../comparison/GreaterThanExpressionTest.java      |   3 +
 .../GreaterThanOrEqualExpressionTest.java          |   3 +
 .../expression/comparison/InExpressionTest.java    |  37 ++
 .../comparison/IsNullExpressionTest.java           |   3 +
 .../comparison/LessThanExpressionTest.java         |   3 +
 .../comparison/LessThanOrEqualExpressionTest.java  |   3 +
 .../expression/comparison/LikeExpressionTest.java  |   3 +
 .../expression/conditional/CaseExpressionTest.java |   3 +
 .../function/aggregation/AvgExpressionTest.java    |   3 +
 .../function/aggregation/CountExpressionTest.java  |   3 +
 .../function/aggregation/GroupByTest.java          |   3 +
 .../function/aggregation/MaxExpressionTest.java    |   3 +
 .../function/aggregation/MinExpressionTest.java    |   3 +
 .../function/aggregation/SumExpressionTest.java    |   3 +
 .../datetime/CurrentTimestampExpressionTest.java   |   5 +-
 .../function/datetime/DateAddExpressionTest.java   |   3 +
 .../function/datetime/DateDiffExpressionTest.java  |   3 +
 .../function/datetime/DateExpressionTest.java      |   3 +
 .../function/datetime/ExtractExpressionTest.java   |   3 +
 .../function/nulls/CoalesceExpressionTest.java     |   3 +
 .../function/numeric/AbsExpressionTest.java        |   3 +
 .../function/numeric/RoundExpressionTest.java      |   3 +
 .../function/numeric/TruncExpressionTest.java      |   3 +
 .../function/string/ConcatExpressionTest.java      |   4 +-
 .../function/string/LeftTrimExpressionTest.java    |   3 +
 .../function/string/LengthExpressionTest.java      |   4 +-
 .../function/string/LowerExpressionTest.java       |   3 +
 .../function/string/PositionExpressionTest.java    |   3 +
 .../function/string/ReplaceExpressionTest.java     |   3 +
 .../function/string/RightTrimExpressionTest.java   |   3 +
 .../function/string/SubstringExpressionTest.java   |   8 +-
 .../function/string/TrimExpressionTest.java        |   3 +
 .../function/string/UpperExpressionTest.java       |   3 +
 .../expression/literal/LiteralExpressionTest.java  |   3 +
 .../expression/logic/AndExpressionTest.java        |   3 +
 .../expression/logic/NotExpressionTest.java        |   3 +
 .../parsing/expression/logic/OrExpressionTest.java |   3 +
 .../expression/set/IntersectExpressionTest.java    |   3 +
 .../expression/set/MinusExpressionTest.java        |   3 +
 .../expression/set/UnionExpressionTest.java        |   3 +
 .../factory/AccessorExpressionFactoryTest.java     |   3 +
 .../factory/ArithmeticExpressionFactoryTest.java   |   3 +
 .../parsing/factory/CollectorFactoryTest.java      |   3 +
 .../factory/ComparisonExpressionFactoryTest.java   |   3 +
 .../factory/ConditionalExpressionFactoryTest.java  |   3 +
 .../factory/FunctionExpressionFactoryTest.java     |   3 +
 .../factory/LiteralExpressionFactoryTest.java      |   3 +
 .../factory/LogicExpressionFactoryTest.java        |   3 +
 .../factory/NumberExpressionFactoryTest.java       |   3 +
 .../factory/ProjectionExpressionFactoryTest.java   |   3 +
 .../parsing/factory/SetExpressionFactoryTest.java  |   3 +
 .../factory/UnaryExpressionFactoryTest.java        |   3 +
 .../query/engine/parsing/query/AliasTest.java      | 168 +++++++-
 .../query/engine/parsing/query/HavingTest.java     |   3 +
 .../query/engine/parsing/query/OrderByTest.java    |   3 +
 .../engine/parsing/query/QuerySettingsTest.java    |   3 +
 .../engine/parsing/query/QueryValidatorTest.java   |   3 +
 .../query/engine/parsing/query/SubqueryTest.java   |   3 +
 .../query/engine/parsing/query/WithTest.java       |   3 +
 .../query/engine/utils/QuerySettingsBuilder.java   |   3 +
 .../FunctionParameterTypePredicateTest.java        |  23 ++
 .../FunctionParametersValidatorTest.java           |  23 ++
 .../validation/QueryExpressionValidatorTest.java   |  23 ++
 .../validation/SelectExpressionValidatorTest.java  |  23 ++
 ...Broker-Management-Channel-REST-Query-Engine.xml | 109 ++++++
 pom.xml                                            |  14 +-
 96 files changed, 1436 insertions(+), 298 deletions(-)

diff --git a/broker-plugins/broker-query-engine/README.md b/broker-plugins/broker-query-engine/README.md
index 17ceebc413..e0cf08cba2 100644
--- a/broker-plugins/broker-query-engine/README.md
+++ b/broker-plugins/broker-query-engine/README.md
@@ -76,8 +76,10 @@
      * [UPPER](#upper)
 
 10. [Set Operations](#set-operations)
+
+11. [Subqueries](#subqueries)
    
-11. [Performance Tips](#performance-tips)
+12. [Performance Tips](#performance-tips)
 
 ## Introduction
 
@@ -1847,6 +1849,128 @@ SELECT UPPER(name)
 FROM user
 ```
 
+## Subqueries
+
+When executing subquery parent query domain mat be passed into the subquery using alias.
+
+E.g. this query
+
+```
+SELECT 
+   id, 
+   name, 
+   (SELECT name FROM connection WHERE SUBSTRING(name, 1, POSITION(']' IN name)) = '[' + SUBSTRING(c.name, 1, POSITION('|' IN c.name) - 1) + ']') as connection, 
+   (SELECT id FROM connection WHERE SUBSTRING(name, 1, POSITION(']' IN name)) = '[' + SUBSTRING(c.name, 1, POSITION('|' IN c.name) - 1) + ']') as connectionId, 
+   (SELECT name FROM session WHERE id = c.session.id) as session 
+FROM consumer c
+```
+
+<details>
+  <summary>returns following result (Click to expand).</summary>
+  <p>
+
+```
+{
+    "results": [
+        {
+            "id": "7a4d7a86-652b-4112-b535-61272b936b57",
+            "name": "1|1|qpid-jms:receiver:ID:6bd18833-3c96-4936-b9ee-9dec5f408b5c:1:1:1:broadcast.amqp_user1.public",
+            "connection": "[1] 127.0.0.1:39134",
+            "connectionId": "afbd0480-43b1-4b39-bc00-260c077095f3",
+            "session": "1"
+        }
+    ],
+    "total": 1
+}
+```
+  </p>
+</details>
+
+Query 
+
+```
+SELECT 
+   name, 
+   destination, 
+   (SELECT id FROM queue WHERE name = b.destination) AS destinationId, 
+   exchange,  
+   (SELECT id FROM exchange WHERE name = b.exchange) AS exchangeId 
+FROM binding b 
+WHERE name = 'broadcast.amqp_user1.xxx.#'
+```
+<details>
+  <summary>returns following result (Click to expand).</summary>
+  <p>
+
+```
+{
+    "results": [
+        {
+            "name": "broadcast.amqp_user1.xxx.#",
+            "destination": "broadcast.amqp_user1.xxx",
+            "destinationId": "d5ce9e78-8558-40db-8690-15abf69ab255",
+            "exchange": "broadcast",
+            "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+        },
+        {
+            "name": "broadcast.amqp_user1.xxx.#",
+            "destination": "broadcast.amqp_user2.xxx",
+            "destinationId": "88357d15-a590-4ccf-aee8-2d5cda77752e",
+            "exchange": "broadcast",
+            "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+        },
+        {
+            "name": "broadcast.amqp_user1.xxx.#",
+            "destination": "broadcast.amqp_user3.xxx",
+            "destinationId": "c8200f89-2587-4b0c-a8f6-120cda975d03",
+            "exchange": "broadcast",
+            "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+        }
+    ],
+    "total": 3
+}
+```
+  </p>
+</details>
+
+Query
+
+```
+SELECT 
+   alias, 
+   (SELECT COUNT(id) FROM queue WHERE POSITION(UPPER(c.alias) IN name) > 0) AS queueCount 
+FROM certificate c
+```
+<details>
+  <summary>returns following result (Click to expand).</summary>
+  <p>
+
+```
+{
+    "results": [
+        {
+            "alias": "xxx",
+            "queueCount": 5
+        },
+        {
+            "alias": "xxy",
+            "queueCount": 5
+        },
+        {
+            "alias": "xxz",
+            "queueCount": 7
+        }
+    ],
+    "total": 3
+}
+```
+  </p>
+</details>
+
+
+Please consider that subquery usage may be not performant in case of many objects returned
+either by parent query or by subquery.
+
 ## Performance Tips
 
 Try to select entity fields by names instead of using an asterix. For example, this query
@@ -1867,3 +1991,18 @@ SELECT
 FROM queue
 LIMIT 10 OFFSET 0
 ```
+When using subqueries avoid to fire the against unfiltered domains. For example, this query
+```
+SELECT 
+   name, 
+   (SELECT id FROM queue WHERE name = b.destination) AS destinationId
+FROM binding b 
+WHERE name = 'broadcast.amqp_user1.xxx.#'
+```
+will be executed faster than this one:
+```
+SELECT 
+   name, 
+   (SELECT id FROM queue WHERE name = b.destination) AS destinationId
+FROM binding b 
+```
\ No newline at end of file
diff --git a/broker-plugins/broker-query-engine/pom.xml b/broker-plugins/broker-query-engine/pom.xml
index a4f1b4de12..078779dbe0 100644
--- a/broker-plugins/broker-query-engine/pom.xml
+++ b/broker-plugins/broker-query-engine/pom.xml
@@ -93,7 +93,6 @@
       <plugin>
         <groupId>com.helger.maven</groupId>
         <artifactId>ph-javacc-maven-plugin</artifactId>
-        <version>4.1.4</version>
         <executions>
           <execution>
             <id>expression-parser-generated</id>
diff --git a/broker-plugins/broker-query-engine/src/main/grammar/ExpressionParser.jj b/broker-plugins/broker-query-engine/src/main/grammar/ExpressionParser.jj
index 31e32366cc..ee9cc09665 100644
--- a/broker-plugins/broker-query-engine/src/main/grammar/ExpressionParser.jj
+++ b/broker-plugins/broker-query-engine/src/main/grammar/ExpressionParser.jj
@@ -587,14 +587,14 @@ ExpressionNode<T, R> comparisonExpression() :
     left = (ExpressionNode<T, R>) ComparisonExpressionFactory.inExpression(left, (SelectExpression) right);
 }
         |
-        LOOKAHEAD(3) <NOT> <IN> <LBRACKET> right = orExpression() { list = new ArrayList<>(); list.add( right ); }
+        LOOKAHEAD(6) <NOT> <IN> <LBRACKET> right = orExpression() { list = new ArrayList<>(); list.add( right ); }
         ( <COMMA> right = orExpression() { list.add( right ); } )* <RBRACKET>
         {
             stringBuilder.append(")");
             left = (ExpressionNode<T, R>) LogicExpressionFactory.negate(LogicExpressionFactory.toFunction(ComparisonExpressionFactory.inExpression(left, list)));
         }
         |
-        LOOKAHEAD(3) <NOT> <IN> <LBRACKET> right = select()  <RBRACKET>
+        LOOKAHEAD(6) <NOT> <IN> <LBRACKET> right = select()  <RBRACKET>
         {
             stringBuilder.append(")");
             left = (ExpressionNode<T, R>) LogicExpressionFactory.negate(LogicExpressionFactory.toFunction(ComparisonExpressionFactory.inExpression(left, (SelectExpression) right)));
@@ -1001,9 +1001,9 @@ ExpressionNode<T, R> functionPosition() :
 {
     t = <POSITION> { builder.append(token.image); } <LBRACKET> { builder.append("("); } ( expr = addExpression()
     { builder.append(expr.getAlias()); args.add(expr); } )?
-    ( LOOKAHEAD(2) ( <IN> { builder.append(token.image); } | <COMMA> { builder.append(token.image); } ) expr = addExpression()
+    ( LOOKAHEAD(2) ( <IN> { builder.append(" " + token.image + " "); } | <COMMA> { builder.append(token.image); } ) expr = addExpression()
     { builder.append(expr.getAlias()); args.add(expr); } ) ?
-    ( <COMMA> expr = addExpression() { builder.append(expr.getAlias()); args.add(expr); } )*
+    ( <COMMA> { builder.append(","); } expr = addExpression() { builder.append(expr.getAlias()); args.add(expr); } )*
     <RBRACKET> { builder.append(")"); }
     {
         String functionName = t.image;
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluator.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluator.java
index 349402cac6..c81e11e9a0 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluator.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluator.java
@@ -29,6 +29,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -46,6 +47,7 @@ import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 import org.apache.qpid.server.query.engine.parsing.ExpressionParser;
 import org.apache.qpid.server.query.engine.parsing.ParseException;
 import org.apache.qpid.server.query.engine.parsing.converter.NumberConverter;
+import org.apache.qpid.server.query.engine.parsing.expression.Expression;
 import org.apache.qpid.server.query.engine.parsing.expression.ExpressionNode;
 import org.apache.qpid.server.query.engine.parsing.expression.accessor.MapObjectAccessor;
 import org.apache.qpid.server.query.engine.parsing.expression.set.SetExpression;
@@ -358,8 +360,20 @@ public class QueryEvaluator
         final String alias
     )
     {
+        final AtomicBoolean replaced = new AtomicBoolean(false);
         return (map1, map2) -> {
 
+            if (!replaced.get())
+            {
+                final EvaluationContext ctx = EvaluationContextHolder.getEvaluationContext();
+                final Map<String, Expression<T, R>> aliases = ctx.get(EvaluationContext.QUERY_ALIASES, Map.class);
+                for (final Map.Entry<String, Expression<T, R>> entry : aliases.entrySet())
+                {
+                    entry.setValue(item -> (R) item);
+                }
+                replaced.set(true);
+            }
+
             R object1 = expression.apply((T) map1);
             R object2 = expression.apply((T) map2);
 
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/SelectEvaluator.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/SelectEvaluator.java
index 462e5b8fbb..51c56c0551 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/SelectEvaluator.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/evaluator/SelectEvaluator.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.query.engine.parsing.converter.ImplicitConverter;
 import org.apache.qpid.server.query.engine.parsing.converter.NumberConverter;
 import org.apache.qpid.server.query.engine.parsing.expression.Expression;
 import org.apache.qpid.server.query.engine.parsing.expression.function.aggregation.AbstractAggregationExpression;
+import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 import org.apache.qpid.server.query.engine.parsing.query.ProjectionExpression;
 import org.apache.qpid.server.query.engine.parsing.collector.CollectorType;
 import org.apache.qpid.server.query.engine.parsing.factory.CollectorFactory;
@@ -69,14 +70,19 @@ public class SelectEvaluator
         LOGGER.debug("Executing select '{}'", selectExpression);
 
         final EvaluationContext ctx = EvaluationContextHolder.getEvaluationContext();
-        if (selectExpression.getFrom() != null && !Objects.equals(selectExpression.getFrom().getAlias(), selectExpression.getFrom().toString()))
-        {
-            ctx.putAlias(selectExpression.getFrom().getAlias(), object -> object);
-        }
+
+        final boolean addAlias = selectExpression.getFrom() != null
+            && !Objects.equals(selectExpression.getFrom().getAlias(), selectExpression.getFrom().toString());
 
         Stream<T> stream = selectExpression.getFrom() == null
             ? Stream.empty()
-            : (Stream<T>) selectExpression.getFrom().get();
+            : (Stream<T>) selectExpression.getFrom().get()
+                .peek(item ->  {
+                    if (addAlias)
+                    {
+                        ctx.putAlias(selectExpression.getFrom().getAlias(), new ConstantExpression<>(item));
+                    }
+                });
 
         if (selectExpression.getWhere() != null)
         {
@@ -108,8 +114,8 @@ public class SelectEvaluator
             .map(ProjectionExpression::getAlias).collect(Collectors.toList());
 
         // when ORDER BY clause has items not contained in the SELECT clause, they should be added there
-        // (and moved during the sorting process)
-        if (!selectExpression.isSelectAll())
+        // (and removed during the sorting process)
+        if (!selectExpression.isSelectAll() && selectExpression.getParent() == null)
         {
             final List<OrderItem<T, R>> orderItems = ctx.get(EvaluationContext.QUERY_ORDERING);
             final List<ProjectionExpression<T, R>> additionalProjections = orderItems == null
@@ -222,7 +228,7 @@ public class SelectEvaluator
      * @return Map representing aggregation result
      */
     @SuppressWarnings("unchecked")
-    private <T, A, R> Map<String, R> groupBy(SelectExpression<T, R> selectExpression, Stream<T> stream)
+    private <T, A, R> Map<String, R> groupBy(final SelectExpression<T, R> selectExpression, final Stream<T> stream)
     {
 
         final List<T> items = stream.collect(Collectors.toList());
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/parsing/query/FromExpression.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/parsing/query/FromExpression.java
index 70c0f50819..8a70fbae9a 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/parsing/query/FromExpression.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/parsing/query/FromExpression.java
@@ -37,6 +37,7 @@ import org.apache.qpid.server.model.Binding;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.Session;
 import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.model.Domain;
@@ -50,6 +51,7 @@ import org.apache.qpid.server.query.engine.retriever.ConfiguredObjectRetriever;
 import org.apache.qpid.server.query.engine.retriever.ConnectionLimitRuleRetriever;
 import org.apache.qpid.server.query.engine.retriever.DomainRetriever;
 import org.apache.qpid.server.query.engine.retriever.EntityRetriever;
+import org.apache.qpid.server.query.engine.retriever.SessionRetriever;
 import org.apache.qpid.server.security.access.plugins.AclRule;
 import org.apache.qpid.server.user.connection.limits.plugins.ConnectionLimitRule;
 
@@ -94,6 +96,11 @@ public class FromExpression<T, R extends Stream<?>, C extends ConfiguredObject<?
      */
     private final EntityRetriever<C> _domainRetriever = new DomainRetriever<>();
 
+    /**
+     * Retrieves data from Session entities
+     */
+    private final EntityRetriever<C> _sessionRetriever = new SessionRetriever<>();
+
     /**
      * Additional domains allowed to be queried
      */
@@ -103,6 +110,7 @@ public class FromExpression<T, R extends Stream<?>, C extends ConfiguredObject<?
         .put(Certificate.class, _certificateRetriever)
         .put(ConnectionLimitRule.class, _connectionLimitRuleRetriever)
         .put(Domain.class, _domainRetriever)
+        .put(Session.class, _sessionRetriever)
         .build();
 
     /**
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/AclRuleRetriever.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/AclRuleRetriever.java
index ecf49b7b0f..22130d7fd2 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/AclRuleRetriever.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/AclRuleRetriever.java
@@ -20,12 +20,12 @@
  */
 package org.apache.qpid.server.query.engine.retriever;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,14 +62,18 @@ public class AclRuleRetriever<C extends ConfiguredObject<?>> extends ConfiguredO
     /**
      * List of entity field names
      */
-    private final List<String> _fieldNames = Arrays.asList(
-        "identity", "attributes", "objectType", "operation", "outcome"
-    );
+    private final List<String> _fieldNames = new ImmutableList.Builder<String>()
+        .add("identity")
+        .add("attributes")
+        .add("objectType")
+        .add("operation")
+        .add("outcome")
+        .build();
 
     /**
      * Mapping function for a Rule
      */
-    private final Function<Rule, Map<String, Object>> _ruleMapping = rule -> ImmutableMap.<String, Object> builder()
+    private final Function<Rule, Map<String, Object>> _ruleMapping = rule -> ImmutableMap.<String, Object>builder()
         .put(_fieldNames.get(0), rule.getIdentity())
         .put(_fieldNames.get(1), rule.getAttributes())
         .put(_fieldNames.get(2), rule.getObjectType())
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/BindingRetriever.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/BindingRetriever.java
index ba1aa92b4d..d1f2883135 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/BindingRetriever.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/BindingRetriever.java
@@ -20,12 +20,12 @@
  */
 package org.apache.qpid.server.query.engine.retriever;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.qpid.server.model.Binding;
@@ -50,15 +50,20 @@ public class BindingRetriever<C extends ConfiguredObject<?>> extends ConfiguredO
     /**
      * List of entity field names
      */
-    private final List<String> _fieldNames = Arrays.asList(
-        "exchange", "bindingKey", "name", "type", "arguments", "destination"
-    );
+    private final List<String> _fieldNames = new ImmutableList.Builder<String>()
+        .add("exchange")
+        .add("bindingKey")
+        .add("name")
+        .add("type")
+        .add("arguments")
+        .add("destination")
+        .build();
 
     /**
      * Mapping function for a Binding
      */
     private final BiFunction<ConfiguredObject<?>, Binding, Map<String, Object>> _bindingMapping =
-        (ConfiguredObject<?> parent, Binding binding) ->  ImmutableMap.<String, Object> builder()
+        (ConfiguredObject<?> parent, Binding binding) ->  ImmutableMap.<String, Object>builder()
             .put(_fieldNames.get(0), parent.getName())
             .put(_fieldNames.get(1), binding.getBindingKey())
             .put(_fieldNames.get(2), binding.getName())
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/CertificateRetriever.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/CertificateRetriever.java
index afab590b01..a36ea442a4 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/CertificateRetriever.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/CertificateRetriever.java
@@ -21,12 +21,12 @@
 package org.apache.qpid.server.query.engine.retriever;
 
 import java.math.BigInteger;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.function.BiFunction;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -58,16 +58,25 @@ public class CertificateRetriever<C extends ConfiguredObject<?>> extends Configu
     /**
      * List of entity field names
      */
-    private final List<String> _fieldNames = Arrays.asList(
-        "store", "alias", "issuerName", "serialNumber", "hexSerialNumber", "signatureAlgorithm", "subjectAltNames",
-        "subjectName", "validFrom", "validUntil", "version"
-    );
+    private final List<String> _fieldNames = new ImmutableList.Builder<String>()
+        .add("store")
+        .add("alias")
+        .add("issuerName")
+        .add("serialNumber")
+        .add("hexSerialNumber")
+        .add("signatureAlgorithm")
+        .add("subjectAltNames")
+        .add("subjectName")
+        .add("validFrom")
+        .add("validUntil")
+        .add("version")
+        .build();
 
     /**
      * Mapping function for a CertificateDetails
      */
     private final BiFunction<ConfiguredObject<?>, CertificateDetails, Map<String, Object>> certificateMapping =
-        (ConfiguredObject<?> parent, CertificateDetails certificate) -> ImmutableMap.<String, Object> builder()
+        (ConfiguredObject<?> parent, CertificateDetails certificate) -> ImmutableMap.<String, Object>builder()
             .put(_fieldNames.get(0), parent.getName())
             .put(_fieldNames.get(1), certificate.getAlias())
             .put(_fieldNames.get(2), certificate.getIssuerName())
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/ConnectionLimitRuleRetriever.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/ConnectionLimitRuleRetriever.java
index 508e6af0cc..c66d160ae5 100644
--- a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/ConnectionLimitRuleRetriever.java
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/ConnectionLimitRuleRetriever.java
@@ -20,12 +20,12 @@
  */
 package org.apache.qpid.server.query.engine.retriever;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.qpid.server.model.BrokerConnectionLimitProvider;
@@ -53,14 +53,19 @@ public class ConnectionLimitRuleRetriever<C extends ConfiguredObject<?>> extends
     /**
      * List of entity field names
      */
-    private final List<String> _fieldNames = Arrays.asList(
-        "blocked", "countLimit", "frequencyLimit", "frequencyPeriod", "identity", "port"
-    );
+    private final List<String> _fieldNames = new ImmutableList.Builder<String>()
+        .add("blocked")
+        .add("countLimit")
+        .add("frequencyLimit")
+        .add("frequencyPeriod")
+        .add("identity")
+        .add("port")
+        .build();
 
     /**
      * Mapping function for a ConnectionLimitRule
      */
-    private final Function<ConnectionLimitRule, Map<String, Object>> _connectionLimitRuleMapping = rule -> ImmutableMap.<String, Object> builder()
+    private final Function<ConnectionLimitRule, Map<String, Object>> _connectionLimitRuleMapping = rule -> ImmutableMap.<String, Object>builder()
         .put(_fieldNames.get(0), rule.getBlocked())
         .put(_fieldNames.get(1), rule.getCountLimit())
         .put(_fieldNames.get(2), rule.getFrequencyLimit())
diff --git a/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/SessionRetriever.java b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/SessionRetriever.java
new file mode 100644
index 0000000000..18d44f9733
--- /dev/null
+++ b/broker-plugins/broker-query-engine/src/main/java/org/apache/qpid/server/query/engine/retriever/SessionRetriever.java
@@ -0,0 +1,127 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.query.engine.retriever;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.stream.Stream;
+
+import com.google.common.collect.ImmutableList;
+
+import org.apache.qpid.server.model.ConfiguredObject;
+import org.apache.qpid.server.model.Connection;
+import org.apache.qpid.server.model.Session;
+
+/**
+ * Retrieves Session entities
+ *
+ * @param <C> Descendant of ConfiguredObject
+ */
+// sonar complains about underscores in variable names
+@SuppressWarnings("java:S116")
+public class SessionRetriever<C extends ConfiguredObject<?>> extends ConfiguredObjectRetriever<C> implements EntityRetriever<C>
+{
+    /**
+     * Target type
+     */
+    @SuppressWarnings({"java:S1170", "rawtypes", "RedundantCast", "unchecked"})
+    private final Class<C> _type = (Class<C>) (Class<? extends ConfiguredObject>) Connection.class;
+
+    /**
+     * List of entity field names
+     */
+    private final List<String> _fieldNames = new ImmutableList.Builder<String>()
+        .add("connectionId")
+        .add("id")
+        .add("name")
+        .add("description")
+        .add("type")
+        .add("desiredState")
+        .add("state")
+        .add("durable")
+        .add("lifetimePolicy")
+        .add("channelId")
+        .add("lastOpenedTime")
+        .add("producerFlowBlocked")
+        .add("lastUpdatedTime")
+        .add("lastUpdatedBy")
+        .add("createdBy")
+        .add("createdTime")
+        .add("statistics")
+        .build();
+
+    /**
+     * Mapping function for a Session
+     */
+    private final BiFunction<ConfiguredObject<?>, Session<?>, Map<String, Object>> _sessionMapping =
+        (ConfiguredObject<?> parent, Session<?> session) ->
+        {
+            final Map<String, Object> result = new LinkedHashMap<>();
+            result.put(_fieldNames.get(0), parent.getId());
+            result.put(_fieldNames.get(1), session.getId());
+            result.put(_fieldNames.get(2), session.getName());
+            result.put(_fieldNames.get(3), session.getDescription());
+            result.put(_fieldNames.get(4), session.getType());
+            result.put(_fieldNames.get(5), session.getDesiredState());
+            result.put(_fieldNames.get(6), session.getState());
+            result.put(_fieldNames.get(7), session.isDurable());
+            result.put(_fieldNames.get(8), session.getLifetimePolicy());
+            result.put(_fieldNames.get(9), session.getChannelId());
+            result.put(_fieldNames.get(10), session.getLastOpenedTime());
+            result.put(_fieldNames.get(11), session.isProducerFlowBlocked());
+            result.put(_fieldNames.get(12), session.getLastUpdatedTime());
+            result.put(_fieldNames.get(13), session.getLastUpdatedBy());
+            result.put(_fieldNames.get(14), session.getCreatedBy());
+            result.put(_fieldNames.get(15), session.getCreatedTime());
+            result.put(_fieldNames.get(16), session.getStatistics());
+            return result;
+        };
+
+    /**
+     * Returns stream of Session entities
+     *
+     * @param broker Broker instance
+     *
+     * @return Stream of entities
+     */
+    @Override()
+    public Stream<Map<String, ?>> retrieve(final C broker)
+    {
+        final Stream<Connection<?>> stream = retrieve(broker, _type).map(connection -> ((Connection<?>) connection));
+        return stream.flatMap(connection -> connection.getSessions().stream()
+            .map(session -> _sessionMapping.apply(connection, session)));
+    }
+
+    /**
+     * Returns list of entity field names
+     *
+     * @return List of field names
+     */
+    @Override()
+    @SuppressWarnings("findbugs:EI_EXPOSE_REP")
+    // List of field names already is an immutable collection
+    public List<String> getFieldNames()
+    {
+        return _fieldNames;
+    }
+}
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/TestBroker.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/TestBroker.java
index b97b2402dc..cfba8644d6 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/TestBroker.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/TestBroker.java
@@ -20,7 +20,6 @@
  */
 package org.apache.qpid.server.query.engine;
 
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -31,7 +30,6 @@ import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
@@ -40,24 +38,22 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import com.google.common.collect.Lists;
 import org.junit.ClassRule;
 
 import org.apache.qpid.server.exchange.ExchangeDefaults;
-import org.apache.qpid.server.message.AMQMessageHeader;
-import org.apache.qpid.server.message.MessageReference;
-import org.apache.qpid.server.message.ServerMessage;
 import org.apache.qpid.server.model.*;
 import org.apache.qpid.server.model.port.HttpPort;
-import org.apache.qpid.server.query.engine.evaluator.settings.DefaultQuerySettings;
 import org.apache.qpid.server.security.CertificateDetails;
 import org.apache.qpid.server.security.auth.manager.ScramSHA256AuthenticationManager;
-import org.apache.qpid.server.store.StoredMessage;
-import org.apache.qpid.server.store.TransactionLogResource;
 import org.apache.qpid.server.transport.AMQPConnection;
 import org.apache.qpid.server.virtualhost.TestMemoryVirtualHost;
 import org.apache.qpid.server.virtualhostnode.memory.MemoryVirtualHostNode;
 import org.apache.qpid.test.utils.tls.TlsResource;
 
+/**
+ * Helper class for creating broker mock
+ */
 @SuppressWarnings({"unchecked", "rawtypes"})
 public class TestBroker
 {
@@ -66,6 +62,8 @@ public class TestBroker
 
     private static Broker<?> _broker;
 
+    private static final List<Connection> connections = new ArrayList<>();
+
     public static Broker<?> createBroker()
     {
         try
@@ -77,7 +75,7 @@ public class TestBroker
 
             _broker = BrokerTestHelper.createBrokerMock();
 
-            List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Broker.class));
+            final List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Broker.class));
             when(_broker.getAttributeNames()).thenReturn(attributeNames);
             when(_broker.getAttribute(eq("name"))).thenReturn("mock");
             when(_broker.getName()).thenReturn("mock");
@@ -87,25 +85,26 @@ public class TestBroker
             attributesMap.put(AuthenticationProvider.TYPE, "SCRAM-SHA-256");
             attributesMap.put(AuthenticationProvider.ID, UUID.randomUUID());
             ScramSHA256AuthenticationManager authProvider =
-                    (ScramSHA256AuthenticationManager) _broker.getObjectFactory()
-                                                              .create(AuthenticationProvider.class,
-                                                                      attributesMap,
-                                                                      _broker);
+                (ScramSHA256AuthenticationManager) _broker.getObjectFactory()
+                    .create(AuthenticationProvider.class, attributesMap, _broker);
             when(_broker.getAuthenticationProviders()).thenReturn(Collections.singletonList(authProvider));
 
-            HttpPort<?> httpPort = mock(HttpPort.class);
+            final List<String> portAttributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Port.class));
+            final HttpPort<?> httpPort = mock(HttpPort.class);
+            when(httpPort.getAttributeNames()).thenReturn(portAttributeNames);
             when(httpPort.getPort()).thenReturn(40606);
             when(httpPort.getBoundPort()).thenReturn(40606);
             when(httpPort.getCreatedBy()).thenReturn("admin");
             when(httpPort.getCreatedTime()).thenReturn(new Date());
             when(httpPort.getName()).thenReturn("httpPort");
+            when(httpPort.getAttribute(Port.NAME)).thenReturn("httpPort");
             when(httpPort.getState()).thenReturn(State.ACTIVE);
             when(httpPort.getType()).thenReturn("HTTP");
             when(httpPort.getAttribute(HttpPort.AUTHENTICATION_PROVIDER)).thenReturn(authProvider);
+            when(httpPort.getStatistics()).thenReturn(new HashMap<>());
 
-            Collection<Connection> connections = new ArrayList<>();
-
-            Port<?> amqpPort = mock(Port.class);
+            final Port<?> amqpPort = mock(Port.class);
+            when(amqpPort.getAttributeNames()).thenReturn(portAttributeNames);
             when(amqpPort.getConnections()).thenReturn(connections);
             when(amqpPort.getChildren(Connection.class)).thenReturn(connections);
             when(amqpPort.getPort()).thenReturn(40206);
@@ -113,193 +112,168 @@ public class TestBroker
             when(amqpPort.getCreatedBy()).thenReturn("admin");
             when(amqpPort.getCreatedTime()).thenReturn(new Date());
             when(amqpPort.getName()).thenReturn("amqpPort");
+            when(amqpPort.getAttribute(Port.NAME)).thenReturn("amqpPort");
             when(amqpPort.getState()).thenReturn(State.ACTIVE);
             when(amqpPort.getType()).thenReturn("AMQP");
+            final Map<String, Object> portStatistics = new HashMap<>();
+            portStatistics.put("connectionCount", 30);
+            portStatistics.put("totalConnectionCount", 30);
+            when(httpPort.getStatistics()).thenReturn(portStatistics);
 
             when(_broker.getPorts()).thenReturn(Arrays.asList(httpPort, amqpPort));
             when(_broker.getChildren(eq(Port.class))).thenReturn(Arrays.asList(httpPort, amqpPort));
 
-            final Map<String, Object> vhnAttributes = new HashMap<>();
-            vhnAttributes.put(VirtualHostNode.TYPE, MemoryVirtualHostNode.VIRTUAL_HOST_NODE_TYPE);
-            vhnAttributes.put(VirtualHostNode.NAME, "default");
-            VirtualHostNode<?> virtualHostNode =
-                    _broker.getObjectFactory().create(VirtualHostNode.class, vhnAttributes, _broker);
-
-            VirtualHostNode mockVirtualHostNode = mock(VirtualHostNode.class);
-            when(mockVirtualHostNode.getAttributeNames()).thenReturn(virtualHostNode.getAttributeNames());
+            final List<String> vhnAttributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(VirtualHostNode.class));
+            final VirtualHostNode<?> virtualHostNode = mock(VirtualHostNode.class);
+            when(virtualHostNode.getAttributeNames()).thenReturn(vhnAttributeNames);
+            when(virtualHostNode.getAttribute(VirtualHostNode.ID)).thenReturn(UUID.randomUUID());
+            when(virtualHostNode.getAttribute(eq(VirtualHostNode.NAME))).thenReturn("default");
+            when(virtualHostNode.getAttribute(eq(VirtualHostNode.TYPE))).thenReturn(MemoryVirtualHostNode.VIRTUAL_HOST_NODE_TYPE);
+            when(virtualHostNode.getAttribute(eq(VirtualHostNode.CREATED_TIME))).thenReturn(new Date());
+            when(virtualHostNode.getCreatedTime()).thenReturn(new Date());
+
+            final VirtualHostNode mockVirtualHostNode = mock(VirtualHostNode.class);
+            when(mockVirtualHostNode.getAttributeNames()).thenReturn(vhnAttributeNames);
+            when(mockVirtualHostNode.getAttribute(VirtualHostNode.ID)).thenReturn(UUID.randomUUID());
             when(mockVirtualHostNode.getAttribute(eq(VirtualHostNode.NAME))).thenReturn("mock");
             when(mockVirtualHostNode.getAttribute(eq(VirtualHostNode.TYPE))).thenReturn("mock");
             when(mockVirtualHostNode.getAttribute(eq(VirtualHostNode.CREATED_TIME)))
-                .thenReturn(new Date(101, Calendar.JANUARY, 1, 12, 55, 30));
-            when(mockVirtualHostNode.getCreatedTime()).thenReturn(new Date(101, Calendar.JANUARY, 1, 12, 55, 30));
-
-            when(_broker.getVirtualHostNodes()).thenReturn(Arrays.asList(mockVirtualHostNode,
-                                                                   mockVirtualHostNode,
-                                                                   virtualHostNode));
-            when(_broker.getChildren(eq(VirtualHostNode.class))).thenReturn(Arrays.asList(virtualHostNode,
-                                                                                    mockVirtualHostNode));
-
-            final Map<String, Object> vhAttributes = new HashMap<>();
-            vhAttributes.put(VirtualHost.TYPE, TestMemoryVirtualHost.VIRTUAL_HOST_TYPE);
-            vhAttributes.put(VirtualHost.NAME, "default");
-            TestMemoryVirtualHost virtualHost =
-                    (TestMemoryVirtualHost) virtualHostNode.createChild(VirtualHost.class, vhAttributes);
-
-            List<Queue> queues = new ArrayList<>();
+                .thenReturn(createDate("2001-01-01 12:55:30"));
+            when(mockVirtualHostNode.getCreatedTime()).thenReturn(createDate("2001-01-01 12:55:30"));
+
+            when(_broker.getVirtualHostNodes()).thenReturn(
+                Arrays.asList(mockVirtualHostNode, virtualHostNode)
+            );
+            when(_broker.getChildren(eq(VirtualHostNode.class))).thenReturn(
+                Arrays.asList(virtualHostNode, mockVirtualHostNode)
+            );
+
+            final List<String> vhAttributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(VirtualHost.class));
+            final VirtualHost virtualHost = mock(VirtualHost.class);
+            when(virtualHost.getAttributeNames()).thenReturn(vhAttributeNames);
+            when(virtualHost.getAttribute(VirtualHost.ID)).thenReturn(UUID.randomUUID());
+            when(virtualHost.getAttribute(VirtualHost.TYPE)).thenReturn(TestMemoryVirtualHost.VIRTUAL_HOST_TYPE);
+            when(virtualHost.getAttribute(VirtualHost.NAME)).thenReturn("default");
+            when(virtualHostNode.getChildren(eq(VirtualHost.class))).thenReturn(
+                Arrays.asList(virtualHost)
+            );
+            when(virtualHostNode.getVirtualHost()).thenReturn(virtualHost);
+
+            for (int i = 1 ; i < 11; i ++)
+            {
+                connections.add(createAMQPConnection(i, "127.0.0.1", "principal1"));
+            }
+            for (int i = 11 ; i < 21; i ++)
+            {
+                connections.add(createAMQPConnection(i, "127.0.0.2", "principal2"));
+            }
+            for (int i = 21 ; i < 31; i ++)
+            {
+                connections.add(createAMQPConnection(i, "127.0.0.3", "principal3"));
+            }
+
+            final List<Queue> queues = new ArrayList<>();
             for (int i = 0; i < 10; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.LAST_UPDATED_TIME, new Date(2021, Calendar.JANUARY, 0, 0, 0, 0));
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.RING);
-                if (i % 2 == 0)
-                {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                }
-                attributes.put(Queue.DESCRIPTION, "test description 1");
-                queues.add(virtualHost.createChild(Queue.class, attributes));
+                final Queue queue = createQueue(i, OverflowPolicy.RING, "test description 1");
+                queues.add(queue);
             }
             for (int i = 10; i < 20; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.REJECT);
-                if (i % 2 == 0)
-                {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                }
-                attributes.put(Queue.DESCRIPTION, "test description 2");
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                queues.add(virtualHost.createChild(Queue.class, attributes));
+                final Queue queue = createQueue(i, OverflowPolicy.REJECT, "test description 2");
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
+                queues.add(queue);
             }
             for (int i = 20; i < 30; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.FLOW_TO_DISK);
-                if (i % 2 == 0)
-                {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                }
-                attributes.put(Queue.DESCRIPTION, "test description 3");
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                queues.add(virtualHost.createChild(Queue.class, attributes));
+                final Queue queue = createQueue(i, OverflowPolicy.FLOW_TO_DISK, "test description 3");
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
+                queues.add(queue);
             }
             for (int i = 30; i < 40; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.PRODUCER_FLOW_CONTROL);
-                if (i % 2 == 0)
-                {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                }
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                queues.add(virtualHost.createChild(Queue.class, attributes));
+                final Queue queue = createQueue(i, OverflowPolicy.PRODUCER_FLOW_CONTROL, null);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
+                queues.add(queue);
             }
             for (int i = 40; i < 50; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.NONE);
+                final Queue queue = createQueue(i, OverflowPolicy.NONE, null);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
                 if (i % 2 == 0)
                 {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                    attributes.put(Queue.LIFETIME_POLICY, LifetimePolicy.PERMANENT);
+                    when(queue.getAttribute(Queue.EXPIRY_POLICY)).thenReturn(Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
+                    when(queue.getAttribute(Queue.LIFETIME_POLICY)).thenReturn(LifetimePolicy.PERMANENT);
                 }
                 else
                 {
-                    attributes.put(Queue.LIFETIME_POLICY, LifetimePolicy.IN_USE);
+                    when(queue.getAttribute(Queue.LIFETIME_POLICY)).thenReturn(LifetimePolicy.IN_USE);
                 }
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                queues.add(virtualHost.createChild(Queue.class, attributes));
+                queues.add(queue);
             }
             for (int i = 50; i < 60; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.NONE);
+                final Queue queue = createQueue(i, OverflowPolicy.NONE, null);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
                 if (i % 2 == 0)
                 {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                    attributes.put(Queue.LIFETIME_POLICY, LifetimePolicy.PERMANENT);
+                    when(queue.getAttribute(Queue.EXPIRY_POLICY)).thenReturn(Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
+                    when(queue.getAttribute(Queue.LIFETIME_POLICY)).thenReturn(LifetimePolicy.PERMANENT);
                 }
                 else
                 {
-                    attributes.put(Queue.LIFETIME_POLICY, LifetimePolicy.IN_USE);
-                }
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                Queue queue = virtualHost.createChild(Queue.class, attributes);
-                for (int j = 0; j < 65; j++)
-                {
-                    queue.enqueue(createMessage((long) j), null, null);
+                    when(queue.getAttribute(Queue.LIFETIME_POLICY)).thenReturn(LifetimePolicy.IN_USE);
                 }
+
+                final Map<String, Object> statistics = new HashMap<>();
+                statistics.put("availableMessages", 65);
+                statistics.put("bindingCount", 0);
+                statistics.put("queueDepthMessages", 65);
+                statistics.put("queueDepthBytes", 0);
+                statistics.put("totalExpiredBytes", 0);
+                when(queue.getStatistics()).thenReturn(statistics);
+
                 queues.add(queue);
             }
 
             for (int i = 60; i < 70; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Queue.ID, UUID.randomUUID());
-                attributes.put(Queue.NAME, "QUEUE_" + i);
-                attributes.put(Queue.OVERFLOW_POLICY, OverflowPolicy.NONE);
-                if (i % 2 == 0)
-                {
-                    attributes.put(Queue.EXPIRY_POLICY, Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
-                }
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_BYTES, 1024 * 1024);
-                attributes.put(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES, 100);
-                Queue queue = virtualHost.createChild(Queue.class, attributes);
-                for (int j = 0; j < 95; j++)
-                {
-                    queue.enqueue(createMessage((long) j), null, null);
-                }
+                final Queue queue = createQueue(i, OverflowPolicy.NONE, null);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(1024 * 1024);
+                when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(100);
+
+                final Map<String, Object> statistics = new HashMap<>();
+                statistics.put("availableMessages", 95);
+                statistics.put("bindingCount", 0);
+                statistics.put("queueDepthMessages", 95);
+                statistics.put("queueDepthBytes", 0);
+                statistics.put("totalExpiredBytes", 0);
+                when(queue.getStatistics()).thenReturn(statistics);
+
                 queues.add(queue);
             }
+            when(virtualHost.getChildren(eq(Queue.class))).thenReturn(queues);
 
-            List<Exchange> exchanges = new ArrayList<>();
+            final List<Exchange> exchanges = new ArrayList<>();
             for (int i = 0; i < 10; i++)
             {
-                Map<String, Object> attributes = new HashMap<>();
-                attributes.put(Exchange.ID, UUID.randomUUID());
-                attributes.put(Exchange.TYPE, ExchangeDefaults.TOPIC_EXCHANGE_CLASS);
-                attributes.put(Exchange.NAME, "EXCHANGE_" + i);
-                attributes.put(Exchange.DESCRIPTION, "test description " + i);
-                Exchange exchange = virtualHost.createChild(Exchange.class, attributes);
-                exchange.bind("QUEUE_1", "#", new HashMap<>(), true);
-                exchanges.add(exchange);
-            }
-
-            for (int i = 1 ; i < 11; i ++)
-            {
-                connections.add(createAMQPConnection(i, "127.0.0.1", "principal1"));
-            }
-            for (int i = 11 ; i < 21; i ++)
-            {
-                connections.add(createAMQPConnection(i, "127.0.0.2", "principal2"));
-            }
-            for (int i = 21 ; i < 31; i ++)
-            {
-                connections.add(createAMQPConnection(i, "127.0.0.3", "principal3"));
+                exchanges.add(creatExchange(i));
             }
+            when(virtualHost.getChildren(eq(Exchange.class))).thenReturn(exchanges);
 
             final Collection<TrustStore> trustStores = createTruststores();
             when(_broker.getChildren(eq(TrustStore.class))).thenReturn(trustStores);
 
-
+            when(_broker.getAttribute("maximumHeapMemorySize")).thenReturn(10_000_000_000L);
+            when(_broker.getAttribute("maximumDirectMemorySize")).thenReturn(1_500_000_000L);
+            when(_broker.getStatistics()).thenReturn(getBrokerStatistics());
         }
-        catch(Exception e)
+        catch (Exception e)
         {
             throw new RuntimeException(e);
         }
@@ -307,6 +281,73 @@ public class TestBroker
         return _broker;
     }
 
+    protected static Queue createQueue(int number, OverflowPolicy overflowPolicy, String description)
+    {
+        final List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Queue.class));
+        final Queue<?> queue = mock(Queue.class);
+        when(queue.getAttributeNames()).thenReturn(attributeNames);
+        when(queue.getAttribute(Queue.ID)).thenReturn(UUID.randomUUID());
+        when(queue.getAttribute(Queue.NAME)).thenReturn("QUEUE_" + number);
+        when(queue.getAttribute(Queue.TYPE)).thenReturn("standard");
+        Date createdTime = new Date();
+        when(queue.getAttribute(Queue.CREATED_TIME)).thenReturn(createdTime);
+        when(queue.getCreatedTime()).thenReturn(createdTime);
+        when(queue.getAttribute(Queue.LAST_UPDATED_TIME)).thenReturn(new Date());
+        when(queue.getAttribute(Queue.OVERFLOW_POLICY)).thenReturn(overflowPolicy);
+        if (number % 2 == 0)
+        {
+            when(queue.getAttribute(Queue.EXPIRY_POLICY)).thenReturn(Queue.ExpiryPolicy.ROUTE_TO_ALTERNATE);
+        }
+        else
+        {
+            when(queue.getAttribute(Queue.EXPIRY_POLICY)).thenReturn(Queue.ExpiryPolicy.DELETE);
+        }
+        when(queue.getAttribute(Queue.LIFETIME_POLICY)).thenReturn(LifetimePolicy.PERMANENT);
+        when(queue.getAttribute(Queue.DESCRIPTION)).thenReturn(description);
+        when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_BYTES)).thenReturn(-1);
+        when(queue.getAttribute(Queue.MAXIMUM_QUEUE_DEPTH_MESSAGES)).thenReturn(-1);
+
+        Map<String, Object> statistics = new HashMap<>();
+        statistics.put("availableMessages", 0);
+        statistics.put("bindingCount", number == 1 ? 10 : 0);
+        statistics.put("queueDepthMessages", 0);
+        statistics.put("queueDepthBytes", 0);
+        statistics.put("totalExpiredBytes", 0);
+        when(queue.getStatistics()).thenReturn(statistics);
+
+        if (number > 0 && number < 11)
+        {
+            Consumer consumer = createConsumer(number, "QUEUE_" + number);
+            when(queue.getChildren(eq(Consumer.class))).thenReturn(Lists.newArrayList(consumer));
+        }
+
+        return queue;
+    }
+
+    protected static Exchange creatExchange(int number)
+    {
+        final List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Exchange.class));
+        final Exchange<?> exchange = mock(Exchange.class);
+        when(exchange.getAttributeNames()).thenReturn(attributeNames);
+        when(exchange.getAttribute(Exchange.ID)).thenReturn(UUID.randomUUID());
+        when(exchange.getAttribute(Exchange.TYPE)).thenReturn(ExchangeDefaults.TOPIC_EXCHANGE_CLASS);
+        when(exchange.getAttribute(Exchange.NAME)).thenReturn("EXCHANGE_" + number);
+        when(exchange.getName()).thenReturn("EXCHANGE_" + number);
+        when(exchange.getAttribute(Exchange.DESCRIPTION)).thenReturn("test description " + number);
+
+        Binding binding = mock(Binding.class);
+        when(binding.getName()).thenReturn("#");
+        when(binding.getBindingKey()).thenReturn("#");
+        when(binding.getType()).thenReturn("binding");
+        when(binding.getDestination()).thenReturn("QUEUE_1");
+        when(binding.getArguments()).thenReturn(new HashMap<>());
+
+        when(exchange.getAttribute("bindings")).thenReturn(Collections.unmodifiableList(Arrays.asList(binding)));
+        when(exchange.getBindings()).thenReturn(Collections.unmodifiableList(Arrays.asList(binding)));
+
+        return exchange;
+    }
+
     protected static Collection<TrustStore> createTruststores()
     {
         final Collection<TrustStore> trustStores = new ArrayList<>();
@@ -442,33 +483,14 @@ public class TestBroker
         return list;
     }
 
-    protected static ServerMessage createMessage(Long id)
-    {
-        AMQMessageHeader header = mock(AMQMessageHeader.class);
-        when(header.getMessageId()).thenReturn(String.valueOf(id));
-        ServerMessage message = mock(ServerMessage.class);
-        when(message.getMessageNumber()).thenReturn(id);
-        when(message.getMessageHeader()).thenReturn(header);
-        when(message.checkValid()).thenReturn(true);
-
-        StoredMessage storedMessage = mock(StoredMessage.class);
-        when(message.getStoredMessage()).thenReturn(storedMessage);
-
-        MessageReference ref = mock(MessageReference.class);
-        when(ref.getMessage()).thenReturn(message);
-
-        when(message.newReference()).thenReturn(ref);
-        when(message.newReference(any(TransactionLogResource.class))).thenReturn(ref);
-
-        return message;
-    }
-
     protected static Connection createAMQPConnection(int number, String hostname, String principal)
     {
         List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Connection.class));
         AMQPConnection<?> connection = mock(AMQPConnection.class);
         when(connection.getAttributeNames()).thenReturn(attributeNames);
-        when(connection.getAttribute(Connection.ID)).thenReturn(UUID.randomUUID());
+        UUID id = UUID.randomUUID();
+        when(connection.getAttribute(Connection.ID)).thenReturn(id);
+        when(connection.getId()).thenReturn(id);
         when(connection.getAttribute(Connection.NAME)).thenReturn(String.format("[%d] %s:%d", number, hostname, (47290 + number)));
         when(connection.getAttribute(Connection.DESCRIPTION)).thenReturn(null);
         when(connection.getAttribute(Connection.TYPE)).thenReturn("AMQP_1_0");
@@ -484,12 +506,68 @@ public class TestBroker
         when(connection.getProtocol()).thenReturn(Protocol.AMQP_1_0);
         when(connection.getAttribute(Connection.REMOTE_ADDRESS)).thenReturn(String.format("/%s:%d", hostname, (47290 + number)));
         when(connection.getAttribute(Connection.TRANSPORT)).thenReturn(Transport.TCP);
+
+        Session session = createSession(0);
+        when(connection.getSessions()).thenReturn(Collections.unmodifiableList(Arrays.asList(session)));
+        when(connection.getChildren(eq(Session.class))).thenReturn(Collections.unmodifiableList(Arrays.asList(session)));
+
         return connection;
     }
 
+    protected static Consumer<?, ?> createConsumer(int connectionNumber, String queueName)
+    {
+        final List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Consumer.class));
+        final Consumer<?, ?> consumer = mock(Consumer.class);
+        when(consumer.getAttributeNames()).thenReturn(attributeNames);
+        when(consumer.getAttribute(Consumer.ID)).thenReturn(UUID.randomUUID());
+        when(consumer.getAttribute(Consumer.NAME)).thenReturn(
+            String.format("%d|1|qpid-jms:receiver:ID:%s:1:1:1:%s", connectionNumber, UUID.randomUUID(), queueName)
+        );
+        Session session = (Session) connections.get(connectionNumber).getSessions().iterator().next();
+        when(consumer.getSession()).thenReturn(session);
+        when(consumer.getAttribute("session")).thenReturn(session);
+        return consumer;
+    }
+
+    protected static Session<?> createSession(int sessionNumber)
+    {
+        final List<String> attributeNames = new ArrayList<>(_broker.getModel().getTypeRegistry().getAttributeNames(Session.class));
+        final Session<?> session = mock(Session.class);
+        when(session.getAttributeNames()).thenReturn(attributeNames);
+        UUID id = UUID.randomUUID();
+        when(session.getAttribute(Session.ID)).thenReturn(id);
+        when(session.getId()).thenReturn(id);
+        when(session.getAttribute(Session.NAME)).thenReturn(sessionNumber);
+        when(session.getName()).thenReturn(String.valueOf(sessionNumber));
+        when(session.getType()).thenReturn("Session");
+        when(session.getDescription()).thenReturn("test description");
+        when(session.getDesiredState()).thenReturn(State.ACTIVE);
+        when(session.getState()).thenReturn(State.ACTIVE);
+        when(session.isDurable()).thenReturn(true);
+        when(session.getLifetimePolicy()).thenReturn(LifetimePolicy.PERMANENT);
+        when(session.getChannelId()).thenReturn(0);
+        when(session.getLastOpenedTime()).thenReturn(new Date());
+        when(session.isProducerFlowBlocked()).thenReturn(false);
+        when(session.getLastUpdatedTime()).thenReturn(new Date());
+        when(session.getLastUpdatedBy()).thenReturn("admin");
+        when(session.getCreatedBy()).thenReturn("admin");
+        when(session.getCreatedTime()).thenReturn(new Date());
+        when(session.getStatistics()).thenReturn(new HashMap<>());
+        return session;
+    }
+
+    protected static Map<String, Object> getBrokerStatistics()
+    {
+        final Map<String, Object> map = new HashMap<>();
+        map.put("usedHeapMemorySize", 6_000_000_000L);
+        map.put("usedDirectMemorySize", 500_000_000L);
+        map.put("processCpuLoad", 0.052);
+        return map;
+    }
+
     protected static Date createDate(String date)
     {
-        final LocalDateTime dateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(DefaultQuerySettings.DATE_TIME_PATTERN));
+        final LocalDateTime dateTime = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"));
         return Date.from(dateTime.toInstant(ZoneOffset.UTC));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java
index b5b5867ae2..1d6e2e3ec4 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the bindings retrieval
+ */
 public class BindingQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -73,4 +76,29 @@ public class BindingQueryTest
         assertEquals(1, result.size());
         assertEquals(10, ((Map<String, Object>) result.get(0).get("count(*)")).get("QUEUE_1"));
     }
+
+    @Test()
+    public void extractExchangeIdAndDestinationId()
+    {
+        String query = "select "
+            + "exchange, destination, "
+            + "(select id from exchange where name = b.exchange) as exchangeId, "
+            + "(select id from queue where name = b.destination) as destinationId "
+            + "from binding b";
+
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+
+        assertEquals(10, result.size());
+
+        for (Map<String, Object> stringObjectMap : result)
+        {
+            String exchangeQuery = "select id from exchange where name = '" + stringObjectMap.get("exchange") + "'";
+            String exchangeId = (String) _queryEvaluator.execute(exchangeQuery).getResults().get(0).get("id");
+            assertEquals(stringObjectMap.get("exchangeId"), exchangeId);
+
+            String queueQuery = "select id from queue where name = '" + stringObjectMap.get("destination") + "'";
+            String queueId = (String) _queryEvaluator.execute(queueQuery).getResults().get(0).get("id");
+            assertEquals(stringObjectMap.get("destinationId"), queueId);
+        }
+    }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BrokerDigestQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BrokerDigestQueryTest.java
index 5e1950d283..db1abba3d3 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BrokerDigestQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BrokerDigestQueryTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the broker digests retrieval
+ */
 public class BrokerDigestQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -37,22 +40,66 @@ public class BrokerDigestQueryTest
     @Test()
     public void selectBrokerDigest()
     {
-        String query = "select "
-                       + "name as label, "
-                       + "null as objectsState, "
-                       + "'UNAVAILABLE' as diskUsageState, "
-                       + "'UNAVAILABLE' as memoryUsageState, "
-                       + "'UNAVAILABLE' as cpuUsageState, "
-                       + "(select count(*) from connection) as connectionCount, "
-                       + "(select count(*) from exchange) as exchangesCount, "
-                       + "(select count(*) from binding) as bindingsCount, "
-                       + "(select count(*) from queue) as queuesCount, "
-                       + "0 as goodQueuesCount, "
-                       + "0 as badQueuesCount, "
-                       + "0 as criticalQueuesCount "
-                       + "from broker";
+        String query = "with important_queues as "
+            + "(select name from queue where name in ("
+            + "'QUEUE_55','QUEUE_56', 'QUEUE_57',"
+            + "'QUEUE_60','QUEUE_61')) "
+            + "select "
+            + "name as label, "
+            + "null as objectsState, "
+            + "usedHeapMemorySize as heapMemoryUsage, "
+            + "maximumHeapMemorySize as maximumHeapMemorySize, "
+            + "usedDirectMemorySize as directMemoryUsage, "
+            + "maximumDirectMemorySize as maximumDirectMemorySize, "
+            + "(statistics.processCpuLoad * 100) as cpuUsage, "
+            + "(select count(*) from certificate) as certificatesCount, "
+            + "(select count(*) from connection) as connectionCount, "
+            + "(select count(*) from exchange) as exchangesCount, "
+            + "(select count(*) from binding) as bindingsCount, "
+            + "(select count(*) from queue) as queuesCount, "
+            + "(select count(*) from user) as usersCount, "
+            // good queues have depth < 60%
+            + "(select count(*) "
+            + "from queue "
+            + "where name not in (select name from important_queues) "
+            + "or maximumQueueDepthMessages = -1 or maximumQueueDepthBytes = -1 "
+            + "or overflowPolicy = 'RING' "
+            + "and (queueDepthMessages < maximumQueueDepthMessages * 0.6 "
+            + "or queueDepthBytes < maximumQueueDepthBytes * 0.6)) as goodQueuesCount, "
+            // bad queues have depth > 60% and < 90%
+            + "(select count(*) "
+            + "from queue "
+            + "where name in (select name from important_queues) "
+            + "and maximumQueueDepthMessages != -1 and maximumQueueDepthBytes != -1 "
+            + "and overflowPolicy != 'RING' "
+            + "and (queueDepthMessages between (maximumQueueDepthMessages * 0.6, maximumQueueDepthMessages * 0.9) "
+            + "or queueDepthBytes between (maximumQueueDepthBytes * 0.6, maximumQueueDepthBytes * 0.9))) as badQueuesCount, "
+            // critical queues have depth > 90%
+            + "(select count(*) "
+            + "from queue "
+            + "where name in (select name from important_queues) "
+            + "and maximumQueueDepthMessages != -1 and maximumQueueDepthBytes != -1 "
+            + "and overflowPolicy != 'RING' "
+            + "and (queueDepthMessages > maximumQueueDepthMessages * 0.9 "
+            + "or queueDepthBytes > maximumQueueDepthBytes * 0.9)) as criticalQueuesCount "
+            + "from broker";
 
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals(1, result.size());
+        assertEquals("mock", result.get(0).get("label"));
+        assertEquals(6_000_000_000L, result.get(0).get("heapMemoryUsage"));
+        assertEquals(10_000_000_000L, result.get(0).get("maximumHeapMemorySize"));
+        assertEquals(500_000_000L, result.get(0).get("directMemoryUsage"));
+        assertEquals(1_500_000_000L, result.get(0).get("maximumDirectMemorySize"));
+        assertEquals(5.2, result.get(0).get("cpuUsage"));
+        assertEquals(10, result.get(0).get("certificatesCount"));
+        assertEquals(30, result.get(0).get("connectionCount"));
+        assertEquals(10, result.get(0).get("exchangesCount"));
+        assertEquals(10, result.get(0).get("bindingsCount"));
+        assertEquals(70, result.get(0).get("queuesCount"));
+        assertEquals(0, result.get(0).get("usersCount"));
+        assertEquals(65, result.get(0).get("goodQueuesCount"));
+        assertEquals(3, result.get(0).get("badQueuesCount"));
+        assertEquals(2, result.get(0).get("criticalQueuesCount"));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/CertificateQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/CertificateQueryTest.java
index 40959fad56..c5bfb4f072 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/CertificateQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/CertificateQueryTest.java
@@ -35,12 +35,15 @@ import org.apache.qpid.server.query.engine.evaluator.settings.DefaultQuerySettin
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.utils.QuerySettingsBuilder;
 
+/**
+ * Tests designed to verify the certificates retrieval
+ */
 public class CertificateQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     private final QuerySettings _querySettings = new QuerySettingsBuilder()
-        .zoneId(ZoneId.of(DefaultQuerySettings.ZONE_ID)).build();
+            .zoneId(ZoneId.of(DefaultQuerySettings.ZONE_ID)).build();
 
     @Test()
     public void selectAllCertificates()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConnectionQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConnectionQueryTest.java
index 819624b838..0fb2327a91 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConnectionQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConnectionQueryTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the connections retrieval
+ */
 public class ConnectionQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConsumerQueryTest.java
similarity index 51%
copy from broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java
copy to broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConsumerQueryTest.java
index b5b5867ae2..b54c8f3fe6 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/BindingQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/ConsumerQueryTest.java
@@ -30,47 +30,55 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
-public class BindingQueryTest
+/**
+ * Tests designed to verify the consumers retrieval
+ */
+public class ConsumerQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     @Test()
-    public void selectAllBindings()
+    public void selectAllConsumers()
     {
-        String query = "select * from binding";
+        String query = "select * from consumer";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals(10, result.size());
     }
 
     @Test()
-    public void countBindings()
+    public void countConsumers()
     {
-        String query = "select count(*) from binding";
+        String query = "select count(*) from consumer";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals(1, result.size());
         assertEquals(10, result.get(0).get("count(*)"));
     }
 
     @Test()
-    @SuppressWarnings("unchecked")
-    public void groupByExchange()
+    public void extractConnectionNameAndSessionName()
     {
-        String query = "select count(*), exchange from binding group by exchange";
+        String query = "select "
+            + "id, name, "
+            + "(select id from connection where substring(name, 1, position(']' in name)) = '[' + substring(c.name, 1, position('|' in c.name) - 1) + ']') as connectionId, "
+            + "(select name from connection where substring(name, 1, position(']' in name)) = '[' + substring(c.name, 1, position('|' in c.name) - 1) + ']') as connection, "
+            + "(select name from session where id = c.session.id) as session, "
+            + "session.id as sessionId "
+            + "from consumer c "
+            + "order by name";
+
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertEquals(1, result.size());
-        for (int i = 0; i < 10; i ++)
+
+        assertEquals(10, result.size());
+
+        for (Map<String, Object> stringObjectMap : result)
         {
-            assertEquals(1, ((Map<String, Object>) result.get(0).get("count(*)")).get("EXCHANGE_" + i));
-        }
-    }
+            String connectionQuery = "select id from connection where name = '" + stringObjectMap.get("connection") + "'";
+            String connectionId = (String) _queryEvaluator.execute(connectionQuery).getResults().get(0).get("id");
+            assertEquals(stringObjectMap.get("connectionId"), connectionId);
 
-    @Test()
-    @SuppressWarnings("unchecked")
-    public void groupByDestination()
-    {
-        String query = "select count(*), destination from binding group by destination";
-        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertEquals(1, result.size());
-        assertEquals(10, ((Map<String, Object>) result.get(0).get("count(*)")).get("QUEUE_1"));
+            String sessionQuery = "select name as name from session where id = '" + stringObjectMap.get("sessionId") + "'";
+            String sessionName = (String) _queryEvaluator.execute(sessionQuery).getResults().get(0).get("name");
+            assertEquals(stringObjectMap.get("session"), sessionName);
+        }
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
index 54a41fa95c..a68d3e4e00 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the domains retrieval
+ */
 public class DomainQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/PortQueryTest.java
similarity index 66%
copy from broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
copy to broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/PortQueryTest.java
index 54a41fa95c..cfab59da7b 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/PortQueryTest.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.query.engine.broker;
 
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
 
 import java.util.List;
 import java.util.Map;
@@ -30,15 +30,29 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
-public class DomainQueryTest
+/**
+ * Tests designed to verify the ports retrieval
+ */
+public class PortQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     @Test()
-    public void selectAllBindings()
+    public void allPorts()
+    {
+        String query = "select * from port";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(2, result.size());
+        assertEquals("amqpPort", result.get(0).get("name"));
+        assertEquals("httpPort", result.get(1).get("name"));
+    }
+
+    @Test()
+    public void countPorts()
     {
-        String query = "select * from domain";
+        String query = "select count(*) from port";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertFalse(result.isEmpty());
+        assertEquals(1, result.size());
+        assertEquals(2, result.get(0).get("count(*)"));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/QueueQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/QueueQueryTest.java
index b1712c8060..69ab81c8b8 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/QueueQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/QueueQueryTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.evaluator.settings.DefaultQuerySettings;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 
+/**
+ * Tests designed to verify the queues retrieval
+ */
 public class QueueQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -98,10 +101,10 @@ public class QueueQueryTest
     public void queuesByMessageDepth()
     {
         String query = "select * from queue "
-        + "where maximumQueueDepthMessages != -1 "
-        + "and maximumQueueDepthBytes != -1 "
-        + "and ((queueDepthMessages > maximumQueueDepthMessages * 0.6 and queueDepthMessages < maximumQueueDepthMessages * 0.9)"
-        + "or (queueDepthBytes > maximumQueueDepthBytes * 0.6 and queueDepthBytes < maximumQueueDepthBytes * 0.9))";
+            + "where maximumQueueDepthMessages != -1 "
+            + "and maximumQueueDepthBytes != -1 "
+            + "and ((queueDepthMessages > maximumQueueDepthMessages * 0.6 and queueDepthMessages < maximumQueueDepthMessages * 0.9)"
+            + "or (queueDepthBytes > maximumQueueDepthBytes * 0.6 and queueDepthBytes < maximumQueueDepthBytes * 0.9))";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals(10, result.size());
         for (int i = 50; i < 60; i++)
@@ -110,10 +113,10 @@ public class QueueQueryTest
         }
 
         query = "select * from queue "
-                + "where maximumQueueDepthMessages != -1 "
-                + "and maximumQueueDepthBytes != -1 "
-                + "and (queueDepthMessages > maximumQueueDepthMessages * 0.9"
-                + "or queueDepthBytes > maximumQueueDepthBytes * 0.9)";
+            + "where maximumQueueDepthMessages != -1 "
+            + "and maximumQueueDepthBytes != -1 "
+            + "and (queueDepthMessages > maximumQueueDepthMessages * 0.9"
+            + "or queueDepthBytes > maximumQueueDepthBytes * 0.9)";
         result = _queryEvaluator.execute(query).getResults();
         assertEquals(10, result.size());
         for (int i = 60; i < 70; i++)
@@ -122,8 +125,8 @@ public class QueueQueryTest
         }
 
         query = "select * from queue "
-                + "where maximumQueueDepthMessages != -1 " 
-                + "and maximumQueueDepthBytes != -1 ";
+            + "where maximumQueueDepthMessages != -1 "
+            + "and maximumQueueDepthBytes != -1 ";
         result = _queryEvaluator.execute(query).getResults();
         assertEquals(60, result.size());
         for (int i = 10; i < 70; i++)
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/SessionQueryTest.java
similarity index 61%
copy from broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java
copy to broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/SessionQueryTest.java
index f57a8df2be..5c462e1619 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/SessionQueryTest.java
@@ -18,7 +18,7 @@
  * under the License.
  *
  */
-package org.apache.qpid.server.query.engine.parsing.expression.logic;
+package org.apache.qpid.server.query.engine.broker;
 
 import static org.junit.Assert.assertEquals;
 
@@ -30,31 +30,32 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
-public class NotExpressionTest
+/**
+ * Tests designed to verify the sessions retrieval
+ */
+public class SessionQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     @Test()
-    public void not()
+    public void selectAllSessions()
     {
-        String query = "select not (true)";
+        String query = "select * from session";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertEquals(1, result.size());
-        assertEquals(false, result.get(0).get("not(true)"));
+        assertEquals(30, result.size());
 
-        query = "select not (false)";
-        result = _queryEvaluator.execute(query).getResults();
-        assertEquals(1, result.size());
-        assertEquals(true, result.get(0).get("not(false)"));
-
-        query = "select not (2 > 1)";
-        result = _queryEvaluator.execute(query).getResults();
-        assertEquals(1, result.size());
-        assertEquals(false, result.get(0).get("not(2>1)"));
+        for (Map<String, Object> stringObjectMap : result) {
+            String connectionQuery = "select name from connection where id = '" + stringObjectMap.get("connectionId") + "'";
+            assertEquals(1, _queryEvaluator.execute(connectionQuery).getResults().size());
+        }
+    }
 
-        query = "select not (2 < 1)";
-        result = _queryEvaluator.execute(query).getResults();
+    @Test()
+    public void countSessions()
+    {
+        String query = "select count(*) from session";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals(1, result.size());
-        assertEquals(true, result.get(0).get("not(2<1)"));
+        assertEquals(30, result.get(0).get("count(*)"));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostNodeQueryTest.java
similarity index 64%
copy from broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
copy to broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostNodeQueryTest.java
index 54a41fa95c..1bd9a53b21 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostNodeQueryTest.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.query.engine.broker;
 
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
 
 import java.util.List;
 import java.util.Map;
@@ -30,15 +30,29 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
-public class DomainQueryTest
+/**
+ * Tests designed to verify the virtual host nodes retrieval
+ */
+public class VirtualHostNodeQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     @Test()
-    public void selectAllBindings()
+    public void allVirtualhostNodes()
+    {
+        String query = "select * from virtualhostnode";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(2, result.size());
+        assertEquals("default", result.get(0).get("name"));
+        assertEquals("mock", result.get(1).get("name"));
+    }
+
+    @Test()
+    public void countVirtualhostNodes()
     {
-        String query = "select * from domain";
+        String query = "select count(*) from virtualhostnode";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertFalse(result.isEmpty());
+        assertEquals(1, result.size());
+        assertEquals(2, result.get(0).get("count(*)"));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostQueryTest.java
similarity index 66%
copy from broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
copy to broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostQueryTest.java
index 54a41fa95c..ea421dd0d7 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/DomainQueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/broker/VirtualHostQueryTest.java
@@ -20,7 +20,7 @@
  */
 package org.apache.qpid.server.query.engine.broker;
 
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
 
 import java.util.List;
 import java.util.Map;
@@ -30,15 +30,28 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
-public class DomainQueryTest
+/**
+ * Tests designed to verify the virtual hosts retrieval
+ */
+public class VirtualHostQueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
 
     @Test()
-    public void selectAllBindings()
+    public void allVirtualhosts()
+    {
+        String query = "select * from virtualhost";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals("default", result.get(0).get("name"));
+    }
+
+    @Test()
+    public void countVirtualhosts()
     {
-        String query = "select * from domain";
+        String query = "select count(*) from virtualhost";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertFalse(result.isEmpty());
+        assertEquals(1, result.size());
+        assertEquals(1, result.get(0).get("count(*)"));
     }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluatorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluatorTest.java
index f4b2751287..838afe25e3 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluatorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/evaluator/QueryEvaluatorTest.java
@@ -30,6 +30,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 
+/**
+ * Tests designed to verify the {@link QueryEvaluator} functionality
+ */
 public class QueryEvaluatorTest
 {
     @Test()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/converter/DateTimeConverterTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/converter/DateTimeConverterTest.java
index 153c47793c..b61eacdf71 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/converter/DateTimeConverterTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/converter/DateTimeConverterTest.java
@@ -40,14 +40,16 @@ import org.junit.Test;
 
 import org.apache.qpid.server.query.engine.evaluator.EvaluationContext;
 import org.apache.qpid.server.query.engine.evaluator.EvaluationContextHolder;
-import org.apache.qpid.server.query.engine.evaluator.settings.DefaultQuerySettings;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 
+/**
+ * Tests designed to verify the {@link DateTimeConverter} functionality
+ */
 public class DateTimeConverterTest
 {
-    private final DateTimeFormatter _formatter = new DateTimeFormatterBuilder().appendPattern(DefaultQuerySettings.DATE_TIME_PATTERN)
+    private final DateTimeFormatter _formatter = new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd HH:mm:ss")
         .appendFraction(ChronoField.NANO_OF_SECOND, 0, 6, true)
-        .toFormatter().withZone(ZoneId.of(DefaultQuerySettings.ZONE_ID)).withResolverStyle(ResolverStyle.STRICT);
+        .toFormatter().withZone(ZoneId.of("UTC")).withResolverStyle(ResolverStyle.STRICT);
 
     @Test()
     public void isDateTime()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/accessor/ChainedAccessorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/accessor/ChainedAccessorTest.java
index 3455b95ee2..3464582254 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/accessor/ChainedAccessorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/accessor/ChainedAccessorTest.java
@@ -31,6 +31,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link ChainedObjectAccessor} functionality
+ */
 public class ChainedAccessorTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/ArithmeticExpressionsTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/ArithmeticExpressionsTest.java
index 918abdd563..0c9c22c56e 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/ArithmeticExpressionsTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/ArithmeticExpressionsTest.java
@@ -35,6 +35,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the arithmetic expressions functionality
+ */
 public class ArithmeticExpressionsTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/NumericTypeConversionsTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/NumericTypeConversionsTest.java
index 561340400b..b836bd28c7 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/NumericTypeConversionsTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/arithmetic/NumericTypeConversionsTest.java
@@ -32,6 +32,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the numeric type conversions functionality
+ */
 public class NumericTypeConversionsTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/BetweenExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/BetweenExpressionTest.java
index 2d8ef249c7..59b93a1073 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/BetweenExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/BetweenExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link BetweenExpression} functionality
+ */
 public class BetweenExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/EqualExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/EqualExpressionTest.java
index db9bae7c6b..f5234809e2 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/EqualExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/EqualExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link EqualExpression} functionality
+ */
 public class EqualExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanExpressionTest.java
index 6bfe2f3f94..f27d576064 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link GreaterThanExpression} functionality
+ */
 public class GreaterThanExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanOrEqualExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanOrEqualExpressionTest.java
index 95ff61db93..84b2660f57 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanOrEqualExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/GreaterThanOrEqualExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link GreaterThanOrEqualExpression} functionality
+ */
 public class GreaterThanOrEqualExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/InExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/InExpressionTest.java
index a6dda4c7c8..ec0f7d1c82 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/InExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/InExpressionTest.java
@@ -31,6 +31,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link InExpression} functionality
+ */
 public class InExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -213,6 +216,40 @@ public class InExpressionTest
         assertEquals(false, result.get(0).get("result"));
     }
 
+    @Test()
+    public void notInSelect()
+    {
+        String query = "select 'FLOW_TO_DISK' not in (select distinct overflowPolicy from queue) as result";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(false, result.get(0).get("result"));
+
+        query = "select 'RING' not in (select distinct overflowPolicy from queue) as result";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(false, result.get(0).get("result"));
+
+        query = "select 'REJECT' not  in (select distinct overflowPolicy from queue) as result";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(false, result.get(0).get("result"));
+
+        query = "select 'PRODUCER_FLOW_CONTROL' not in (select distinct overflowPolicy from queue) as result";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(false, result.get(0).get("result"));
+
+        query = "select 'NONE' not in (select distinct overflowPolicy from queue) as result";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(false, result.get(0).get("result"));
+
+        query = "select 'UNKNOWN' not in (select distinct overflowPolicy from queue) as result";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(1, result.size());
+        assertEquals(true, result.get(0).get("result"));
+    }
+
     @Test()
     public void inList()
     {
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/IsNullExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/IsNullExpressionTest.java
index 195d5b08d8..ba45d88b45 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/IsNullExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/IsNullExpressionTest.java
@@ -31,6 +31,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link IsNullExpression} functionality
+ */
 public class IsNullExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanExpressionTest.java
index 57e42613b3..a12b0f86ff 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link LessThanExpression} functionality
+ */
 public class LessThanExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanOrEqualExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanOrEqualExpressionTest.java
index 483ee93994..13e6eb9948 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanOrEqualExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LessThanOrEqualExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link LessThanOrEqualExpression} functionality
+ */
 public class LessThanOrEqualExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LikeExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LikeExpressionTest.java
index 5ad27f9887..d7c4e96626 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LikeExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/comparison/LikeExpressionTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link LikeExpression} functionality
+ */
 public class LikeExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/conditional/CaseExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/conditional/CaseExpressionTest.java
index 6b4770f639..3c9ee543d0 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/conditional/CaseExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/conditional/CaseExpressionTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link CaseExpression} functionality
+ */
 public class CaseExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/AvgExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/AvgExpressionTest.java
index fe8a1719cf..76e246cd0d 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/AvgExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/AvgExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link AvgExpression} functionality
+ */
 public class AvgExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/CountExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/CountExpressionTest.java
index f40372b0ce..813fda0c36 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/CountExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/CountExpressionTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link CountExpression} functionality
+ */
 public class CountExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/GroupByTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/GroupByTest.java
index 0b6ce54cb5..fdad5a8849 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/GroupByTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/GroupByTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class grouping functionality
+ */
 public class GroupByTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MaxExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MaxExpressionTest.java
index 8f52551a5f..da4d44aff2 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MaxExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MaxExpressionTest.java
@@ -43,6 +43,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.EvaluationContextHolder;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link MaxExpression} functionality
+ */
 public class MaxExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MinExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MinExpressionTest.java
index f1180872b2..31da39a98b 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MinExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/MinExpressionTest.java
@@ -43,6 +43,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.EvaluationContextHolder;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link MinExpression} functionality
+ */
 public class MinExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/SumExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/SumExpressionTest.java
index bd676ff778..b89efa7269 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/SumExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/aggregation/SumExpressionTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link SumExpression} functionality
+ */
 public class SumExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/CurrentTimestampExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/CurrentTimestampExpressionTest.java
index 21e2545546..162ae50cad 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/CurrentTimestampExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/CurrentTimestampExpressionTest.java
@@ -36,6 +36,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 import org.apache.qpid.server.query.engine.utils.QuerySettingsBuilder;
 
+/**
+ * Tests designed to verify the public class {@link CurrentTimestampExpression} functionality
+ */
 public class CurrentTimestampExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -53,7 +56,7 @@ public class CurrentTimestampExpressionTest
     @Test()
     public void comparingDatetimes()
     {
-        QuerySettings querySettings = new QuerySettingsBuilder().zoneId(ZoneId.systemDefault()).build();
+        QuerySettings querySettings = new QuerySettingsBuilder().zoneId(ZoneId.of("UTC")).build();
 
         String query = "select name from virtualhostnode where createdTime < '2001-01-01 12:55:31.000'";
         List<Map<String, Object>> result = _queryEvaluator.execute(query, querySettings).getResults();
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateAddExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateAddExpressionTest.java
index b0315cf264..e720fae5d8 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateAddExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateAddExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link DateAddExpression} functionality
+ */
 public class DateAddExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateDiffExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateDiffExpressionTest.java
index 21a6c49bb0..c3dd40c833 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateDiffExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateDiffExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link DateDiffExpression} functionality
+ */
 public class DateDiffExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateExpressionTest.java
index a848241f61..ac2415c1d7 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/DateExpressionTest.java
@@ -13,6 +13,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 
+/**
+ * Tests designed to verify the public class {@link DateExpression} functionality
+ */
 public class DateExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/ExtractExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/ExtractExpressionTest.java
index 2b77235376..80269aed8d 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/ExtractExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/datetime/ExtractExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link ExtractExpression} functionality
+ */
 public class ExtractExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/nulls/CoalesceExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/nulls/CoalesceExpressionTest.java
index ebf71dc1a9..da655987de 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/nulls/CoalesceExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/nulls/CoalesceExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link CoalesceExpression} functionality
+ */
 public class CoalesceExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/AbsExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/AbsExpressionTest.java
index 1c68692d46..8f431e5b92 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/AbsExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/AbsExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link AbsExpression} functionality
+ */
 public class AbsExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/RoundExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/RoundExpressionTest.java
index 2322b67d8a..e9efd5726d 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/RoundExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/RoundExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link RoundExpression} functionality
+ */
 public class RoundExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/TruncExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/TruncExpressionTest.java
index 6a1b3e6425..4d4d88eed2 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/TruncExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/numeric/TruncExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link TruncExpression} functionality
+ */
 public class TruncExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ConcatExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ConcatExpressionTest.java
index 087f134c10..baee316ca7 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ConcatExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ConcatExpressionTest.java
@@ -21,7 +21,6 @@
 package org.apache.qpid.server.query.engine.parsing.expression.function.string;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import java.math.BigDecimal;
@@ -39,6 +38,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the public class {@link ConcatExpression} functionality
+ */
 public class ConcatExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LeftTrimExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LeftTrimExpressionTest.java
index a7cf7c8695..ba63f9e535 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LeftTrimExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LeftTrimExpressionTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the public class {@link LeftTrimExpression} functionality
+ */
 public class LeftTrimExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LengthExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LengthExpressionTest.java
index e3d32a3d92..f11aa01ba8 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LengthExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LengthExpressionTest.java
@@ -21,7 +21,6 @@
 package org.apache.qpid.server.query.engine.parsing.expression.function.string;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import java.math.BigDecimal;
@@ -35,6 +34,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the public class {@link LengthExpression} functionality
+ */
 public class LengthExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LowerExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LowerExpressionTest.java
index 453cd4fe8e..f8e33b7400 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LowerExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/LowerExpressionTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the public class {@link LowerExpression} functionality
+ */
 public class LowerExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/PositionExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/PositionExpressionTest.java
index ec94286571..73e3756b8b 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/PositionExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/PositionExpressionTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the public class {@link PositionExpression} functionality
+ */
 public class PositionExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ReplaceExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ReplaceExpressionTest.java
index ae7105efef..fc1cd5e9c2 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ReplaceExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/ReplaceExpressionTest.java
@@ -34,6 +34,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the {@link ReplaceExpression} functionality
+ */
 public class ReplaceExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/RightTrimExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/RightTrimExpressionTest.java
index f678ec56ba..c4b9b27299 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/RightTrimExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/RightTrimExpressionTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the {@link RightTrimExpression} functionality
+ */
 public class RightTrimExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/SubstringExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/SubstringExpressionTest.java
index e420ff488f..9ccecb0255 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/SubstringExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/SubstringExpressionTest.java
@@ -36,11 +36,13 @@ import java.util.Map;
 import org.junit.Test;
 
 import org.apache.qpid.server.query.engine.TestBroker;
-import org.apache.qpid.server.query.engine.evaluator.settings.DefaultQuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link SubstringExpression} functionality
+ */
 public class SubstringExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -352,9 +354,9 @@ public class SubstringExpressionTest
     @Test()
     public void dateArgument()
     {
-        DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern(DefaultQuerySettings.DATE_TIME_PATTERN)
+        DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("uuuu-MM-dd HH:mm:ss")
             .appendFraction(ChronoField.NANO_OF_SECOND, 0, 6, true)
-            .toFormatter().withZone(ZoneId.of(DefaultQuerySettings.ZONE_ID)).withResolverStyle(ResolverStyle.STRICT);
+            .toFormatter().withZone(ZoneId.of("UTC")).withResolverStyle(ResolverStyle.STRICT);
 
         String query = "select substring(lastUpdatedTime, 1) as result from queue where name='QUEUE_0'";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/TrimExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/TrimExpressionTest.java
index dcdac7e867..5bc0548eac 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/TrimExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/TrimExpressionTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the {@link TrimExpression} functionality
+ */
 public class TrimExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/UpperExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/UpperExpressionTest.java
index 04af1cfcf4..de325be07e 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/UpperExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/function/string/UpperExpressionTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.parsing.converter.DateTimeConverter;
 
+/**
+ * Tests designed to verify the {@link UpperExpression} functionality
+ */
 public class UpperExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/literal/LiteralExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/literal/LiteralExpressionTest.java
index b0c31794c2..fd588a28cf 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/literal/LiteralExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/literal/LiteralExpressionTest.java
@@ -32,6 +32,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the literal expressions functionality
+ */
 public class LiteralExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/AndExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/AndExpressionTest.java
index 37a16006ab..02d0c07df5 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/AndExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/AndExpressionTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link AndExpression} functionality
+ */
 public class AndExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java
index f57a8df2be..968a297509 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/NotExpressionTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link NotExpression} functionality
+ */
 public class NotExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/OrExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/OrExpressionTest.java
index d72a2eedab..03e9bbf1a1 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/OrExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/logic/OrExpressionTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the {@link OrExpression} functionality
+ */
 public class OrExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/IntersectExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/IntersectExpressionTest.java
index baddb93fd3..b158fb5bc0 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/IntersectExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/IntersectExpressionTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the {@link IntersectExpression} functionality
+ */
 public class IntersectExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/MinusExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/MinusExpressionTest.java
index a0ac9a0f23..b68b3e3361 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/MinusExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/MinusExpressionTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the {@link MinusExpression} functionality
+ */
 public class MinusExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/UnionExpressionTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/UnionExpressionTest.java
index 08055b6c07..d4577cb028 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/UnionExpressionTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/expression/set/UnionExpressionTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the {@link UnionExpression} functionality
+ */
 public class UnionExpressionTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/AccessorExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/AccessorExpressionFactoryTest.java
index 420004a18c..5b33e1e6ad 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/AccessorExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/AccessorExpressionFactoryTest.java
@@ -39,6 +39,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.accessor.Delegatin
 import org.apache.qpid.server.query.engine.parsing.expression.accessor.DelegatingObjectAccessor;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 
+/**
+ * Tests designed to verify the {@link AccessorExpressionFactory} functionality
+ */
 public class AccessorExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ArithmeticExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ArithmeticExpressionFactoryTest.java
index 86d1d87f4e..9b5a8c5c49 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ArithmeticExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ArithmeticExpressionFactoryTest.java
@@ -36,6 +36,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.parsing.expression.ExpressionNode;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 
+/**
+ * Tests designed to verify the {@link ArithmeticExpressionFactory} functionality
+ */
 public class ArithmeticExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/CollectorFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/CollectorFactoryTest.java
index d615f44932..a65ee9bd7c 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/CollectorFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/CollectorFactoryTest.java
@@ -40,6 +40,9 @@ import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.parsing.collector.CollectorType;
 import org.apache.qpid.server.query.engine.parsing.expression.accessor.MapObjectAccessor;
 
+/**
+ * Tests designed to verify the {@link CollectorFactory} functionality
+ */
 public class CollectorFactoryTest
 {
     private final List<Map<String, Object>> _entities = Arrays.asList(
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ComparisonExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ComparisonExpressionFactoryTest.java
index 7fde22e926..4c7d5e5697 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ComparisonExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ComparisonExpressionFactoryTest.java
@@ -48,6 +48,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantEx
 import org.apache.qpid.server.query.engine.parsing.expression.logic.NotExpression;
 import org.apache.qpid.server.query.engine.parsing.query.SelectExpression;
 
+/**
+ * Tests designed to verify the {@link ComparisonExpressionFactory} functionality
+ */
 public class ComparisonExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ConditionalExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ConditionalExpressionFactoryTest.java
index e5f9cee373..fc932ccb7d 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ConditionalExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ConditionalExpressionFactoryTest.java
@@ -38,6 +38,9 @@ import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 
+/**
+ * Tests designed to verify the {@link ConditionalExpressionFactory} functionality
+ */
 public class ConditionalExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/FunctionExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/FunctionExpressionFactoryTest.java
index a7d1a12d18..91f4743ae1 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/FunctionExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/FunctionExpressionFactoryTest.java
@@ -62,6 +62,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.function.string.Tr
 import org.apache.qpid.server.query.engine.parsing.expression.function.string.UpperExpression;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 
+/**
+ * Tests designed to verify the {@link FunctionExpressionFactory} functionality
+ */
 public class FunctionExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LiteralExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LiteralExpressionFactoryTest.java
index e6dca342d5..0a4b59c706 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LiteralExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LiteralExpressionFactoryTest.java
@@ -37,6 +37,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.literal.NumberLite
 import org.apache.qpid.server.query.engine.parsing.expression.literal.StringLiteralExpression;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.TrueLiteralExpression;
 
+/**
+ * Tests designed to verify the {@link LiteralExpressionFactory} functionality
+ */
 public class LiteralExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LogicExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LogicExpressionFactoryTest.java
index b0e663697e..445dfb2526 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LogicExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/LogicExpressionFactoryTest.java
@@ -39,6 +39,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.logic.AndExpressio
 import org.apache.qpid.server.query.engine.parsing.expression.logic.NotExpression;
 import org.apache.qpid.server.query.engine.parsing.expression.logic.OrExpression;
 
+/**
+ * Tests designed to verify the {@link LogicExpressionFactory} functionality
+ */
 public class LogicExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/NumberExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/NumberExpressionFactoryTest.java
index 26d9721171..4ab808d73b 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/NumberExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/NumberExpressionFactoryTest.java
@@ -31,6 +31,9 @@ import org.apache.qpid.server.query.engine.evaluator.EvaluationContext;
 import org.apache.qpid.server.query.engine.evaluator.EvaluationContextHolder;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 
+/**
+ * Tests designed to verify the {@link NumberExpressionFactory} functionality
+ */
 public class NumberExpressionFactoryTest
 {
 
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ProjectionExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ProjectionExpressionFactoryTest.java
index 7db354d6b5..e1038ff628 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ProjectionExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/ProjectionExpressionFactoryTest.java
@@ -35,6 +35,9 @@ import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 
+/**
+ * Tests designed to verify the {@link ProjectionExpressionFactory} functionality
+ */
 public class ProjectionExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/SetExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/SetExpressionFactoryTest.java
index 307e31f40b..724fc15ab5 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/SetExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/SetExpressionFactoryTest.java
@@ -38,6 +38,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.set.MinusExpressio
 import org.apache.qpid.server.query.engine.parsing.expression.set.UnionExpression;
 import org.apache.qpid.server.query.engine.parsing.query.SelectExpression;
 
+/**
+ * Tests designed to verify the {@link SetExpressionFactory} functionality
+ */
 public class SetExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/UnaryExpressionFactoryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/UnaryExpressionFactoryTest.java
index 2258e96bf6..e471cd143f 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/UnaryExpressionFactoryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/factory/UnaryExpressionFactoryTest.java
@@ -37,6 +37,9 @@ import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.parsing.expression.ExpressionNode;
 import org.apache.qpid.server.query.engine.parsing.expression.literal.NullLiteralExpression;
 
+/**
+ * Tests designed to verify the {@link UnaryExpressionFactory} functionality
+ */
 public class UnaryExpressionFactoryTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/AliasTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/AliasTest.java
index eebf7b1a08..086eac36d2 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/AliasTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/AliasTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 
+/**
+ * Tests designed to verify the aliases functionality
+ */
 public class AliasTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
@@ -205,7 +208,7 @@ public class AliasTest
     {
         String query = "select e.name from exchange e";
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
-        assertEquals(14, result.size());
+        assertEquals(10, result.size());
         assertEquals("e.name", result.get(0).keySet().iterator().next());
     }
 
@@ -230,6 +233,77 @@ public class AliasTest
         assertEquals("current_timestamp()", result.get(0).keySet().iterator().next());
     }
 
+    @Test()
+    public void date()
+    {
+        String query = "select date(validUntil) from certificate";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("date(validUntil)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void dateadd()
+    {
+        String query = "select dateadd(day, -30, validUntil) from certificate";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("dateadd(day, -30, validUntil)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void datediff()
+    {
+        String query = "select datediff(day, current_timestamp(), validUntil) from certificate";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("datediff(day, current_timestamp(), validUntil)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void extract()
+    {
+        String query = "select extract(year from validUntil) from certificate";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(year from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(month from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(month from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(week from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(week from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(day from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(day from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(hour from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(hour from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(minute from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(minute from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(second from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(second from validUntil)", result.get(0).keySet().iterator().next());
+
+        query = "select extract(millisecond from validUntil) from certificate";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals(10, result.size());
+        assertEquals("extract(millisecond from validUntil)", result.get(0).keySet().iterator().next());
+    }
+
     @Test()
     public void in()
     {
@@ -242,6 +316,34 @@ public class AliasTest
         assertEquals("1 not in ('1','test',1)", result.get(0).keySet().iterator().next());
     }
 
+    @Test()
+    public void len()
+    {
+        String query = "select len(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("len(name)", result.get(0).keySet().iterator().next());
+
+        query = "select length(name) from queue";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals("length(name)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void lower()
+    {
+        String query = "select lower(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("lower(name)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void ltrim()
+    {
+        String query = "select ltrim(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("ltrim(name)", result.get(0).keySet().iterator().next());
+    }
+
     @Test()
     public void max()
     {
@@ -258,6 +360,42 @@ public class AliasTest
         assertEquals("min(queueDepthMessages)", result.get(0).keySet().iterator().next());
     }
 
+    @Test()
+    public void position()
+    {
+        String query = "select position('_' in name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("position('_' in name)", result.get(0).keySet().iterator().next());
+
+        query = "select position('_' in name, 1) from queue";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals("position('_' in name,1)", result.get(0).keySet().iterator().next());
+
+        query = "select position('_', name) from queue";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals("position('_',name)", result.get(0).keySet().iterator().next());
+
+        query = "select position('_', name, 1) from queue";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals("position('_',name,1)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void replace()
+    {
+        String query = "select replace(name, '_', '') from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("replace(name, '_', '')", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void rtrim()
+    {
+        String query = "select rtrim(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("rtrim(name)", result.get(0).keySet().iterator().next());
+    }
+
     @Test()
     public void subquery()
     {
@@ -266,6 +404,18 @@ public class AliasTest
         assertEquals("select count(*) from queue where queueDepthMessages>0.6*maximumQueueDepthMessages", result.get(0).keySet().iterator().next());
     }
 
+    @Test()
+    public void substring()
+    {
+        String query = "select substring(name, 2) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("substring(name, 2)", result.get(0).keySet().iterator().next());
+
+        query = "select substring(name, 2, 5) from queue";
+        result = _queryEvaluator.execute(query).getResults();
+        assertEquals("substring(name, 2, 5)", result.get(0).keySet().iterator().next());
+    }
+
     @Test()
     public void sum()
     {
@@ -273,4 +423,20 @@ public class AliasTest
         List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
         assertEquals("sum(queueDepthMessages)", result.get(0).keySet().iterator().next());
     }
+
+    @Test()
+    public void trim()
+    {
+        String query = "select trim(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("trim(name)", result.get(0).keySet().iterator().next());
+    }
+
+    @Test()
+    public void upper()
+    {
+        String query = "select upper(name) from queue";
+        List<Map<String, Object>> result = _queryEvaluator.execute(query).getResults();
+        assertEquals("upper(name)", result.get(0).keySet().iterator().next());
+    }
 }
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/HavingTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/HavingTest.java
index 01916cb916..3408d3088f 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/HavingTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/HavingTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 
+/**
+ * Tests designed to verify the {@link HavingExpression} functionality
+ */
 @SuppressWarnings("unchecked")
 public class HavingTest
 {
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/OrderByTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/OrderByTest.java
index 4ed3d70168..40114147e1 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/OrderByTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/OrderByTest.java
@@ -38,6 +38,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the ordering functionality
+ */
 public class OrderByTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QuerySettingsTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QuerySettingsTest.java
index 0b91818fc1..5d69c260b6 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QuerySettingsTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QuerySettingsTest.java
@@ -48,6 +48,9 @@ import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.utils.QuerySettingsBuilder;
 
+/**
+ * Tests designed to verify the {@link QuerySettings} functionality
+ */
 public class QuerySettingsTest
 {
     private final Broker<?> _broker = TestBroker.createBroker();
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QueryValidatorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QueryValidatorTest.java
index aa50736b77..daa9b36d51 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QueryValidatorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/QueryValidatorTest.java
@@ -30,6 +30,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 
+/**
+ * Tests designed to verify the query validation functionality
+ */
 public class QueryValidatorTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/SubqueryTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/SubqueryTest.java
index 04c2a40192..d64fe96d6f 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/SubqueryTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/SubqueryTest.java
@@ -33,6 +33,9 @@ import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryEvaluationException;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the subqueries functionality
+ */
 public class SubqueryTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/WithTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/WithTest.java
index 2273aa4f58..a456ebe86f 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/WithTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/parsing/query/WithTest.java
@@ -32,6 +32,9 @@ import org.apache.qpid.server.query.engine.TestBroker;
 import org.apache.qpid.server.query.engine.evaluator.QueryEvaluator;
 import org.apache.qpid.server.query.engine.exception.QueryParsingException;
 
+/**
+ * Tests designed to verify the WITH clause functionality
+ */
 public class WithTest
 {
     private final QueryEvaluator _queryEvaluator = new QueryEvaluator(TestBroker.createBroker());
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/utils/QuerySettingsBuilder.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/utils/QuerySettingsBuilder.java
index e2c2d4d819..9c55715bdc 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/utils/QuerySettingsBuilder.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/utils/QuerySettingsBuilder.java
@@ -26,6 +26,9 @@ import java.time.ZoneId;
 import org.apache.qpid.server.query.engine.evaluator.DateFormat;
 import org.apache.qpid.server.query.engine.evaluator.settings.QuerySettings;
 
+/**
+ * Helper class for building {@link QuerySettings} instances
+ */
 public class QuerySettingsBuilder
 {
     private DateFormat _dateTimeFormat;
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParameterTypePredicateTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParameterTypePredicateTest.java
index 420e474653..732f3fcd2d 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParameterTypePredicateTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParameterTypePredicateTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
 package org.apache.qpid.server.query.engine.validation;
 
 import static org.junit.Assert.assertEquals;
@@ -18,6 +38,9 @@ import org.apache.qpid.server.model.OverflowPolicy;
 import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 
+/**
+ * Tests designed to verify the {@link FunctionParameterTypePredicate} functionality
+ */
 public class FunctionParameterTypePredicateTest
 {
     @Test()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParametersValidatorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParametersValidatorTest.java
index 2ad552c018..454d0af1b8 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParametersValidatorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/FunctionParametersValidatorTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
 package org.apache.qpid.server.query.engine.validation;
 
 import static org.junit.Assert.assertEquals;
@@ -19,6 +39,9 @@ import org.apache.qpid.server.query.engine.parsing.expression.function.AbstractF
 import org.apache.qpid.server.query.engine.parsing.expression.literal.ConstantExpression;
 import org.apache.qpid.server.query.engine.parsing.factory.FunctionExpressionFactory;
 
+/**
+ * Tests designed to verify the {@link FunctionParametersValidator} functionality
+ */
 public class FunctionParametersValidatorTest
 {
     @Before()
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/QueryExpressionValidatorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/QueryExpressionValidatorTest.java
index ad44be9f18..37bf3a96c3 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/QueryExpressionValidatorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/QueryExpressionValidatorTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
 package org.apache.qpid.server.query.engine.validation;
 
 import static org.junit.Assert.assertEquals;
@@ -15,6 +35,9 @@ import org.apache.qpid.server.query.engine.exception.Errors;
 import org.apache.qpid.server.query.engine.exception.QueryValidationException;
 import org.apache.qpid.server.query.engine.parsing.query.QueryExpression;
 
+/**
+ * Tests designed to verify the {@link QueryExpressionValidator} functionality
+ */
 public class QueryExpressionValidatorTest
 {
     private final QueryExpressionValidator _validator = new QueryExpressionValidator();
diff --git a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/SelectExpressionValidatorTest.java b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/SelectExpressionValidatorTest.java
index fb68001878..30e6bc43f3 100644
--- a/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/SelectExpressionValidatorTest.java
+++ b/broker-plugins/broker-query-engine/src/test/java/org/apache/qpid/server/query/engine/validation/SelectExpressionValidatorTest.java
@@ -1,3 +1,23 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
 package org.apache.qpid.server.query.engine.validation;
 
 import static org.junit.Assert.assertEquals;
@@ -17,6 +37,9 @@ import org.apache.qpid.server.query.engine.parsing.ExpressionParser;
 import org.apache.qpid.server.query.engine.parsing.query.QueryExpression;
 import org.apache.qpid.server.query.engine.parsing.query.SelectExpression;
 
+/**
+ * Tests designed to verify the {@link SelectExpressionValidator} functionality
+ */
 public class SelectExpressionValidatorTest
 {
     private final SelectExpressionValidator _validator = new SelectExpressionValidator();
diff --git a/doc/java-broker/src/docbkx/management/channels/Java-Broker-Management-Channel-REST-Query-Engine.xml b/doc/java-broker/src/docbkx/management/channels/Java-Broker-Management-Channel-REST-Query-Engine.xml
index 4c00341a89..d346ddc8cb 100644
--- a/doc/java-broker/src/docbkx/management/channels/Java-Broker-Management-Channel-REST-Query-Engine.xml
+++ b/doc/java-broker/src/docbkx/management/channels/Java-Broker-Management-Channel-REST-Query-Engine.xml
@@ -3405,6 +3405,115 @@
         </programlisting>
     </section>
 
+    <section xml:id="Java-Broker-Management-Channel-REST-Query-Engine-Subqueries">
+        <title>Subqueries</title>
+        <para>
+            When executing subquery parent query domain mat be passed into the subquery using alias.
+            E.g. this query
+        </para>
+        <programlisting language="sql">
+    SELECT
+        id,
+        name,
+        (SELECT name FROM connection WHERE SUBSTRING(name, 1, POSITION(']' IN name)) = '[' + SUBSTRING(c.name, 1, POSITION('|' IN c.name) - 1) + ']') as connection,
+        (SELECT id FROM connection WHERE SUBSTRING(name, 1, POSITION(']' IN name)) = '[' + SUBSTRING(c.name, 1, POSITION('|' IN c.name) - 1) + ']') as connectionId,
+        (SELECT name FROM session WHERE id = c.session.id) as session
+    FROM consumer c
+        </programlisting>
+        <para>
+            returns following result:
+        </para>
+        <programlisting language="javascript">
+    {
+        "results": [
+            {
+                "id": "7a4d7a86-652b-4112-b535-61272b936b57",
+                "name": "1|1|qpid-jms:receiver:ID:6bd18833-3c96-4936-b9ee-9dec5f408b5c:1:1:1:broadcast.amqp_user1.public",
+                "connection": "[1] 127.0.0.1:39134",
+                "connectionId": "afbd0480-43b1-4b39-bc00-260c077095f3",
+                "session": "1"
+            }
+        ],
+        "total": 1
+    }
+        </programlisting>
+        <para>
+            Query
+        </para>
+        <programlisting language="sql">
+    SELECT
+        name,
+        destination,
+        (SELECT id FROM queue WHERE name = b.destination) AS destinationId,
+        exchange,
+        (SELECT id FROM exchange WHERE name = b.exchange) AS exchangeId
+    FROM binding b
+    WHERE name = 'broadcast.amqp_user1.xxx.#'
+        </programlisting>
+        <para>
+            returns following result:
+        </para>
+        <programlisting language="javascript">
+    {
+        "results": [
+            {
+                "name": "broadcast.amqp_user1.xxx.#",
+                "destination": "broadcast.amqp_user1.xxx",
+                "destinationId": "d5ce9e78-8558-40db-8690-15abf69ab255",
+                "exchange": "broadcast",
+                "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+            },
+            {
+                "name": "broadcast.amqp_user1.xxx.#",
+                "destination": "broadcast.amqp_user2.xxx",
+                "destinationId": "88357d15-a590-4ccf-aee8-2d5cda77752e",
+                "exchange": "broadcast",
+                "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+            },
+            {
+                "name": "broadcast.amqp_user1.xxx.#",
+                "destination": "broadcast.amqp_user3.xxx",
+                "destinationId": "c8200f89-2587-4b0c-a8f6-120cda975d03",
+                "exchange": "broadcast",
+                "exchangeId": "470273aa-7243-4cb7-80ec-13e698c36158"
+            }
+        ],
+        "total": 3
+    }
+        </programlisting>
+        <para>
+            Query
+        </para>
+        <programlisting language="sql">
+    SELECT
+        alias,
+        (SELECT COUNT(id) FROM queue WHERE POSITION(UPPER(c.alias) IN name) > 0) AS queueCount
+    FROM certificate c
+        </programlisting>
+        <para>
+            returns following result:
+        </para>
+        <programlisting language="javascript">
+    {
+        "results": [
+            {
+                "alias": "xxx",
+                "queueCount": 5
+            },
+            {
+                "alias": "xxy",
+                "queueCount": 5
+            },
+            {
+                "alias": "xxz",
+                "queueCount": 7
+            }
+        ],
+        "total": 3
+    }
+        </programlisting>
+    </section>
+
     <section xml:id="Java-Broker-Management-Channel-REST-Query-Engine-Performance-Tips">
         <title>Performance Tips</title>
         <para>
diff --git a/pom.xml b/pom.xml
index 3ac6ad35f0..8590c80c67 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,6 +142,8 @@
 
     <exec-maven-plugin-version>1.6.0</exec-maven-plugin-version>
     <javacc-maven-plugin-version>2.6</javacc-maven-plugin-version>
+    <ph-javacc-maven-plugin-version>4.1.5</ph-javacc-maven-plugin-version>
+    <maven-enforcer-plugin-version>3.0.0-M2</maven-enforcer-plugin-version>
     <maven-rar-plugin-version>2.4</maven-rar-plugin-version>
     <license-maven-plugin-version>1.8</license-maven-plugin-version>
     <maven-jxr-plugin-version>3.0.0</maven-jxr-plugin-version>
@@ -939,7 +941,17 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-enforcer-plugin</artifactId>
-          <version>3.0.0-M2</version>
+          <version>${maven-enforcer-plugin-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>javacc-maven-plugin</artifactId>
+          <version>${javacc-maven-plugin-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>com.helger.maven</groupId>
+          <artifactId>ph-javacc-maven-plugin</artifactId>
+          <version>${ph-javacc-maven-plugin-version}</version>
         </plugin>
       </plugins>
     </pluginManagement>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org