SLING-7688 - [HTL] Add support for the in relational operator
diff --git a/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4 b/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4
index 9dc6ebf..de8c1fc 100644
--- a/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4
+++ b/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4
@@ -38,6 +38,8 @@
RBRACKET: ')';
+IN_OP: 'in';
+
AND_OP: '&&';
OR_OP: '||';
diff --git a/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4 b/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4
index 81d511a..2470086 100644
--- a/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4
+++ b/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4
@@ -83,7 +83,7 @@
;
operator returns [BinaryOperator op]
- : AND_OP { $op = BinaryOperator.AND; } | OR_OP { $op = BinaryOperator.OR; }
+ : AND_OP { $op = BinaryOperator.AND; } | OR_OP { $op = BinaryOperator.OR; } | IN_OP { $op = BinaryOperator.IN; }
;
comparisonTerm returns [ExpressionNode node]
diff --git a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/BinaryOperator.java b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/BinaryOperator.java
index d689093..ff6bb9a 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/BinaryOperator.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/BinaryOperator.java
@@ -18,6 +18,8 @@
******************************************************************************/
package org.apache.sling.scripting.sightly.compiler.expression.nodes;
+import java.util.Collection;
+
import org.apache.sling.scripting.sightly.compiler.SightlyCompilerException;
import org.apache.sling.scripting.sightly.compiler.util.ObjectModel;
@@ -182,6 +184,13 @@
% ObjectModel.toNumber(right).intValue());
}
+ },
+
+ IN {
+ @Override
+ public Object eval(Object left, Object right) {
+ return inOp(left, right);
+ }
};
public static boolean eq(Object left, Object right) {
@@ -239,6 +248,21 @@
" and Boolean types.");
}
+ public static boolean inOp(Object left, Object right) {
+ if (left instanceof String && right instanceof String) {
+ String leftString = (String) left;
+ String rightString = (String) right;
+ return rightString.contains(leftString);
+ }
+ Collection rightElements = ObjectModel.toCollection(right);
+ for (Object element : rightElements) {
+ if (element.equals(left)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
private static Number adjust(double x) {
if (Math.floor(x) == x) {
return (int) x;
diff --git a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/package-info.java b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/package-info.java
index 69398b9..104dfe7 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/package-info.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/package-info.java
@@ -19,7 +19,7 @@
* The {@code org.apache.sling.scripting.sightly.compiler.expression.nodes} package exposes the various
* {@link org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode} types.
*/
-@Version("1.0.0")
+@Version("1.1.0")
package org.apache.sling.scripting.sightly.compiler.expression.nodes;
import org.osgi.annotation.versioning.Version;