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

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


The following commit(s) were added to refs/heads/main by this push:
     new a978eb511 AMQ-9052: Selectors - improve perfomance of Equals and Not
     new 9833200db Merge pull request #895 from eolivelli/AMQ-9052
a978eb511 is described below

commit a978eb5115d34249c0980e24691b946303ee2cd0
Author: Enrico Olivelli <[email protected]>
AuthorDate: Wed Aug 17 10:42:37 2022 +0200

    AMQ-9052: Selectors - improve perfomance of Equals and Not
---
 .../activemq/filter/ComparisonExpression.java      | 76 +++++++++++++++-------
 .../apache/activemq/filter/LogicExpression.java    |  1 -
 .../apache/activemq/filter/UnaryExpression.java    | 43 +++++++-----
 3 files changed, 80 insertions(+), 40 deletions(-)

diff --git 
a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
 
b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
index f87ed13e7..fb1284c12 100644
--- 
a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
+++ 
b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
@@ -214,36 +214,66 @@ public abstract class ComparisonExpression extends 
BinaryExpression implements B
 
     @SuppressWarnings({ "rawtypes" })
     private static BooleanExpression doCreateEqual(Expression left, Expression 
right) {
-        return new ComparisonExpression(left, right) {
+        return new EqualsExpression(left, right);
+    }
 
-            public Object evaluate(MessageEvaluationContext message) throws 
JMSException {
-                Object lv = left.evaluate(message);
-                Object rv = right.evaluate(message);
+    private static class EqualsExpression extends ComparisonExpression {
+        EqualsExpression(Expression left, Expression right) {
+            super(left, right);
+        }
 
-                // If one of the values is null
-                if (lv == null ^ rv == null) {
-                    if (lv == null) {
-                        return null;
-                    }
-                    return Boolean.FALSE;
-                }
-                if (lv == rv || lv.equals(rv)) {
-                    return Boolean.TRUE;
-                }
-                if (lv instanceof Comparable && rv instanceof Comparable) {
-                    return compare((Comparable)lv, (Comparable)rv);
+        public Object evaluate(MessageEvaluationContext message) throws 
JMSException {
+            Object lv = left.evaluate(message);
+            Object rv = right.evaluate(message);
+
+            // If one of the values is null
+            if (lv == null ^ rv == null) {
+                if (lv == null) {
+                    return null;
                 }
                 return Boolean.FALSE;
             }
-
-            protected boolean asBoolean(int answer) {
-                return answer == 0;
+            if (lv == rv || lv.equals(rv)) {
+                return Boolean.TRUE;
+            }
+            if (lv instanceof Comparable && rv instanceof Comparable) {
+                return compare((Comparable) lv, (Comparable) rv);
             }
+            return Boolean.FALSE;
+        }
 
-            public String getExpressionSymbol() {
-                return "=";
+        @Override
+        public boolean matches(MessageEvaluationContext message) throws 
JMSException {
+            Object lv = left.evaluate(message);
+            Object rv = right.evaluate(message);
+
+            // If one of the values is null
+            if (lv == null ^ rv == null) {
+                return false;
             }
-        };
+            if (lv == rv || lv.equals(rv)) {
+                return true;
+            }
+            if (lv.getClass() == rv.getClass()) {
+                // same class, but 'equals' return false, and they are not the 
same object
+                // there is no point in doing 'compare'
+                // this case happens often while comparing non equals Strings
+                return false;
+            }
+            if (lv instanceof Comparable && rv instanceof Comparable) {
+                Boolean compareResult = compare((Comparable) lv, (Comparable) 
rv);
+                return compareResult != null && compareResult;
+            }
+            return false;
+        }
+
+        protected boolean asBoolean(int answer) {
+            return answer == 0;
+        }
+
+        public String getExpressionSymbol() {
+            return "=";
+        }
     }
 
     public static BooleanExpression createGreaterThan(final Expression left, 
final Expression right) {
@@ -286,7 +316,6 @@ public abstract class ComparisonExpression extends 
BinaryExpression implements B
             public String getExpressionSymbol() {
                 return "<";
             }
-
         };
     }
 
@@ -491,5 +520,4 @@ public abstract class ComparisonExpression extends 
BinaryExpression implements B
         Object object = evaluate(message);
         return object != null && object == Boolean.TRUE;
     }
-
 }
diff --git 
a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java 
b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
index e9145a971..0652431cb 100644
--- 
a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
+++ 
b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
@@ -141,7 +141,6 @@ public abstract class LogicExpression implements 
BooleanExpression {
         public String getExpressionSymbol() {
             return "OR";
         }
-
     }
 
     private static class ANDExpression extends LogicExpression {
diff --git 
a/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java 
b/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java
index c5d0606ef..e4638406c 100644
--- 
a/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java
+++ 
b/activemq-client/src/main/java/org/apache/activemq/filter/UnaryExpression.java
@@ -86,7 +86,6 @@ public abstract class UnaryExpression implements Expression {
                 } else {
                     return Boolean.FALSE;
                 }
-
             }
 
             public String toString() {
@@ -132,19 +131,7 @@ public abstract class UnaryExpression implements 
Expression {
     };
 
     public static BooleanExpression createNOT(BooleanExpression left) {
-        return new BooleanUnaryExpression(left) {
-            public Object evaluate(MessageEvaluationContext message) throws 
JMSException {
-                Boolean lvalue = (Boolean)right.evaluate(message);
-                if (lvalue == null) {
-                    return null;
-                }
-                return lvalue.booleanValue() ? Boolean.FALSE : Boolean.TRUE;
-            }
-
-            public String getExpressionSymbol() {
-                return "NOT";
-            }
-        };
+        return new NotExpression(left);
     }
 
     public static BooleanExpression createXPath(final String xpath) {
@@ -243,7 +230,6 @@ public abstract class UnaryExpression implements Expression 
{
             return false;
         }
         return toString().equals(o.toString());
-
     }
 
     /**
@@ -254,4 +240,31 @@ public abstract class UnaryExpression implements 
Expression {
      */
     public abstract String getExpressionSymbol();
 
+    private static class NotExpression extends BooleanUnaryExpression {
+        public NotExpression(BooleanExpression right) {
+            super(right);
+        }
+
+        public Object evaluate(MessageEvaluationContext message) throws 
JMSException {
+            Boolean lvalue = (Boolean) right.evaluate(message);
+            if (lvalue == null) {
+                return null;
+            }
+            return lvalue.booleanValue() ? Boolean.FALSE : Boolean.TRUE;
+        }
+
+        @Override
+        public boolean matches(MessageEvaluationContext message) throws 
JMSException {
+            Boolean lvalue = (Boolean) right.evaluate(message);
+            if (lvalue == null) {
+                // NOT NULL returns NULL that eventually fails the selector
+                return false;
+            }
+            return !lvalue;
+        }
+
+        public String getExpressionSymbol() {
+            return "NOT";
+        }
+    }
 }

Reply via email to