This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch activemq-5.17.x
in repository https://gitbox.apache.org/repos/asf/activemq.git
The following commit(s) were added to refs/heads/activemq-5.17.x by this push:
new f103c2cec AMQ-9052: Selectors - improve perfomance of Equals and Not
f103c2cec is described below
commit f103c2cec95dbd94701fadd51c98c76580fcfe62
Author: Enrico Olivelli <[email protected]>
AuthorDate: Wed Aug 17 10:42:37 2022 +0200
AMQ-9052: Selectors - improve perfomance of Equals and Not
(cherry picked from commit a978eb5115d34249c0980e24691b946303ee2cd0)
---
.../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";
+ }
+ }
}