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;