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

tabish pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit d45558bb8cde2d1ae7a3f21237a5ba9b6cb5c401
Author: Andy Taylor <[email protected]>
AuthorDate: Fri Feb 6 15:20:25 2026 -0600

    ARTEMIS-5782 allow searching on multiple attributes
---
 .../management/impl/view/ActiveMQAbstractView.java |  53 +++++-
 .../core/management/impl/view/AddressView.java     |   5 +-
 .../core/management/impl/view/ConnectionView.java  |   3 +-
 .../core/management/impl/view/ConsumerView.java    |   3 +-
 .../core/management/impl/view/ProducerView.java    |   3 +-
 .../core/management/impl/view/QueueView.java       |   3 +-
 .../core/management/impl/view/SessionView.java     |   3 +-
 .../view/predicate/ActiveMQFilterPredicate.java    | 164 ++---------------
 .../view/predicate/AddressFilterPredicate.java     |  58 +-----
 .../view/predicate/AddressPredicateFilterPart.java |  69 +++++++
 .../view/predicate/ConnectionFilterPredicate.java  |  55 +-----
 ...ate.java => ConnectionPredicateFilterPart.java} |  48 +++--
 .../view/predicate/ConsumerFilterPredicate.java    |  48 +----
 ...icate.java => ConsumerPredicateFilterPart.java} |  63 +++----
 ...lterPredicate.java => PredicateFilterPart.java} | 114 +++++-------
 .../view/predicate/ProducerFilterPredicate.java    |  39 +---
 ...icate.java => ProducerPredicateFilterPart.java} |  49 ++---
 .../impl/view/predicate/QueueFilterPredicate.java  |  59 +-----
 .../view/predicate/QueuePredicateFilterPart.java   |  80 ++++++++
 .../view/predicate/SessionFilterPredicate.java     |  33 +---
 ...dicate.java => SessionPredicateFilterPart.java} |  35 ++--
 .../impl/view/predicate/PredicateTest.java         |  64 +++----
 .../artemis/tests/util/ActiveMQTestBase.java       |  59 ++++++
 .../management/ActiveMQServerControlTest.java      | 205 ++++++++++++++++++---
 24 files changed, 648 insertions(+), 667 deletions(-)

diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java
index 3aa2bf09a7..00c5526713 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java
@@ -16,9 +16,8 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view;
 
-import org.apache.activemq.artemis.json.JsonArrayBuilder;
-import org.apache.activemq.artemis.json.JsonObject;
-import org.apache.activemq.artemis.json.JsonObjectBuilder;
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.PredicateFilterPart;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -30,13 +29,20 @@ import java.util.stream.Collectors;
 
 import org.apache.activemq.artemis.api.core.JsonUtil;
 import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ActiveMQFilterPredicate;
+import org.apache.activemq.artemis.json.JsonArray;
+import org.apache.activemq.artemis.json.JsonArrayBuilder;
+import org.apache.activemq.artemis.json.JsonObject;
+import org.apache.activemq.artemis.json.JsonObjectBuilder;
+import org.apache.activemq.artemis.json.JsonValue;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public abstract class ActiveMQAbstractView<T> {
+public abstract class ActiveMQAbstractView<T, V extends 
PredicateFilterPart<T>> {
 
    // use this for values which couldn't be retrieved (e.g. an exception was 
thrown)
    protected static final String N_A = "n/a";
 
+   private static final String FILTER_ARRAY_FIELD = "searchFilters";
+
    private static final String FILTER_FIELD = "field";
 
    private static final String FILTER_OPERATION = "operation";
@@ -58,7 +64,7 @@ public abstract class ActiveMQAbstractView<T> {
 
    protected Collection<T> collection;
 
-   protected ActiveMQFilterPredicate<T> predicate;
+   protected ActiveMQFilterPredicate<T, V> predicate;
 
    protected String sortField;
 
@@ -73,6 +79,11 @@ public abstract class ActiveMQAbstractView<T> {
       this.collection = collection;
    }
 
+   public List<T> filter() {
+      List<T> collect = 
collection.stream().filter(getPredicate()).collect(Collectors.toList());
+      return collect;
+   }
+
    public String getResultsAsJson(int page, int pageSize) {
       JsonObjectBuilder obj = JsonLoader.createObjectBuilder();
       JsonArrayBuilder array = JsonLoader.createArrayBuilder();
@@ -89,6 +100,21 @@ public abstract class ActiveMQAbstractView<T> {
       return obj.build().toString();
    }
 
+   public String AsJson(int page, int pageSize) {
+      JsonObjectBuilder obj = JsonLoader.createObjectBuilder();
+      JsonArrayBuilder array = JsonLoader.createArrayBuilder();
+      for (T element : getPagedResult(page, pageSize)) {
+         JsonObjectBuilder jsonObjectBuilder = toJson(element);
+         //toJson() may return a null
+         if (jsonObjectBuilder != null) {
+            array.add(jsonObjectBuilder);
+         }
+      }
+      obj.add("data", array);
+      obj.add("count", collection.size());
+      return obj.build().toString();
+   }
+
    public List<T> getPagedResult(int page, int pageSize) {
       List<T> builder = new ArrayList<>();
       final int start;
@@ -144,9 +170,7 @@ public abstract class ActiveMQAbstractView<T> {
          json = JsonUtil.readJsonObject(options);
       }
       if (predicate != null) {
-         predicate.setField(json.getString(FILTER_FIELD));
-         predicate.setOperation(json.getString(FILTER_OPERATION));
-         predicate.setValue(json.getString(FILTER_VALUE));
+         predicate.addFilterParts(createFilterPredicates(json));
          if ((json.containsKey(SORT_COLUMN) || json.containsKey(SORT_FIELD)) 
&& json.containsKey(SORT_ORDER)) {
             if (json.containsKey(SORT_COLUMN)) {
                this.sortField = json.getString(SORT_COLUMN);
@@ -158,6 +182,19 @@ public abstract class ActiveMQAbstractView<T> {
       }
    }
 
+   private List<V> createFilterPredicates(JsonObject json) {
+      ArrayList<V> predicates = new ArrayList<>();
+      JsonArray jsonArray = json.getJsonArray(FILTER_ARRAY_FIELD);
+      if (jsonArray == null) {
+         
predicates.add(predicate.createFilterPart(json.getString(FILTER_FIELD), 
json.getString(FILTER_OPERATION), json.getString(FILTER_VALUE)));
+      } else {
+         for (JsonValue jsonValue : jsonArray) {
+            
predicates.add(predicate.createFilterPart(((JsonObject)jsonValue).getString(FILTER_FIELD),
 ((JsonObject)jsonValue).getString(FILTER_OPERATION), 
((JsonObject)jsonValue).getString(FILTER_VALUE)));
+         }
+      }
+      return predicates;
+   }
+
    public abstract Class getClassT();
 
    public abstract JsonObjectBuilder toJson(T obj);
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java
index 34635dfe6f..f6f6cd8d57 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java
@@ -17,12 +17,13 @@
 package org.apache.activemq.artemis.core.management.impl.view;
 
 import org.apache.activemq.artemis.api.core.management.AddressControl;
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.AddressPredicateFilterPart;
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
 import 
org.apache.activemq.artemis.core.management.impl.view.predicate.AddressFilterPredicate;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public class AddressView extends ActiveMQAbstractView<AddressControl> {
+public class AddressView extends ActiveMQAbstractView<AddressControl, 
AddressPredicateFilterPart> {
 
    private static final String defaultSortField = AddressField.ID.getName();
 
@@ -31,7 +32,7 @@ public class AddressView extends 
ActiveMQAbstractView<AddressControl> {
    public AddressView(ActiveMQServer server) {
       super();
       this.server = server;
-      this.predicate = new AddressFilterPredicate(server);
+      this.predicate = new AddressFilterPredicate();
    }
 
    @Override
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java
index 3a1fc01200..f16508bf1c 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java
@@ -22,6 +22,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.TreeSet;
 
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ConnectionPredicateFilterPart;
 import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ConnectionFilterPredicate;
 import 
org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
@@ -31,7 +32,7 @@ import 
org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.utils.JsonLoader;
 import org.apache.activemq.artemis.utils.StringUtil;
 
-public class ConnectionView extends ActiveMQAbstractView<RemotingConnection> {
+public class ConnectionView extends ActiveMQAbstractView<RemotingConnection, 
ConnectionPredicateFilterPart> {
 
    private static final String defaultSortField = 
ConnectionField.CONNECTION_ID.getName();
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java
index a64f30aac9..3f21b5e087 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java
@@ -19,6 +19,7 @@ package org.apache.activemq.artemis.core.management.impl.view;
 import java.util.Date;
 
 import 
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ConsumerPredicateFilterPart;
 import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ConsumerFilterPredicate;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerConsumer;
@@ -26,7 +27,7 @@ import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public class ConsumerView extends ActiveMQAbstractView<ServerConsumer> {
+public class ConsumerView extends ActiveMQAbstractView<ServerConsumer, 
ConsumerPredicateFilterPart> {
 
    public static final String CONSUMER_STATUS_OK = "OK";
    public static final String CONSUMER_STATUS_ORPHANED = "Orphaned";
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java
index b08e6076f8..71df507b32 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.core.management.impl.view;
 
 import java.util.Objects;
 
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ProducerPredicateFilterPart;
 import 
org.apache.activemq.artemis.core.management.impl.view.predicate.ProducerFilterPredicate;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerProducer;
@@ -25,7 +26,7 @@ import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public class ProducerView extends ActiveMQAbstractView<ServerProducer> {
+public class ProducerView extends ActiveMQAbstractView<ServerProducer, 
ProducerPredicateFilterPart> {
 
    private static final String defaultSortField = 
ProducerField.CREATION_TIME.getName();
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
index 80e20014f5..e3d74f4e28 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view;
 
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.QueuePredicateFilterPart;
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
 import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.management.QueueControl;
@@ -24,7 +25,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.Queue;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public class QueueView extends ActiveMQAbstractView<QueueControl> {
+public class QueueView extends ActiveMQAbstractView<QueueControl, 
QueuePredicateFilterPart> {
 
    private static final String defaultSortField = QueueField.NAME.getName();
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java
index c9c5369fcd..60205cbb74 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java
@@ -16,6 +16,7 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view;
 
+import 
org.apache.activemq.artemis.core.management.impl.view.predicate.SessionPredicateFilterPart;
 import org.apache.activemq.artemis.json.JsonObjectBuilder;
 import java.util.Date;
 import java.util.Objects;
@@ -24,7 +25,7 @@ import 
org.apache.activemq.artemis.core.management.impl.view.predicate.SessionFi
 import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.utils.JsonLoader;
 
-public class SessionView extends ActiveMQAbstractView<ServerSession> {
+public class SessionView extends ActiveMQAbstractView<ServerSession, 
SessionPredicateFilterPart> {
 
    private static final String defaultSortField = SessionField.ID.getName();
 
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
index c9a680bbd9..a4b91cce65 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
@@ -16,170 +16,44 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.function.Predicate;
 
-
-public class ActiveMQFilterPredicate<T> implements Predicate<T> {
+public abstract class ActiveMQFilterPredicate<T, V extends 
PredicateFilterPart<T>> implements Predicate<T> {
 
    public enum Operation {
       CONTAINS, NOT_CONTAINS, EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN;
    }
 
-   protected String field;
-
-   protected String value;
-
-   protected Operation operation;
+   private final List<V> filterParts = new ArrayList<>();
 
    public ActiveMQFilterPredicate() {
    }
 
    @Override
    public boolean test(T input) {
-      return true;
-   }
-
-   public String getField() {
-      return field;
-   }
-
-   public void setField(String field) {
-      this.field = field;
-   }
-
-   public String getValue() {
-      return value;
-   }
-
-   public void setValue(String value) {
-      this.value = value;
-   }
-
-   public Operation getOperation() {
-      return operation;
-   }
-
-   public void setOperation(String operation) {
-      if (operation != null && !operation.isBlank()) {
-         this.operation = Operation.valueOf(operation);
-      }
-   }
-
-   public boolean matches(Object field) {
-      if (operation != null) {
-         return switch (operation) {
-            case EQUALS -> equals(field, value);
-            case NOT_EQUALS -> !equals(field, value);
-            case CONTAINS -> contains(field, value);
-            case NOT_CONTAINS -> !contains(field, value);
-            case GREATER_THAN -> false;
-            case LESS_THAN -> false;
-         };
-      }
-      return true;
-   }
-
-   public boolean matchAny(Collection objects) {
-      for (Object o : objects) {
-         if (matches(o))
-            return true;
-      }
-      return false;
-   }
-
-   public boolean matches(long field) {
-      long longValue;
-      if (operation != null) {
-
-         try {
-            longValue = Long.parseLong(value);
-         } catch (NumberFormatException ex) {
-            //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
-               return true;
-            } else {
-               return false;
+      if (filterParts.isEmpty())
+         return true;
+      try {
+         boolean matches = true;
+         for (V filterPart : filterParts) {
+            matches = filter(input, filterPart);
+            if (!matches) {
+               return matches;
             }
          }
-
-         return switch (operation) {
-            case EQUALS -> field == longValue;
-            case NOT_EQUALS -> field != longValue;
-            case CONTAINS -> false;
-            case NOT_CONTAINS -> true;
-            case LESS_THAN -> field < longValue;
-            case GREATER_THAN -> field > longValue;
-         };
+         return matches;
+      } catch (Exception e) {
+         return true;
       }
-      return true;
    }
 
-   public boolean matches(int field) {
-      int intValue;
-      if (operation != null) {
-
-         try {
-            intValue = Integer.parseInt(value);
-         } catch (NumberFormatException ex) {
-            //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
-               return true;
-            } else {
-               return false;
-            }
-         }
-
-         return switch (operation) {
-            case EQUALS -> field == intValue;
-            case NOT_EQUALS -> field != intValue;
-            case CONTAINS -> false;
-            case NOT_CONTAINS -> true;
-            case LESS_THAN -> field < intValue;
-            case GREATER_THAN -> field > intValue;
-         };
-      }
-      return true;
+   public void addFilterParts(List<V> filterParts) {
+      this.filterParts.addAll(filterParts);
    }
 
-   public boolean matches(float field) {
-      float floatValue;
-      if (operation != null) {
+   protected abstract boolean filter(T input, V filterPart) throws Exception;
 
-         try {
-            floatValue = Float.parseFloat(value);
-         } catch (NumberFormatException ex) {
-            //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
-               return true;
-            } else {
-               return false;
-            }
-         }
-
-         return switch (operation) {
-            case EQUALS -> field == floatValue;
-            case NOT_EQUALS -> field != floatValue;
-            case CONTAINS -> false;
-            case NOT_CONTAINS -> true;
-            case LESS_THAN -> field < floatValue;
-            case GREATER_THAN -> field > floatValue;
-         };
-      }
-      return true;
-   }
-
-   private boolean equals(Object field, Object value) {
-      if (field == null) {
-         return (value == null || value.equals(""));
-      }
-      return field.toString().equals(value);
-   }
-
-   private boolean contains(Object field, Object value) {
-      if (field == null) {
-         return (value == null || value.equals(""));
-      }
-      return field.toString().contains(value.toString());
-   }
+   public abstract V createFilterPart(String field, String operation, String 
value);
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java
index af0077a009..c0cccdc787 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java
@@ -16,66 +16,20 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import java.util.Arrays;
-
 import org.apache.activemq.artemis.api.core.management.AddressControl;
-import org.apache.activemq.artemis.core.management.impl.view.AddressField;
-import org.apache.activemq.artemis.core.server.ActiveMQServer;
-
-public class AddressFilterPredicate extends 
ActiveMQFilterPredicate<AddressControl> {
-
-   private AddressField f;
 
-   private final ActiveMQServer server;
-
-   public AddressFilterPredicate(ActiveMQServer server) {
+public class AddressFilterPredicate extends 
ActiveMQFilterPredicate<AddressControl, AddressPredicateFilterPart> {
+   public AddressFilterPredicate() {
       super();
-      this.server = server;
    }
 
    @Override
-   public boolean test(AddressControl address) {
-      if (f == null)
-         return true;
-      try {
-         return switch (f) {
-            case ID -> matches(address.getId());
-            case NAME -> matches(address.getAddress());
-            case ROUTING_TYPES -> 
matchAny(Arrays.asList(address.getRoutingTypes()));
-            case QUEUE_COUNT -> matches(address.getQueueCount());
-            case INTERNAL -> matches(address.isInternal());
-            case TEMPORARY -> matches(address.isTemporary());
-            case AUTO_CREATED -> matches(address.isAutoCreated());
-            case PAUSED -> matches(address.isPaused());
-            case CURRENT_DUPLICATE_ID_CACHE_SIZE -> 
matches(address.getCurrentDuplicateIdCacheSize());
-            case RETROACTIVE_RESOURCE -> 
matches(address.isRetroactiveResource());
-            case UNROUTED_MESSAGE_COUNT -> 
matches(address.getUnRoutedMessageCount());
-            case ROUTED_MESSAGE_COUNT -> 
matches(address.getRoutedMessageCount());
-            case MESSAGE_COUNT -> matches(address.getMessageCount());
-            case NUMBER_OF_BYTES_PER_PAGE -> 
matches(address.getNumberOfBytesPerPage());
-            case ADDRESS_LIMIT_PERCENT -> 
matches(address.getAddressLimitPercent());
-            case PAGING -> matches(address.isPaging());
-            case NUMBER_OF_PAGES -> matches(address.getNumberOfPages());
-            case ADDRESS_SIZE -> matches(address.getAddressSize());
-            case MAX_PAGE_READ_BYTES -> matches(address.getMaxPageReadBytes());
-            case MAX_PAGE_READ_MESSAGES -> 
matches(address.getMaxPageReadMessages());
-            case PREFETCH_PAGE_BYTES -> 
matches(address.getPrefetchPageBytes());
-            case PREFETCH_PAGE_MESSAGES -> 
matches(address.getPrefetchPageBytes());
-         };
-      } catch (Exception e) {
-         return false;
-      }
+   protected boolean filter(AddressControl address, AddressPredicateFilterPart 
filterPart) throws Exception {
+      return filterPart.filterPart(address);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = AddressField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = AddressField.valueOf(field);
-         }
-      }
+   public AddressPredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new AddressPredicateFilterPart(this, field, operation, value);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java
new file mode 100644
index 0000000000..2898e06d7e
--- /dev/null
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java
@@ -0,0 +1,69 @@
+/*
+ * 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.activemq.artemis.core.management.impl.view.predicate;
+
+import org.apache.activemq.artemis.api.core.management.AddressControl;
+import org.apache.activemq.artemis.core.management.impl.view.AddressField;
+
+import java.util.Arrays;
+
+public class AddressPredicateFilterPart extends 
PredicateFilterPart<AddressControl> {
+   private final AddressFilterPredicate addressFilterPredicate;
+   private AddressField f;
+
+   public AddressPredicateFilterPart(AddressFilterPredicate 
addressFilterPredicate, String field, String operation, String value) {
+      super(operation, value);
+      this.addressFilterPredicate = addressFilterPredicate;
+      if (field != null && !field.isEmpty()) {
+         f = AddressField.valueOfName(field);
+
+         //for backward compatibility
+         if (f == null) {
+            f = AddressField.valueOf(field);
+         }
+
+      }
+   }
+
+   @Override
+   public boolean filterPart(AddressControl address) throws Exception {
+      return switch (f) {
+         case ID -> matchesLong(address.getId());
+         case NAME -> matches(address.getAddress());
+         case ROUTING_TYPES -> 
matchAny(Arrays.asList(address.getRoutingTypes()));
+         case QUEUE_COUNT -> matchesLong(address.getQueueCount());
+         case INTERNAL -> matches(address.isInternal());
+         case TEMPORARY -> matches(address.isTemporary());
+         case AUTO_CREATED -> matches(address.isAutoCreated());
+         case PAUSED -> matches(address.isPaused());
+         case CURRENT_DUPLICATE_ID_CACHE_SIZE -> 
matchesLong(address.getCurrentDuplicateIdCacheSize());
+         case RETROACTIVE_RESOURCE -> matches(address.isRetroactiveResource());
+         case UNROUTED_MESSAGE_COUNT -> 
matchesLong(address.getUnRoutedMessageCount());
+         case ROUTED_MESSAGE_COUNT -> 
matchesLong(address.getRoutedMessageCount());
+         case MESSAGE_COUNT -> matchesLong(address.getMessageCount());
+         case NUMBER_OF_BYTES_PER_PAGE -> 
matchesLong(address.getNumberOfBytesPerPage());
+         case ADDRESS_LIMIT_PERCENT -> 
matchesLong(address.getAddressLimitPercent());
+         case PAGING -> matches(address.isPaging());
+         case NUMBER_OF_PAGES -> matchesLong(address.getNumberOfPages());
+         case ADDRESS_SIZE -> matchesLong(address.getAddressSize());
+         case MAX_PAGE_READ_BYTES -> 
matchesLong(address.getMaxPageReadBytes());
+         case MAX_PAGE_READ_MESSAGES -> 
matchesLong(address.getMaxPageReadMessages());
+         case PREFETCH_PAGE_BYTES -> 
matchesLong(address.getPrefetchPageBytes());
+         case PREFETCH_PAGE_MESSAGES -> 
matchesLong(address.getPrefetchPageBytes());
+      };
+   }
+}
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
index b997353d07..9b6c486f1c 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
@@ -16,21 +16,10 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-
-import org.apache.activemq.artemis.core.management.impl.view.ConnectionField;
-import 
org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 
-public class ConnectionFilterPredicate extends 
ActiveMQFilterPredicate<RemotingConnection> {
-
-   private ConnectionField f;
+public class ConnectionFilterPredicate extends 
ActiveMQFilterPredicate<RemotingConnection, ConnectionPredicateFilterPart> {
 
    private ActiveMQServer server;
 
@@ -39,46 +28,12 @@ public class ConnectionFilterPredicate extends 
ActiveMQFilterPredicate<RemotingC
    }
 
    @Override
-   public boolean test(RemotingConnection connection) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
-      return switch (f) {
-         case CONNECTION_ID -> matches(connection.getID());
-         case CLIENT_ID -> matches(connection.getClientID());
-         case USERS -> 
matchAny(collectFromSessions(connection.getID().toString(), s -> 
s.getUsername()));
-         case PROTOCOL -> matches(connection.getProtocolName());
-         case SESSION_COUNT -> 
matches(server.getSessions(connection.getID().toString()).size());
-         case REMOTE_ADDRESS -> 
matches(connection.getTransportConnection().getRemoteAddress());
-         case LOCAL_ADDRESS -> 
matches(connection.getTransportConnection().getLocalAddress());
-         case SESSION_ID -> 
matchAny(server.getSessions(connection.getID().toString()));
-         case CREATION_TIME -> matches(connection.getCreationTime());
-         case IMPLEMENTATION -> matches(connection.getClass().getSimpleName());
-         case PROXY_ADDRESS -> 
matches(NettyServerConnection.getProxyAddress(connection.getTransportConnection()));
-         case PROXY_PROTOCOL_VERSION -> 
matches(NettyServerConnection.getProxyProtocolVersion(connection.getTransportConnection()));
-      };
-   }
-
-   Set<String> collectFromSessions(String connectionId, 
Function<ServerSession, String> getter) {
-      List<ServerSession> sessions = server.getSessions(connectionId);
-      Set<String> sessionAttributes = new HashSet<>();
-      for (ServerSession session : sessions) {
-         String value = getter.apply(session);
-         String string = Objects.requireNonNullElse(value, "");
-         sessionAttributes.add(string);
-      }
-      return sessionAttributes;
+   protected boolean filter(RemotingConnection input, 
ConnectionPredicateFilterPart filterPart) throws Exception {
+      return filterPart.filterPart(input);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ConnectionField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ConnectionField.valueOf(field);
-         }
-      }
+   public ConnectionPredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new ConnectionPredicateFilterPart(server, field, operation, 
value);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java
similarity index 84%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
copy to 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java
index b997353d07..47a352258e 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java
@@ -16,43 +16,48 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Function;
-
 import org.apache.activemq.artemis.core.management.impl.view.ConnectionField;
 import 
org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerSession;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 
-public class ConnectionFilterPredicate extends 
ActiveMQFilterPredicate<RemotingConnection> {
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+
+public class ConnectionPredicateFilterPart extends 
PredicateFilterPart<RemotingConnection> {
+   private final ActiveMQServer server;
 
    private ConnectionField f;
 
-   private ActiveMQServer server;
-
-   public ConnectionFilterPredicate(ActiveMQServer server) {
+   public ConnectionPredicateFilterPart(ActiveMQServer server, String field, 
String operation, String value) {
+      super(operation, value);
       this.server = server;
+      if (field != null && !field.isEmpty()) {
+         this.f = ConnectionField.valueOfName(field);
+
+         //for backward compatibility
+         if (this.f == null) {
+            this.f = ConnectionField.valueOf(field);
+         }
+      }
    }
 
    @Override
-   public boolean test(RemotingConnection connection) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
+   public boolean filterPart(RemotingConnection connection) throws Exception {
       return switch (f) {
          case CONNECTION_ID -> matches(connection.getID());
          case CLIENT_ID -> matches(connection.getClientID());
          case USERS -> 
matchAny(collectFromSessions(connection.getID().toString(), s -> 
s.getUsername()));
          case PROTOCOL -> matches(connection.getProtocolName());
-         case SESSION_COUNT -> 
matches(server.getSessions(connection.getID().toString()).size());
+         case SESSION_COUNT -> 
matchesLong(server.getSessions(connection.getID().toString()).size());
          case REMOTE_ADDRESS -> 
matches(connection.getTransportConnection().getRemoteAddress());
          case LOCAL_ADDRESS -> 
matches(connection.getTransportConnection().getLocalAddress());
          case SESSION_ID -> 
matchAny(server.getSessions(connection.getID().toString()));
-         case CREATION_TIME -> matches(connection.getCreationTime());
+         case CREATION_TIME -> matchesLong(connection.getCreationTime());
          case IMPLEMENTATION -> matches(connection.getClass().getSimpleName());
          case PROXY_ADDRESS -> 
matches(NettyServerConnection.getProxyAddress(connection.getTransportConnection()));
          case PROXY_PROTOCOL_VERSION -> 
matches(NettyServerConnection.getProxyProtocolVersion(connection.getTransportConnection()));
@@ -70,15 +75,4 @@ public class ConnectionFilterPredicate extends 
ActiveMQFilterPredicate<RemotingC
       return sessionAttributes;
    }
 
-   @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ConnectionField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ConnectionField.valueOf(field);
-         }
-      }
-   }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
index 50f4f573cc..216e2075ea 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
@@ -16,13 +16,10 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import org.apache.activemq.artemis.core.management.impl.view.ConsumerField;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerConsumer;
 
-public class ConsumerFilterPredicate extends 
ActiveMQFilterPredicate<ServerConsumer> {
-
-   private ConsumerField f;
+public class ConsumerFilterPredicate extends 
ActiveMQFilterPredicate<ServerConsumer, ConsumerPredicateFilterPart> {
 
    private final ActiveMQServer server;
 
@@ -32,47 +29,12 @@ public class ConsumerFilterPredicate extends 
ActiveMQFilterPredicate<ServerConsu
    }
 
    @Override
-   public boolean test(ServerConsumer consumer) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
-      return switch (f) {
-         case ID -> matches(consumer.getSequentialID());
-         case SESSION -> matches(consumer.getSessionID());
-         case USER -> 
matches(server.getSessionByID(consumer.getSessionID()).getUsername());
-         case VALIDATED_USER -> 
matches(server.getSessionByID(consumer.getSessionID()).getValidatedUser());
-         case ADDRESS -> matches(consumer.getQueue().getAddress());
-         case QUEUE -> matches(consumer.getQueue().getName());
-         case FILTER -> matches(consumer.getFilterString());
-         case PROTOCOL ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getProtocolName());
-         case CLIENT_ID ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getClientID());
-         case LOCAL_ADDRESS ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
-         case REMOTE_ADDRESS ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
-         case MESSAGES_IN_TRANSIT -> matches(consumer.getMessagesInTransit());
-         case MESSAGES_IN_TRANSIT_SIZE -> 
matches(consumer.getMessagesInTransitSize());
-         case MESSAGES_DELIVERED -> matches(consumer.getMessagesDelivered());
-         case MESSAGES_DELIVERED_SIZE -> 
matches(consumer.getMessagesDeliveredSize());
-         case MESSAGES_ACKNOWLEDGED -> 
matches(consumer.getMessagesAcknowledged());
-         case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> 
matches(consumer.getMessagesAcknowledgedAwaitingCommit());
-         case LAST_ACKNOWLEDGED_TIME -> 
matches(consumer.getLastAcknowledgedTime());
-         case LAST_DELIVERED_TIME -> matches(consumer.getLastDeliveredTime());
-         default -> true;
-      };
+   protected boolean filter(ServerConsumer consumer, 
ConsumerPredicateFilterPart filterPart) throws Exception {
+      return filterPart.filterPart(consumer);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ConsumerField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ConsumerField.valueOf(field);
-         }
-      }
+   public ConsumerPredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new ConsumerPredicateFilterPart(server, field, operation, value);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java
similarity index 54%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
copy to 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java
index 50f4f573cc..4f81baa4f6 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java
@@ -20,59 +20,48 @@ import 
org.apache.activemq.artemis.core.management.impl.view.ConsumerField;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerConsumer;
 
-public class ConsumerFilterPredicate extends 
ActiveMQFilterPredicate<ServerConsumer> {
-
-   private ConsumerField f;
+public class ConsumerPredicateFilterPart extends 
PredicateFilterPart<ServerConsumer> {
 
    private final ActiveMQServer server;
 
-   public ConsumerFilterPredicate(ActiveMQServer server) {
-      super();
+   private ConsumerField f;
+
+   public ConsumerPredicateFilterPart(ActiveMQServer server, String field, 
String operation, String value) {
+      super(operation, value);
       this.server = server;
+      if (field != null && !field.isEmpty()) {
+         this.f = ConsumerField.valueOfName(field);
+
+         //for backward compatibility
+         if (this.f == null) {
+            this.f = ConsumerField.valueOf(field);
+         }
+      }
    }
 
    @Override
-   public boolean test(ServerConsumer consumer) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
+   public boolean filterPart(ServerConsumer consumer) throws Exception {
       return switch (f) {
-         case ID -> matches(consumer.getSequentialID());
+         case ID -> matchesLong(consumer.getSequentialID());
          case SESSION -> matches(consumer.getSessionID());
          case USER -> 
matches(server.getSessionByID(consumer.getSessionID()).getUsername());
          case VALIDATED_USER -> 
matches(server.getSessionByID(consumer.getSessionID()).getValidatedUser());
          case ADDRESS -> matches(consumer.getQueue().getAddress());
          case QUEUE -> matches(consumer.getQueue().getName());
          case FILTER -> matches(consumer.getFilterString());
-         case PROTOCOL ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getProtocolName());
-         case CLIENT_ID ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getClientID());
-         case LOCAL_ADDRESS ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
-         case REMOTE_ADDRESS ->
-            
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
-         case MESSAGES_IN_TRANSIT -> matches(consumer.getMessagesInTransit());
-         case MESSAGES_IN_TRANSIT_SIZE -> 
matches(consumer.getMessagesInTransitSize());
+         case PROTOCOL -> 
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getProtocolName());
+         case CLIENT_ID -> 
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getClientID());
+         case LOCAL_ADDRESS -> 
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
+         case REMOTE_ADDRESS -> 
matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
+         case MESSAGES_IN_TRANSIT -> 
matchesLong(consumer.getMessagesInTransit());
+         case MESSAGES_IN_TRANSIT_SIZE -> 
matchesLong(consumer.getMessagesInTransitSize());
          case MESSAGES_DELIVERED -> matches(consumer.getMessagesDelivered());
-         case MESSAGES_DELIVERED_SIZE -> 
matches(consumer.getMessagesDeliveredSize());
-         case MESSAGES_ACKNOWLEDGED -> 
matches(consumer.getMessagesAcknowledged());
-         case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> 
matches(consumer.getMessagesAcknowledgedAwaitingCommit());
-         case LAST_ACKNOWLEDGED_TIME -> 
matches(consumer.getLastAcknowledgedTime());
-         case LAST_DELIVERED_TIME -> matches(consumer.getLastDeliveredTime());
+         case MESSAGES_DELIVERED_SIZE -> 
matchesLong(consumer.getMessagesDeliveredSize());
+         case MESSAGES_ACKNOWLEDGED -> 
matchesLong(consumer.getMessagesAcknowledged());
+         case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> 
matchesLong(consumer.getMessagesAcknowledgedAwaitingCommit());
+         case LAST_ACKNOWLEDGED_TIME -> 
matchesLong(consumer.getLastAcknowledgedTime());
+         case LAST_DELIVERED_TIME -> 
matchesLong(consumer.getLastDeliveredTime());
          default -> true;
       };
    }
-
-   @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ConsumerField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ConsumerField.valueOf(field);
-         }
-      }
-   }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java
similarity index 73%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
copy to 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java
index c9a680bbd9..298b47f821 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java
@@ -17,78 +17,41 @@
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
 import java.util.Collection;
-import java.util.function.Predicate;
 
+public class PredicateFilterPart<T> {
 
-public class ActiveMQFilterPredicate<T> implements Predicate<T> {
+   private final  String value;
 
-   public enum Operation {
-      CONTAINS, NOT_CONTAINS, EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN;
-   }
-
-   protected String field;
-
-   protected String value;
-
-   protected Operation operation;
+   private final  String operation;
 
-   public ActiveMQFilterPredicate() {
-   }
-
-   @Override
-   public boolean test(T input) {
-      return true;
-   }
+   private final ActiveMQFilterPredicate.Operation filterOperation;
 
-   public String getField() {
-      return field;
+   public PredicateFilterPart(String operation, String value) {
+      this.value = value;
+      this.operation = operation;
+      if (operation != null && !operation.isBlank()) {
+         this.filterOperation = 
ActiveMQFilterPredicate.Operation.valueOf(operation);
+      } else {
+         filterOperation = null;
+      }
    }
 
-   public void setField(String field) {
-      this.field = field;
+   public String getOperation() {
+      return operation;
    }
 
    public String getValue() {
       return value;
    }
 
-   public void setValue(String value) {
-      this.value = value;
-   }
-
-   public Operation getOperation() {
-      return operation;
+   public ActiveMQFilterPredicate.Operation getFilterOperation() {
+      return filterOperation;
    }
 
-   public void setOperation(String operation) {
-      if (operation != null && !operation.isBlank()) {
-         this.operation = Operation.valueOf(operation);
-      }
-   }
-
-   public boolean matches(Object field) {
-      if (operation != null) {
-         return switch (operation) {
-            case EQUALS -> equals(field, value);
-            case NOT_EQUALS -> !equals(field, value);
-            case CONTAINS -> contains(field, value);
-            case NOT_CONTAINS -> !contains(field, value);
-            case GREATER_THAN -> false;
-            case LESS_THAN -> false;
-         };
-      }
+   public boolean filterPart(T input) throws Exception {
       return true;
    }
-
-   public boolean matchAny(Collection objects) {
-      for (Object o : objects) {
-         if (matches(o))
-            return true;
-      }
-      return false;
-   }
-
-   public boolean matches(long field) {
+   public boolean matchesLong(long field) {
       long longValue;
       if (operation != null) {
 
@@ -96,14 +59,14 @@ public class ActiveMQFilterPredicate<T> implements 
Predicate<T> {
             longValue = Long.parseLong(value);
          } catch (NumberFormatException ex) {
             //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
+            if (filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_CONTAINS) {
                return true;
             } else {
                return false;
             }
          }
 
-         return switch (operation) {
+         return switch (filterOperation) {
             case EQUALS -> field == longValue;
             case NOT_EQUALS -> field != longValue;
             case CONTAINS -> false;
@@ -115,22 +78,37 @@ public class ActiveMQFilterPredicate<T> implements 
Predicate<T> {
       return true;
    }
 
-   public boolean matches(int field) {
+   public boolean matches(Object field) {
+      if (filterOperation != null) {
+         return switch (filterOperation) {
+            case EQUALS -> equals(field, value);
+            case NOT_EQUALS -> !equals(field, value);
+            case CONTAINS -> contains(field, value);
+            case NOT_CONTAINS -> !contains(field, value);
+            case GREATER_THAN -> false;
+            case LESS_THAN -> false;
+         };
+      }
+      return true;
+   }
+
+
+   public boolean matchesInt(int field) {
       int intValue;
-      if (operation != null) {
+      if (filterOperation != null) {
 
          try {
             intValue = Integer.parseInt(value);
          } catch (NumberFormatException ex) {
             //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
+            if (filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_CONTAINS) {
                return true;
             } else {
                return false;
             }
          }
 
-         return switch (operation) {
+         return switch (filterOperation) {
             case EQUALS -> field == intValue;
             case NOT_EQUALS -> field != intValue;
             case CONTAINS -> false;
@@ -142,7 +120,8 @@ public class ActiveMQFilterPredicate<T> implements 
Predicate<T> {
       return true;
    }
 
-   public boolean matches(float field) {
+
+   public boolean matchesFloat(float field) {
       float floatValue;
       if (operation != null) {
 
@@ -150,14 +129,14 @@ public class ActiveMQFilterPredicate<T> implements 
Predicate<T> {
             floatValue = Float.parseFloat(value);
          } catch (NumberFormatException ex) {
             //cannot compare
-            if (operation == Operation.NOT_EQUALS || operation == 
Operation.NOT_CONTAINS) {
+            if (filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == 
ActiveMQFilterPredicate.Operation.NOT_CONTAINS) {
                return true;
             } else {
                return false;
             }
          }
 
-         return switch (operation) {
+         return switch (filterOperation) {
             case EQUALS -> field == floatValue;
             case NOT_EQUALS -> field != floatValue;
             case CONTAINS -> false;
@@ -168,6 +147,13 @@ public class ActiveMQFilterPredicate<T> implements 
Predicate<T> {
       }
       return true;
    }
+   public boolean matchAny(Collection objects) {
+      for (Object o : objects) {
+         if (matches(o))
+            return true;
+      }
+      return false;
+   }
 
    private boolean equals(Object field, Object value) {
       if (field == null) {
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
index 6552e734fe..5669469c6d 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
@@ -16,13 +16,10 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import org.apache.activemq.artemis.core.management.impl.view.ProducerField;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerProducer;
 
-public class ProducerFilterPredicate extends 
ActiveMQFilterPredicate<ServerProducer> {
-
-   private ProducerField f;
+public class ProducerFilterPredicate extends 
ActiveMQFilterPredicate<ServerProducer, ProducerPredicateFilterPart> {
 
    private final ActiveMQServer server;
 
@@ -32,38 +29,12 @@ public class ProducerFilterPredicate extends 
ActiveMQFilterPredicate<ServerProdu
    }
 
    @Override
-   public boolean test(ServerProducer producer) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
-      return switch (f) {
-         case ID -> matches(producer.getID());
-         case CONNECTION_ID -> matches(producer.getConnectionID());
-         case SESSION -> matches(producer.getSessionID());
-         case USER -> 
matches(server.getSessionByID(producer.getSessionID()).getUsername());
-         case VALIDATED_USER -> 
matches(server.getSessionByID(producer.getSessionID()).getValidatedUser());
-         case ADDRESS ->
-            matches(producer.getAddress() != null ? producer.getAddress() : 
server.getSessionByID(producer.getSessionID()).getDefaultAddress());
-         case PROTOCOL -> matches(producer.getProtocol());
-         case CLIENT_ID ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getClientID());
-         case LOCAL_ADDRESS ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
-         case REMOTE_ADDRESS ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
-         default -> true;
-      };
+   protected boolean filter(ServerProducer producer, 
ProducerPredicateFilterPart filterPart) throws Exception {
+      return filterPart.filterPart(producer);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ProducerField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ProducerField.valueOf(field);
-         }
-      }
+   public ProducerPredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new ProducerPredicateFilterPart(server, field, operation, value);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java
similarity index 63%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
copy to 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java
index 6552e734fe..35aa06794d 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java
@@ -20,50 +20,39 @@ import 
org.apache.activemq.artemis.core.management.impl.view.ProducerField;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.server.ServerProducer;
 
-public class ProducerFilterPredicate extends 
ActiveMQFilterPredicate<ServerProducer> {
-
-   private ProducerField f;
+public class ProducerPredicateFilterPart extends 
PredicateFilterPart<ServerProducer> {
 
    private final ActiveMQServer server;
 
-   public ProducerFilterPredicate(ActiveMQServer server) {
-      super();
+   private ProducerField f;
+
+   public ProducerPredicateFilterPart(ActiveMQServer server, String field, 
String operation, String value) {
+      super(operation, value);
       this.server = server;
+      if (field != null && !field.isEmpty()) {
+         this.f = ProducerField.valueOfName(field);
+
+         //for backward compatibility
+         if (this.f == null) {
+            this.f = ProducerField.valueOf(field);
+         }
+      }
    }
 
    @Override
-   public boolean test(ServerProducer producer) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
+   public boolean filterPart(ServerProducer producer) throws Exception {
       return switch (f) {
-         case ID -> matches(producer.getID());
+         case ID -> matchesLong(producer.getID());
          case CONNECTION_ID -> matches(producer.getConnectionID());
          case SESSION -> matches(producer.getSessionID());
          case USER -> 
matches(server.getSessionByID(producer.getSessionID()).getUsername());
          case VALIDATED_USER -> 
matches(server.getSessionByID(producer.getSessionID()).getValidatedUser());
-         case ADDRESS ->
-            matches(producer.getAddress() != null ? producer.getAddress() : 
server.getSessionByID(producer.getSessionID()).getDefaultAddress());
+         case ADDRESS -> matches(producer.getAddress() != null ? 
producer.getAddress() : 
server.getSessionByID(producer.getSessionID()).getDefaultAddress());
          case PROTOCOL -> matches(producer.getProtocol());
-         case CLIENT_ID ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getClientID());
-         case LOCAL_ADDRESS ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
-         case REMOTE_ADDRESS ->
-            
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
+         case CLIENT_ID -> 
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getClientID());
+         case LOCAL_ADDRESS -> 
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress());
+         case REMOTE_ADDRESS -> 
matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress());
          default -> true;
       };
    }
-
-   @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = ProducerField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = ProducerField.valueOf(field);
-         }
-      }
-   }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java
index 87314db48c..0d846e3a08 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java
@@ -16,14 +16,11 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import org.apache.activemq.artemis.api.core.SimpleString;
 import org.apache.activemq.artemis.api.core.management.QueueControl;
 import org.apache.activemq.artemis.core.management.impl.view.QueueField;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.Consumer;
-import org.apache.activemq.artemis.core.server.Queue;
 
-public class QueueFilterPredicate extends 
ActiveMQFilterPredicate<QueueControl> {
+public class QueueFilterPredicate extends 
ActiveMQFilterPredicate<QueueControl, QueuePredicateFilterPart> {
 
    private QueueField f;
 
@@ -35,58 +32,12 @@ public class QueueFilterPredicate extends 
ActiveMQFilterPredicate<QueueControl>
    }
 
    @Override
-   public boolean test(QueueControl queue) {
-      if (f == null)
-         return true;
-      try {
-         return switch (f) {
-            case ID -> matches(queue.getID());
-            case NAME -> matches(queue.getName());
-            case CONSUMER_ID -> {
-               Queue q = server.locateQueue(SimpleString.of(queue.getName()));
-               for (Consumer consumer : q.getConsumers()) {
-                  if (matches(consumer.sequentialID()))
-                     yield true;
-               }
-               yield false;
-            }
-            case MAX_CONSUMERS -> matches(queue.getMaxConsumers());
-            case ADDRESS -> matches(queue.getAddress());
-            case FILTER -> matches(queue.getFilter());
-            case MESSAGE_COUNT -> matches(queue.getMessageCount());
-            case CONSUMER_COUNT -> matches(queue.getConsumerCount());
-            case DELIVERING_COUNT -> matches(queue.getDeliveringCount());
-            case MESSAGES_ADDED -> matches(queue.getMessagesAdded());
-            case MESSAGES_ACKED -> matches(queue.getMessagesAcknowledged());
-            case MESSAGES_EXPIRED -> matches(queue.getMessagesExpired());
-            case ROUTING_TYPE -> matches(queue.getRoutingType());
-            case AUTO_CREATED -> 
matches(server.locateQueue(SimpleString.of(queue.getName())).isAutoCreated());
-            case DURABLE -> matches(queue.isDurable());
-            case PAUSED -> matches(queue.isPaused());
-            case TEMPORARY -> matches(queue.isTemporary());
-            case PURGE_ON_NO_CONSUMERS -> 
matches(queue.isPurgeOnNoConsumers());
-            case MESSAGES_KILLED -> matches(queue.getMessagesKilled());
-            case EXCLUSIVE -> matches(queue.isExclusive());
-            case LAST_VALUE -> matches(queue.isLastValue());
-            case SCHEDULED_COUNT -> matches(queue.getScheduledCount());
-            case USER -> matches(queue.getUser());
-            case INTERNAL_QUEUE -> matches(queue.isInternalQueue());
-            default -> true;
-         };
-      } catch (Exception e) {
-         return true;
-      }
+   protected boolean filter(QueueControl queue, QueuePredicateFilterPart 
filterPart) throws Exception {
+      return filterPart.filterPart(queue);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = QueueField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = QueueField.valueOf(field);
-         }
-      }
+   public QueuePredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new QueuePredicateFilterPart(server, field, operation, value);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java
new file mode 100644
index 0000000000..abb7d4a3a7
--- /dev/null
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java
@@ -0,0 +1,80 @@
+/*
+ * 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.activemq.artemis.core.management.impl.view.predicate;
+
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.management.QueueControl;
+import org.apache.activemq.artemis.core.management.impl.view.QueueField;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.Consumer;
+import org.apache.activemq.artemis.core.server.Queue;
+
+public class QueuePredicateFilterPart extends 
PredicateFilterPart<QueueControl> {
+   private final ActiveMQServer server;
+   private QueueField f;
+
+   public QueuePredicateFilterPart(ActiveMQServer server, String field, String 
operation, String value) {
+      super(operation, value);
+      this.server = server;
+      if (field != null && !field.isEmpty()) {
+         f = QueueField.valueOfName(field);
+
+         //for backward compatibility
+         if (f == null) {
+            f = QueueField.valueOf(field);
+         }
+      }
+   }
+
+   @Override
+   public boolean filterPart(QueueControl queue) {
+      return switch (f) {
+         case ID -> matchesLong(queue.getID());
+         case NAME -> matches(queue.getName());
+         case CONSUMER_ID -> {
+            Queue q = server.locateQueue(SimpleString.of(queue.getName()));
+            for (Consumer consumer : q.getConsumers()) {
+               if (matchesLong(consumer.sequentialID()))
+                  yield true;
+            }
+            yield false;
+         }
+         case MAX_CONSUMERS -> matchesInt(queue.getMaxConsumers());
+         case ADDRESS -> matches(queue.getAddress());
+         case FILTER -> matches(queue.getFilter());
+         case MESSAGE_COUNT -> matchesLong(queue.getMessageCount());
+         case CONSUMER_COUNT -> matchesInt(queue.getConsumerCount());
+         case DELIVERING_COUNT -> matchesInt(queue.getDeliveringCount());
+         case MESSAGES_ADDED -> matchesLong(queue.getMessagesAdded());
+         case MESSAGES_ACKED -> matchesLong(queue.getMessagesAcknowledged());
+         case MESSAGES_EXPIRED -> matchesLong(queue.getMessagesExpired());
+         case ROUTING_TYPE -> matches(queue.getRoutingType());
+         case AUTO_CREATED -> 
matches(server.locateQueue(SimpleString.of(queue.getName())).isAutoCreated());
+         case DURABLE -> matches(queue.isDurable());
+         case PAUSED -> matches(queue.isPaused());
+         case TEMPORARY -> matches(queue.isTemporary());
+         case PURGE_ON_NO_CONSUMERS -> matches(queue.isPurgeOnNoConsumers());
+         case MESSAGES_KILLED -> matchesLong(queue.getMessagesKilled());
+         case EXCLUSIVE -> matches(queue.isExclusive());
+         case LAST_VALUE -> matches(queue.isLastValue());
+         case SCHEDULED_COUNT -> matchesLong(queue.getScheduledCount());
+         case USER -> matches(queue.getUser());
+         case INTERNAL_QUEUE -> matches(queue.isInternalQueue());
+         default -> true;
+      };
+   }
+}
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
index 50a40ae6f9..d95b9eb2f3 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
@@ -16,44 +16,21 @@
  */
 package org.apache.activemq.artemis.core.management.impl.view.predicate;
 
-import org.apache.activemq.artemis.core.management.impl.view.SessionField;
 import org.apache.activemq.artemis.core.server.ServerSession;
 
-public class SessionFilterPredicate extends 
ActiveMQFilterPredicate<ServerSession> {
-
-   private SessionField f;
+public class SessionFilterPredicate extends 
ActiveMQFilterPredicate<ServerSession, SessionPredicateFilterPart> {
 
    public SessionFilterPredicate() {
       super();
    }
 
    @Override
-   public boolean test(ServerSession session) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
-      return switch (f) {
-         case ID -> matches(session.getName());
-         case CONNECTION_ID -> matches(session.getConnectionID());
-         case CONSUMER_COUNT -> matches(session.getServerConsumers().size());
-         case PRODUCER_COUNT -> matches(session.getServerProducers().size());
-         case PROTOCOL -> 
matches(session.getRemotingConnection().getProtocolName());
-         case CLIENT_ID -> 
matches(session.getRemotingConnection().getClientID());
-         case LOCAL_ADDRESS -> 
matches(session.getRemotingConnection().getTransportConnection().getLocalAddress());
-         case REMOTE_ADDRESS -> 
matches(session.getRemotingConnection().getTransportConnection().getRemoteAddress());
-         default -> true;
-      };
+   public SessionPredicateFilterPart createFilterPart(String field, String 
operation, String value) {
+      return new SessionPredicateFilterPart(field, operation, value);
    }
 
    @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = SessionField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = SessionField.valueOf(field);
-         }
-      }
+   protected boolean filter(ServerSession session, SessionPredicateFilterPart 
filterPart) throws Exception {
+      return filterPart.filterPart(session);
    }
 }
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java
similarity index 72%
copy from 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
copy to 
artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java
index 50a40ae6f9..0cc5c4b8df 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java
@@ -19,24 +19,29 @@ package 
org.apache.activemq.artemis.core.management.impl.view.predicate;
 import org.apache.activemq.artemis.core.management.impl.view.SessionField;
 import org.apache.activemq.artemis.core.server.ServerSession;
 
-public class SessionFilterPredicate extends 
ActiveMQFilterPredicate<ServerSession> {
+public class SessionPredicateFilterPart extends 
PredicateFilterPart<ServerSession> {
 
    private SessionField f;
 
-   public SessionFilterPredicate() {
-      super();
+   public SessionPredicateFilterPart(String field, String operation, String 
value) {
+      super(operation, value);
+      if (field != null && !field.isEmpty()) {
+         f = SessionField.valueOfName(field);
+
+         //for backward compatibility
+         if (f == null) {
+            f = SessionField.valueOf(field);
+         }
+      }
    }
 
    @Override
-   public boolean test(ServerSession session) {
-      // Using switch over enum vs string comparison is better for perf.
-      if (f == null)
-         return true;
+   public boolean filterPart(ServerSession session) throws Exception {
       return switch (f) {
          case ID -> matches(session.getName());
          case CONNECTION_ID -> matches(session.getConnectionID());
-         case CONSUMER_COUNT -> matches(session.getServerConsumers().size());
-         case PRODUCER_COUNT -> matches(session.getServerProducers().size());
+         case CONSUMER_COUNT -> 
matchesLong(session.getServerConsumers().size());
+         case PRODUCER_COUNT -> 
matchesLong(session.getServerProducers().size());
          case PROTOCOL -> 
matches(session.getRemotingConnection().getProtocolName());
          case CLIENT_ID -> 
matches(session.getRemotingConnection().getClientID());
          case LOCAL_ADDRESS -> 
matches(session.getRemotingConnection().getTransportConnection().getLocalAddress());
@@ -44,16 +49,4 @@ public class SessionFilterPredicate extends 
ActiveMQFilterPredicate<ServerSessio
          default -> true;
       };
    }
-
-   @Override
-   public void setField(String field) {
-      if (field != null && !field.isEmpty()) {
-         this.f = SessionField.valueOfName(field);
-
-         //for backward compatibility
-         if (this.f == null) {
-            this.f = SessionField.valueOf(field);
-         }
-      }
-   }
 }
diff --git 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java
 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java
index bc2c5181f9..e7f7726e71 100644
--- 
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java
+++ 
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java
@@ -33,74 +33,62 @@ public class PredicateTest {
    @Test
    public void testBasePredicateEquals() {
       String string = RandomUtil.randomUUIDString();
-      ActiveMQFilterPredicate<String> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(EQUALS.name());
-      predicate.setValue(string);
+      PredicateFilterPart<String> predicate = new 
PredicateFilterPart<>(EQUALS.name(), string);
       assertTrue(predicate.matches(string));
       assertFalse(predicate.matches(RandomUtil.randomUUIDString()));
-      assertFalse(predicate.matches(0L));
-      assertFalse(predicate.matches(0f));
-      assertFalse(predicate.matches(0));
+      assertFalse(predicate.matchesLong(0L));
+      assertFalse(predicate.matchesFloat(0f));
+      assertFalse(predicate.matchesInt(0));
    }
 
    @Test
    public void testBasePredicateNotEquals() {
       String string = RandomUtil.randomUUIDString();
-      ActiveMQFilterPredicate<String> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(NOT_EQUALS.name());
-      predicate.setValue(string);
+      PredicateFilterPart<String> predicate = new 
PredicateFilterPart<>(NOT_EQUALS.name(), string);
       assertFalse(predicate.matches(string));
       assertTrue(predicate.matches(RandomUtil.randomUUIDString()));
-      assertTrue(predicate.matches(0L));
-      assertTrue(predicate.matches(0f));
-      assertTrue(predicate.matches(0));
+      assertTrue(predicate.matchesLong(0L));
+      assertTrue(predicate.matchesFloat(0f));
+      assertTrue(predicate.matchesInt(0));
    }
 
    @Test
    public void testBasePredicateContains() {
-      ActiveMQFilterPredicate<String> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(CONTAINS.name());
-      predicate.setValue("12");
+      PredicateFilterPart<String> predicate = new 
PredicateFilterPart<>(CONTAINS.name(), "12");
       assertTrue(predicate.matches("0123"));
       assertFalse(predicate.matches("43"));
-      assertFalse(predicate.matches(0L));
-      assertFalse(predicate.matches(0f));
-      assertFalse(predicate.matches(0));
+      assertFalse(predicate.matchesLong(0L));
+      assertFalse(predicate.matchesFloat(0f));
+      assertFalse(predicate.matchesInt(0));
    }
 
    @Test
    public void testBasePredicateNotContains() {
-      ActiveMQFilterPredicate<String> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(NOT_CONTAINS.name());
-      predicate.setValue("12");
+      PredicateFilterPart<String> predicate = new 
PredicateFilterPart<>(NOT_CONTAINS.name(), "12");
       assertFalse(predicate.matches("0123"));
       assertTrue(predicate.matches("42"));
-      assertTrue(predicate.matches(0L));
-      assertTrue(predicate.matches(0f));
-      assertTrue(predicate.matches(0));
+      assertTrue(predicate.matchesLong(0L));
+      assertTrue(predicate.matchesFloat(0f));
+      assertTrue(predicate.matchesInt(0));
    }
 
    @Test
    public void testBasePredicateLessThan() {
-      ActiveMQFilterPredicate<Integer> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(LESS_THAN.name());
-      predicate.setValue("12");
+      PredicateFilterPart<Integer> predicate = new 
PredicateFilterPart<>(LESS_THAN.name(), "12");
       assertFalse(predicate.matches("foo"));
-      assertFalse(predicate.matches(42));
-      assertTrue(predicate.matches(0L));
-      assertTrue(predicate.matches(0f));
-      assertTrue(predicate.matches(0));
+      assertFalse(predicate.matchesInt(42));
+      assertTrue(predicate.matchesLong(0L));
+      assertTrue(predicate.matchesFloat(0f));
+      assertTrue(predicate.matchesInt(0));
    }
 
    @Test
    public void testBasePredicateGreaterThan() {
-      ActiveMQFilterPredicate<Integer> predicate = new 
ActiveMQFilterPredicate<>();
-      predicate.setOperation(GREATER_THAN.name());
-      predicate.setValue("12");
+      PredicateFilterPart<Integer> predicate = new 
PredicateFilterPart<>(GREATER_THAN.name(), "12");
       assertFalse(predicate.matches("foo"));
-      assertTrue(predicate.matches(42));
-      assertFalse(predicate.matches(0L));
-      assertFalse(predicate.matches(0f));
-      assertFalse(predicate.matches(0));
+      assertTrue(predicate.matchesInt(42));
+      assertFalse(predicate.matchesLong(0L));
+      assertFalse(predicate.matchesFloat(0f));
+      assertFalse(predicate.matchesInt(0));
    }
 }
diff --git 
a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
 
b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
index ec04976e66..8fa7e16b7b 100644
--- 
a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
+++ 
b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
@@ -2483,6 +2483,65 @@ public abstract class ActiveMQTestBase extends 
ArtemisTestCase {
       return jsonFilterObject.toString();
    }
 
+   public String createJsonFilter(String fieldName, String operationName, 
String value, boolean legacy) throws Exception {
+      Map<String, Object> filterMap = new HashMap<>();
+      filterMap.put("field", fieldName);
+      filterMap.put("operation", operationName);
+      filterMap.put("value", value);
+      if (legacy) {
+         JsonObject jsonFilterObject = JsonUtil.toJsonObject(filterMap);
+         return jsonFilterObject.toString();
+      } else {
+         Map<String, Object>[] filtersArray = new HashMap[1];
+         filtersArray[0] = filterMap;
+         Map<String, Object> filtersMap = new HashMap<>();
+         filtersMap.put("searchFilters", filtersArray);
+         JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap);
+         return jsonFiltersObject.toString();
+      }
+   }
+
+   public String createJsonArrayFilter(String fieldName, String operationName, 
String value, String fieldName2, String operationName2, String value2) throws 
Exception {
+      Map<String, Object> filterMap = new HashMap<>();
+      filterMap.put("field", fieldName);
+      filterMap.put("operation", operationName);
+      filterMap.put("value", value);
+      Map<String, Object> filterMap2 = new HashMap<>();
+      filterMap2.put("field", fieldName2);
+      filterMap2.put("operation", operationName2);
+      filterMap2.put("value", value2);
+      Map<String, Object>[] filtersArray = new HashMap[2];
+      filtersArray[0] = filterMap;
+      filtersArray[1] = filterMap2;
+      Map<String, Object> filtersMap = new HashMap<>();
+      filtersMap.put("searchFilters", filtersArray);
+      JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap);
+      return jsonFiltersObject.toString();
+   }
+
+   public String createJsonArrayFilter(String fieldName, String operationName, 
String value, String fieldName2, String operationName2, String value2, String 
fieldName3, String operationName3, String value3) throws Exception {
+      Map<String, Object> filterMap = new HashMap<>();
+      filterMap.put("field", fieldName);
+      filterMap.put("operation", operationName);
+      filterMap.put("value", value);
+      Map<String, Object> filterMap2 = new HashMap<>();
+      filterMap2.put("field", fieldName2);
+      filterMap2.put("operation", operationName2);
+      filterMap2.put("value", value2);
+      Map<String, Object> filterMap3 = new HashMap<>();
+      filterMap3.put("field", fieldName3);
+      filterMap3.put("operation", operationName3);
+      filterMap3.put("value", value3);
+      Map<String, Object>[] filtersArray = new HashMap[3];
+      filtersArray[0] = filterMap;
+      filtersArray[1] = filterMap2;
+      filtersArray[2] = filterMap3;
+      Map<String, Object> filtersMap = new HashMap<>();
+      filtersMap.put("searchFilters", filtersArray);
+      JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap);
+      return jsonFiltersObject.toString();
+   }
+
    protected static ReplicationEndpoint getReplicationEndpoint(ActiveMQServer 
server) {
       final Activation activation = server.getActivation();
       if (activation instanceof SharedNothingBackupActivation 
backupActivation) {
diff --git 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index 6abdf31631..5bc25a7fa0 100644
--- 
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++ 
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -3696,8 +3696,17 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       
assertNotNull(obj.getJsonObject("metadata").getJsonString(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY));
    }
 
+   @TestTemplate
+   public void testListQueuesLegacyFilter() throws Exception {
+      testListQueues(true);
+   }
+
    @TestTemplate
    public void testListQueues() throws Exception {
+      testListQueues(false);
+   }
+
+   public void testListQueues(boolean legacyFilter) throws Exception {
       SimpleString queueName1 = SimpleString.of("my_queue_one");
       SimpleString queueName2 = SimpleString.of("my_queue_two");
       SimpleString queueName3 = SimpleString.of("other_queue_three");
@@ -3726,7 +3735,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       }
 
       //test with filter that matches 2 queues
-      String filterString = createJsonFilter("name", "CONTAINS", "my_queue");
+      String filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
legacyFilter);
 
       String queuesAsJsonString = serverControl.listQueues(filterString, 1, 
50);
 
@@ -3738,7 +3747,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       
assertTrue(array.getJsonObject(1).getString("name").contains("my_queue"));
 
       //test with an empty filter
-      filterString = createJsonFilter("internalQueue", "NOT_CONTAINS", "true");
+      filterString = createJsonFilter("internalQueue", "NOT_CONTAINS", "true", 
legacyFilter);
 
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
@@ -3783,8 +3792,16 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals("false", array.getJsonObject(0).getString("autoDelete"), 
"autoDelete");
    }
 
+   @TestTemplate
+   public void testListQueuesOrderLegacyFilter() throws Exception {
+      testListQueuesOrder(true);
+   }
+
    @TestTemplate
    public void testListQueuesOrder() throws Exception {
+      testListQueuesOrder(true);
+   }
+   public void testListQueuesOrder(boolean legacyFilter) throws Exception {
       SimpleString queueName1 = SimpleString.of("my_queue_1");
       SimpleString queueName2 = SimpleString.of("my_queue_2");
       SimpleString queueName3 = SimpleString.of("my_queue_3");
@@ -3816,7 +3833,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       }
 
       //test default order
-      String filterString = createJsonFilter("name", "CONTAINS", "my_queue");
+      String filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
legacyFilter);
       String queuesAsJsonString = serverControl.listQueues(filterString, 1, 
50);
       JsonObject queuesAsJsonObject = 
JsonUtil.readJsonObject(queuesAsJsonString);
       JsonArray array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3827,7 +3844,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName3.toString(), 
array.getJsonObject(2).getString("name"), "queue3 default Order");
 
       //test ordered by id desc
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", "id", 
"desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", "id", 
"desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3838,7 +3855,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName1.toString(), 
array.getJsonObject(2).getString("name"), "queue1 ordered by id");
 
       //ordered by address desc
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3849,7 +3866,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName1.toString(), 
array.getJsonObject(2).getString("name"), "queue1 ordered by address");
 
       //ordered by auto create desc
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"autoCreated", "asc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"autoCreated", "asc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3860,7 +3877,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals("true", array.getJsonObject(2).getString("autoCreated"), 
"pos3 ordered by autocreate");
 
       //ordered by filter desc
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"filter", "desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"filter", "desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3871,7 +3888,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName3.toString(), 
array.getJsonObject(2).getString("name"), "queue3 ordered by filter");
 
       //ordered by max consumers asc
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"maxConsumers", "asc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"maxConsumers", "asc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3883,7 +3900,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
 
       //ordering between the pages
       //page 1
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 1, 1);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3891,7 +3908,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName3.toString(), 
array.getJsonObject(0).getString("name"), "queue3 ordered by page");
 
       //page 2
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 2, 1);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3899,7 +3916,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       assertEquals(queueName2.toString(), 
array.getJsonObject(0).getString("name"), "queue2 ordered by page");
 
       //page 3
-      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc");
+      filterString = createJsonFilter("name", "CONTAINS", "my_queue", 
"address", "desc", legacyFilter);
       queuesAsJsonString = serverControl.listQueues(filterString, 3, 1);
       queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
       array = (JsonArray) queuesAsJsonObject.get("data");
@@ -3908,8 +3925,17 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
 
    }
 
+   @TestTemplate
+   public void testListQueuesNumericFilterLegacyFilter() throws Exception {
+      testListQueuesNumericFilter(true);
+   }
+
    @TestTemplate
    public void testListQueuesNumericFilter() throws Exception {
+      testListQueuesNumericFilter(false);
+   }
+
+   public void testListQueuesNumericFilter(boolean legacyFilter) throws 
Exception {
       SimpleString queueName1 = SimpleString.of("my_queue_one");
       SimpleString queueName2 = SimpleString.of("my_queue_two");
       SimpleString queueName3 = SimpleString.of("one_consumer_queue_three");
@@ -3973,7 +3999,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          session.commit();
 
          //test with CONTAINS returns nothing for numeric field
-         String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", 
"0");
+         String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", 
"0", legacyFilter);
          String queuesAsJsonString = serverControl.listQueues(filterString, 1, 
50);
 
          JsonObject queuesAsJsonObject = 
JsonUtil.readJsonObject(queuesAsJsonString);
@@ -3981,7 +4007,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from query");
 
          //test with LESS_THAN returns 1 queue
-         filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "1");
+         filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "1", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -3990,7 +4016,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName4.toString(), 
array.getJsonObject(1).getString("name"), "correct queue returned from query");
 
          //test with GREATER_THAN returns 2 queue
-         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"2");
+         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"2", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -3999,7 +4025,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName2.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with GREATER_THAN returns 2 queue
-         filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "3");
+         filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "3", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4008,7 +4034,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName2.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with MESSAGE_COUNT returns 2 queue
-         filterString = createJsonFilter("MESSAGE_COUNT", "GREATER_THAN", "5");
+         filterString = createJsonFilter("MESSAGE_COUNT", "GREATER_THAN", "5", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4017,7 +4043,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName1.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with MESSAGE_ADDED returns 1 queue
-         filterString = createJsonFilter("MESSAGES_ADDED", "GREATER_THAN", 
"5");
+         filterString = createJsonFilter("MESSAGES_ADDED", "GREATER_THAN", 
"5", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4026,7 +4052,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName1.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with DELIVERING_COUNT returns 1 queue
-         filterString = createJsonFilter("DELIVERING_COUNT", "GREATER_THAN", 
"5");
+         filterString = createJsonFilter("DELIVERING_COUNT", "GREATER_THAN", 
"5", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4035,7 +4061,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName1.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with MESSAGE_ACKED returns 1 queue
-         filterString = createJsonFilter("MESSAGES_ACKED", "GREATER_THAN", 
"0");
+         filterString = createJsonFilter("MESSAGES_ACKED", "GREATER_THAN", 
"0", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4044,7 +4070,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName1.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with MAX_CONSUMERS returns 1 queue
-         filterString = createJsonFilter("MAX_CONSUMERS", "GREATER_THAN", "9");
+         filterString = createJsonFilter("MAX_CONSUMERS", "GREATER_THAN", "9", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4053,7 +4079,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(queueName3.toString(), 
array.getJsonObject(0).getString("name"), "correct queue returned from query");
 
          //test with MESSAGES_KILLED returns 0 queue
-         filterString = createJsonFilter("MESSAGES_KILLED", "GREATER_THAN", 
"0");
+         filterString = createJsonFilter("MESSAGES_KILLED", "GREATER_THAN", 
"0", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4064,8 +4090,17 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
 
    }
 
+   @TestTemplate
+   public void testListQueuesNumericFilterInvalidLegacyFilter() throws 
Exception {
+      testListQueuesNumericFilterInvalid(true);
+   }
+
    @TestTemplate
    public void testListQueuesNumericFilterInvalid() throws Exception {
+      testListQueuesNumericFilterInvalid(false);
+   }
+
+   public void testListQueuesNumericFilterInvalid(boolean legacyFilter) throws 
Exception {
       SimpleString queueName1 = SimpleString.of("my_queue_one");
       SimpleString queueName2 = SimpleString.of("one_consumer_queue_two");
       SimpleString queueName3 = SimpleString.of("one_consumer_queue_three");
@@ -4111,7 +4146,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          ClientConsumer consumer2_q1 = session.createConsumer(queueName1);
 
          //test with CONTAINS returns nothing for numeric field
-         String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", 
"NOT_NUMBER");
+         String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", 
"NOT_NUMBER", legacyFilter);
          String queuesAsJsonString = serverControl.listQueues(filterString, 1, 
50);
 
          JsonObject queuesAsJsonObject = 
JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4119,7 +4154,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from query");
 
          //test with LESS_THAN and not a number
-         filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", 
"NOT_NUMBER");
+         filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", 
"NOT_NUMBER", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4127,7 +4162,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from 
LESS_THAN query");
 
          //test with GREATER_THAN and not a number
-         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"NOT_NUMBER");
+         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"NOT_NUMBER", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4135,7 +4170,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from 
GREATER_THAN query");
 
          //test with EQUALS and not number
-         filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", 
"NOT_NUMBER");
+         filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", 
"NOT_NUMBER", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4143,7 +4178,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from EQUALS 
query");
 
          //test with LESS_THAN on string value returns no queue
-         filterString = createJsonFilter("name", "LESS_THAN", "my_queue");
+         filterString = createJsonFilter("name", "LESS_THAN", "my_queue", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4151,7 +4186,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from 
LESS_THAN on non numeric field");
 
          //test with GREATER_THAN on string value returns no queue
-         filterString = createJsonFilter("name", "GREATER_THAN", "my_queue");
+         filterString = createJsonFilter("name", "GREATER_THAN", "my_queue", 
legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4159,7 +4194,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from 
GREATER_THAN on non numeric field");
 
          //test with GREATER_THAN and empty string
-         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", " 
");
+         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", " 
", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4167,7 +4202,7 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
          assertEquals(0, array.size(), "number of queues returned from 
GREATER_THAN query");
 
          //test with CONSUMER_COUNT against a float value
-         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"0.12");
+         filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", 
"0.12", legacyFilter);
          queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
 
          queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
@@ -4178,6 +4213,97 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
 
    }
 
+   @TestTemplate
+   public void testListQueuesMultipleFilters() throws Exception {
+      SimpleString queueName1 = SimpleString.of("my_queue_one");
+      SimpleString queueName2 = SimpleString.of("my_queue_two");
+      SimpleString queueName3 = SimpleString.of("my_queue_one_two");
+
+      ActiveMQServerControl serverControl = createManagementControl();
+
+      server.addAddressInfo(new AddressInfo(queueName1, RoutingType.ANYCAST));
+      if (legacyCreateQueue) {
+         server.createQueue(queueName1, RoutingType.ANYCAST, queueName1, null, 
false, false);
+      } else {
+         
server.createQueue(QueueConfiguration.of(queueName1).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+      }
+
+      server.addAddressInfo(new AddressInfo(queueName2, RoutingType.ANYCAST));
+      if (legacyCreateQueue) {
+         server.createQueue(queueName2, RoutingType.ANYCAST, queueName2, null, 
false, false);
+      } else {
+         
server.createQueue(QueueConfiguration.of(queueName2).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+      }
+
+      server.addAddressInfo(new AddressInfo(queueName3, RoutingType.ANYCAST));
+      if (legacyCreateQueue) {
+         server.createQueue(queueName3, RoutingType.ANYCAST, queueName3, null, 
true, false);
+      } else {
+         
server.createQueue(QueueConfiguration.of(queueName3).setRoutingType(RoutingType.ANYCAST).setDurable(true));
+      }
+
+      //test with filter that matches 2 queues
+      String filterString = createJsonFilter("name", "CONTAINS", "my_queue");
+
+      String queuesAsJsonString = serverControl.listQueues(filterString, 1, 
50);
+
+      JsonObject queuesAsJsonObject = 
JsonUtil.readJsonObject(queuesAsJsonString);
+      JsonArray array = (JsonArray) queuesAsJsonObject.get("data");
+
+      assertEquals(3, array.size(), "number of queues returned from query");
+      
assertTrue(array.getJsonObject(0).getString("name").contains("my_queue"));
+      
assertTrue(array.getJsonObject(1).getString("name").contains("my_queue"));
+      
assertTrue(array.getJsonObject(2).getString("name").contains("my_queue"));
+
+      //test with an 2 filters
+      filterString = createJsonArrayFilter("name", "CONTAINS", "my_queue", 
"name", "CONTAINS", "one");
+
+      queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
+
+      queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
+      array = (JsonArray) queuesAsJsonObject.get("data");
+
+      // at least 3 queues or more
+      assertEquals(2, array.size(), "number of queues returned from query");
+      
assertTrue(array.getJsonObject(0).getString("name").contains("my_queue"));
+      
assertTrue(array.getJsonObject(1).getString("name").contains("my_queue"));
+      assertTrue(array.getJsonObject(0).getString("name").contains("one"));
+      assertTrue(array.getJsonObject(1).getString("name").contains("one"));
+      filterString = createJsonArrayFilter("name", "CONTAINS", "my_queue", 
"name", "CONTAINS", "one", "durable", "EQUALS", "true");
+
+      queuesAsJsonString = serverControl.listQueues(filterString, 1, 50);
+
+      queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString);
+      array = (JsonArray) queuesAsJsonObject.get("data");
+
+      assertEquals(1, array.size(), "number of queues returned from query");
+      //check all field names are available
+      assertNotEquals("", array.getJsonObject(0).getString("name"), "name");
+      assertNotEquals("", array.getJsonObject(0).getString("id"), "id");
+      assertNotEquals("", array.getJsonObject(0).getString("address"), 
"address");
+      assertEquals("", array.getJsonObject(0).getString("filter"), "filter");
+      assertEquals("true", array.getJsonObject(0).getString("durable"), 
"durable");
+      assertEquals("false", array.getJsonObject(0).getString("paused"), 
"paused");
+      assertNotEquals("", array.getJsonObject(0).getString("temporary"), 
"temporary");
+      assertEquals("false", 
array.getJsonObject(0).getString("purgeOnNoConsumers"), "purgeOnNoConsumers");
+      assertNotEquals("", array.getJsonObject(0).getString("consumerCount"), 
"consumerCount");
+      assertEquals("-1", array.getJsonObject(0).getString("maxConsumers"), 
"maxConsumers");
+      assertEquals("false", array.getJsonObject(0).getString("autoCreated"), 
"autoCreated");
+      assertNotEquals("", array.getJsonObject(0).getString("routingType"), 
"routingType");
+      assertEquals("0", array.getJsonObject(0).getString("messagesAdded"), 
"messagesAdded");
+      assertEquals("0", array.getJsonObject(0).getString("messageCount"), 
"messageCount");
+      assertEquals("0", array.getJsonObject(0).getString("messagesAcked"), 
"messagesAcked");
+      assertEquals("0", array.getJsonObject(0).getString("deliveringCount"), 
"deliveringCount");
+      assertEquals("0", array.getJsonObject(0).getString("messagesKilled"), 
"messagesKilled");
+      assertEquals("false", array.getJsonObject(0).getString("exclusive"), 
"exclusive");
+      assertEquals("false", array.getJsonObject(0).getString("lastValue"), 
"lastValue");
+      assertEquals("0", array.getJsonObject(0).getString("scheduledCount"), 
"scheduledCount");
+      assertEquals("false", 
array.getJsonObject(0).getString("groupRebalance"), "groupRebalance");
+      assertEquals("-1", array.getJsonObject(0).getString("groupBuckets"), 
"groupBuckets");
+      assertEquals("", array.getJsonObject(0).getString("groupFirstKey"), 
"groupFirstKey");
+      assertEquals("false", array.getJsonObject(0).getString("autoDelete"), 
"autoDelete");
+   }
+
    @TestTemplate
    public void testListAddresses() throws Exception {
       SimpleString queueName1 = SimpleString.of("my_queue_one");
@@ -6584,6 +6710,27 @@ public class ActiveMQServerControlTest extends 
ManagementTestBase {
       return jsonFilterObject.toString();
    }
 
+   public String createJsonFilter(String fieldName, String operationName, 
String value, String sortField, String sortOrder, boolean legacyFilter) throws 
Exception {
+      Map<String, Object> filterMap = new HashMap<>();
+      filterMap.put("field", fieldName);
+      filterMap.put("operation", operationName);
+      filterMap.put("value", value);
+      filterMap.put("sortField", sortField);
+      filterMap.put("sortOrder", sortOrder);
+      if (legacyFilter) {
+         JsonObject jsonFilterObject = JsonUtil.toJsonObject(filterMap);
+         return jsonFilterObject.toString();
+      } else {
+         Map<String, Object>[] filtersArray = new HashMap[1];
+         filtersArray[0] = filterMap;
+         Map<String, Object> filtersMap = new HashMap<>();
+         filtersMap.put("searchFilters", filtersArray);
+         JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap);
+         return jsonFiltersObject.toString();
+      }
+   }
+
+
    private void sendMessagesWithPredefinedSize(int numberOfMessages,
                                                ClientSession session,
                                                ClientProducer producer,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to