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

mariofusco pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git

commit 80c05c433fd7fb719dbfda4d111cd78d89d20afe
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Fri Oct 13 17:34:40 2023 +0900

    [DROOLS-7304] Implement temporal operators (#38)
    
    - Also covers [DROOLS-7303] Implement sliding window
---
 .../src/main/antlr4/org/drools/parser/DRLLexer.g4    | 20 +++++++++++++++++++-
 .../src/main/antlr4/org/drools/parser/DRLParser.g4   | 14 +++++++++++++-
 .../main/java/org/drools/parser/DRLVisitorImpl.java  | 18 +++++++++++++++++-
 .../java/org/drools/parser/MiscDRLParserTest.java    |  7 +------
 4 files changed, 50 insertions(+), 9 deletions(-)

diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
index 0add536a0b..d200e7c6e8 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLLexer.g4
@@ -53,7 +53,25 @@ DRL_RESULT : 'result';
 DRL_ENTRY_POINT : 'entry-point';
 DRL_EVAL : 'eval';
 DRL_FORALL : 'forall';
-
+DRL_OVER : 'over';
+
+// temporal operators
+DRL_AFTER : 'after';
+DRL_BEFORE : 'before';
+DRL_COINCIDES : 'coincides';
+DRL_DURING : 'during';
+DRL_INCLUDES : 'includes';
+DRL_FINISHES : 'finishes';
+DRL_FINISHED_BY : 'finishedby';
+DRL_MEETS : 'meets';
+DRL_MET_BY : 'metby';
+DRL_OVERLAPS : 'overlaps';
+DRL_OVERLAPPED_BY : 'overlappedby';
+DRL_STARTS : 'starts';
+DRL_STARTED_BY : 'startedby';
+
+
+// attributes
 DRL_SALIENCE : 'salience';
 DRL_ENABLED : 'enabled';
 DRL_NO_LOOP : 'no-loop';
diff --git 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
index 76651552ac..e531c3d91c 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
+++ 
b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4
@@ -80,7 +80,7 @@ lhsPattern : xpathPrimary (OVER patternFilter)? |
              ( QUESTION? qualifiedIdentifier LPAREN positionalConstraints? 
constraints? RPAREN (OVER patternFilter)? (FROM patternSource)? ) ;
 */
 
-lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints? constraints? RPAREN (DRL_FROM patternSource)? ;
+lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN 
positionalConstraints? constraints? RPAREN (DRL_OVER patternFilter)? (DRL_FROM 
patternSource)? ;
 positionalConstraints : constraint (COMMA constraint)* SEMI ;
 constraints : constraint (COMMA constraint)* ;
 constraint : ( nestedConstraint | conditionalOrExpression ) ;
@@ -105,6 +105,7 @@ relationalOperator
     | GE
     | GT
     | LT
+    | temporalOperator
     ;
 
 /* function := FUNCTION type? ID parameters(typed) chunk_{_} */
@@ -204,6 +205,7 @@ drlExpression
     | drlExpression bop=(ADD|SUB) drlExpression
     | drlExpression (LT LT | GT GT GT | GT GT) drlExpression
     | drlExpression bop=(LE | GE | GT | LT) drlExpression
+    | drlExpression temporalOperator drlExpression
     | drlExpression bop=INSTANCEOF (typeType | pattern)
     | drlExpression bop=DRL_MATCHES drlExpression
     | drlExpression DRL_NOT? DRL_MEMBEROF drlExpression
@@ -226,6 +228,10 @@ drlExpression
     | classType COLONCOLON typeArguments? NEW
     ;
 
+temporalOperator : DRL_NOT? bop=(DRL_AFTER | DRL_BEFORE | DRL_COINCIDES | 
DRL_DURING | DRL_INCLUDES | DRL_FINISHES | DRL_FINISHED_BY | DRL_MEETS | 
DRL_MET_BY | DRL_OVERLAPS | DRL_OVERLAPPED_BY | DRL_STARTS | DRL_STARTED_BY) 
timeAmount? ;
+
+timeAmount : LBRACK (TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL) (COMMA 
(TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL))* RBRACK ;
+
 /* extending JavaParser primary */
 drlPrimary
     : LPAREN drlExpression RPAREN
@@ -272,6 +278,12 @@ mapEntry
     :  drlExpression COLON drlExpression
     ;
 
+/*
+ patternFilter :=   OVER filterDef
+ filterDef := label ID LEFT_PAREN parameters RIGHT_PAREN
+*/
+patternFilter : label IDENTIFIER LPAREN expressionList RPAREN ;
+
 /*
  patternSource := FROM
                 ( fromAccumulate
diff --git 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
index 078ec4a869..596e31c7e4 100644
--- 
a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
+++ 
b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java
@@ -3,6 +3,7 @@ package org.drools.parser;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.TokenStream;
@@ -14,6 +15,7 @@ import org.drools.drl.ast.descr.AndDescr;
 import org.drools.drl.ast.descr.AnnotationDescr;
 import org.drools.drl.ast.descr.AttributeDescr;
 import org.drools.drl.ast.descr.BaseDescr;
+import org.drools.drl.ast.descr.BehaviorDescr;
 import org.drools.drl.ast.descr.EntryPointDescr;
 import org.drools.drl.ast.descr.EvalDescr;
 import org.drools.drl.ast.descr.ExistsDescr;
@@ -42,7 +44,7 @@ import static org.drools.util.StringUtils.unescapeJava;
 
 public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> {
 
-    private TokenStream tokenStream;
+    private final TokenStream tokenStream;
 
     public DRLVisitorImpl(TokenStream tokenStream) {
         this.tokenStream = tokenStream;
@@ -252,6 +254,9 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
     @Override
     public PatternDescr visitLhsPattern(DRLParser.LhsPatternContext ctx) {
         PatternDescr patternDescr = new PatternDescr(ctx.objectType.getText());
+        if (ctx.patternFilter() != null) {
+            patternDescr.addBehavior(visitPatternFilter(ctx.patternFilter()));
+        }
         if (ctx.patternSource() != null) {
             PatternSourceDescr patternSourceDescr = (PatternSourceDescr) 
visitPatternSource(ctx.patternSource());
             patternSourceDescr.setResource(patternDescr.getResource());
@@ -291,6 +296,17 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
         return patternDescr;
     }
 
+    @Override
+    public BehaviorDescr visitPatternFilter(DRLParser.PatternFilterContext 
ctx) {
+        BehaviorDescr behaviorDescr = new BehaviorDescr();
+        behaviorDescr.setType(ctx.label().IDENTIFIER().getText());
+        behaviorDescr.setSubType(ctx.IDENTIFIER().getText());
+        List<DRLParser.DrlExpressionContext> drlExpressionContexts = 
ctx.expressionList().drlExpression();
+        List<String> parameters = 
drlExpressionContexts.stream().map(ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.toList());
+        behaviorDescr.setParameters(parameters);
+        return behaviorDescr;
+    }
+
     @Override
     public FromDescr visitFromExpression(DRLParser.FromExpressionContext ctx) {
         FromDescr fromDescr = new FromDescr();
diff --git 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
index d38ed5bf77..ca78882b59 100644
--- 
a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
+++ 
b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java
@@ -2713,7 +2713,6 @@ class MiscDRLParserTest {
         assertThat(cheese.getObjectType()).isEqualTo("Cheese");
     }
 
-    @Disabled("Priority : High | Implement temporal operators")
     @Test
     public void parse_PluggableOperators() throws Exception {
 
@@ -2934,13 +2933,11 @@ class MiscDRLParserTest {
         assertThat(entry.getEntryId()).isEqualTo("StreamA");
     }
 
-    @Disabled("Priority : High | Implement sliding window")
     @Test
     public void parse_SlidingWindow() throws Exception {
         final String text = "rule X when StockTick( symbol==\"ACME\") over 
window:length(10) then end";
 
-        PackageDescr pkg = parser.parse(
-                                                 text );
+        PackageDescr pkg = parser.parse( text );
         
assertThat(parser.hasErrors()).as(parser.getErrors().toString()).isFalse();
 
         RuleDescr rule = pkg.getRules().get( 0 );
@@ -3219,7 +3216,6 @@ class MiscDRLParserTest {
         assertThat(((ExprConstraintDescr) 
constraints.get(0)).getExpression()).isEqualTo("$name : name.toUpperCase() == 
\"Bob\" || $loc : location[0].city == \"Montreal\"");
     }
 
-    @Disabled("Priority : High | Implement temporal operators")
     @Test
     public void parse_PluggableOperators2() throws Exception {
         final String text = "rule \"tt\"\n" +
@@ -3253,7 +3249,6 @@ class MiscDRLParserTest {
 
     }
 
-    @Disabled("Priority : High | Implement temporal operators")
     @Test
     public void parse_InfinityLiteral() throws Exception {
         final String text = "rule \"infinity\"\n" +


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

Reply via email to