This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/dev-new-parser by this push:
new 160b24ae12 [new-parser] Allow OOPath as a LHS pattern (#5884)
160b24ae12 is described below
commit 160b24ae120afc7a01c36a9bd0bcf4542c3c5f97
Author: Jiří Locker <[email protected]>
AuthorDate: Tue May 7 04:41:39 2024 +0200
[new-parser] Allow OOPath as a LHS pattern (#5884)
* Add OOPath support to lhsPattern
* Set namespace and unit properties to PackageDescr children
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 61 ++++++++++++++++++++++
.../drools/drl/parser/antlr4/package_children.drl | 53 +++++++++++++++++++
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 5 +-
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 21 ++++++++
4 files changed, 139 insertions(+), 1 deletion(-)
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
index 9f1d67035b..4964f77457 100644
---
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
+++
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
@@ -26,6 +26,7 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -4090,6 +4091,28 @@ class MiscDRLParserTest {
.isEqualToIgnoringWhitespace("/wife[$age : age] && age >
$age");
}
+ @Test
+ void ooPathLhsPattern() {
+ final String text = "package org.drools\n"
+ + "rule PlainNot when\n"
+ + " not( /strings [ this == \"It Does Work\" ] )\n"
+ + "then\n"
+ + "end\n";
+ PackageDescr packageDescr = parseAndGetPackageDescr(text);
+ RuleDescr ruleDescr = packageDescr.getRules().get(0);
+
assertThat(ruleDescr.getLhs().getDescrs().get(0)).isInstanceOfSatisfying(NotDescr.class,
notDescr -> {
+ assertThat(notDescr.getDescrs()).hasSize(1);
+
assertThat(notDescr.getDescrs().get(0)).isInstanceOfSatisfying(PatternDescr.class,
patternDescr -> {
+ assertThat(patternDescr.getConstraint().getDescrs()).hasSize(1);
+
assertThat(patternDescr.getConstraint().getDescrs().get(0)).isInstanceOfSatisfying(ExprConstraintDescr.class,
exprConstraintDescr -> {
+
assertThat(exprConstraintDescr.getExpression()).isEqualTo("/strings [ this ==
\"It Does Work\" ]");
+
assertThat(exprConstraintDescr.getType()).isEqualTo(ExprConstraintDescr.Type.NAMED);
+ assertThat(exprConstraintDescr.getPosition()).isEqualTo(0);
+ });
+ });
+ });
+ }
+
@Test
void inlineCast() {
final String text = "package org.drools\n" +
@@ -4605,4 +4628,42 @@ class MiscDRLParserTest {
TypeFieldDescr romanStr =
enumDeclarationDescr.getFields().get("romanStr");
assertThat(romanStr.getPattern().getObjectType()).isEqualTo("String");
}
+
+ @Test
+ void packageChildrenNamespaceAndUnitProperties() {
+ String namespace = "org.drools.compiler.test";
+ String source = readResource("package_children.drl");
+ PackageDescr pkg = parseAndGetPackageDescr(source);
+
+ // Package and Rule Unit's namespace.
+ assertThat(pkg.getName()).isEqualTo(namespace);
+ assertThat(pkg.getUnit().getNamespace()).isEqualTo(namespace);
+
+ // Children that are expected to have the package name as their
namespace.
+ assertNamespace(pkg.getImports(), namespace);
+ assertNamespace(pkg.getFunctionImports(), namespace);
+ assertNamespace(pkg.getAccumulateImports(), namespace);
+ assertNamespace(pkg.getGlobals(), namespace);
+ assertNamespace(pkg.getFunctions(), namespace);
+ assertNamespace(pkg.getRules(), namespace);
+ assertNamespace(pkg.getAttributes(), namespace);
+
+ // Children that are expected to have no namespace.
+ assertNamespace(pkg.getTypeDeclarations(), "");
+ assertNamespace(pkg.getEnumDeclarations(), "");
+ assertNamespace(pkg.getEntryPointDeclarations(), "");
+ assertNamespace(pkg.getWindowDeclarations(), "");
+
+ assertThat(pkg.getRules())
+ .allSatisfy(ruleDescr ->
assertThat(ruleDescr.getUnit()).isNotNull())
+ .allSatisfy(ruleDescr ->
assertThat(ruleDescr.getUnit().getTarget()).isEqualTo("TestUnit"));
+
+
assertThat(pkg.getRules().get(0).getUnitQualifiedName()).isEqualTo("TestUnit.MyQuery");
+
assertThat(pkg.getRules().get(1).getUnitQualifiedName()).isEqualTo("TestUnit.My
Rule");
+ }
+
+ static void assertNamespace(Collection<? extends BaseDescr> children,
String namespace) {
+ assertThat(children).isNotEmpty(); // Make sure that every child type
is represented.
+ assertThat(children).allSatisfy(baseDescr ->
assertThat(baseDescr.getNamespace()).isEqualTo(namespace));
+ }
}
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
b/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
new file mode 100644
index 0000000000..f419879de3
--- /dev/null
+++
b/drools-drl/drools-drl-parser-tests/src/test/resources/org/drools/drl/parser/antlr4/package_children.drl
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.drools.compiler.test
+
+unit TestUnit
+
+import org.drools.compiler.Cheese
+
+import function abc.def.x
+
+import accumulate foo.Bar2 baz2
+
+global List result
+
+declare Person end
+
+declare enum Color WHITE; end
+
+declare entry-point EntryPoint end
+
+declare window Window
+ Double() over window:length( 10 )
+end
+
+query MyQuery
+ Cheese()
+end
+
+function String doSomething() {}
+
+enabled true;
+
+dialect "java"
+
+rule "My Rule"
+when
+then
+end
diff --git
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
index a58b38e0b4..f0eba169bf 100644
---
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
+++
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
@@ -147,7 +147,10 @@ lhsPattern : xpathPrimary (OVER patternFilter)? |
( QUESTION? qualifiedIdentifier LPAREN positionalConstraints?
constraints? RPAREN (OVER patternFilter)? (FROM patternSource)? ) ;
*/
-lhsPattern : QUESTION? objectType=drlQualifiedName LPAREN
positionalConstraints? constraints? RPAREN drlAnnotation* (DRL_OVER
patternFilter)? (DRL_FROM patternSource)? ;
+lhsPattern
+ : xpathPrimary (DRL_OVER patternFilter)?
+ | QUESTION? objectType=drlQualifiedName LPAREN positionalConstraints?
constraints? RPAREN drlAnnotation* (DRL_OVER patternFilter)? (DRL_FROM
patternSource)?
+ ;
positionalConstraints : constraint (COMMA constraint)* SEMI ;
constraints : constraint (COMMA constraint)* ;
constraint : ( nestedConstraint | conditionalOrExpression ) ;
diff --git
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
index db5e0c2dd8..143e0a2da8 100644
---
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
+++
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
@@ -111,14 +111,19 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
// This bunch of if-blocks will be refactored by DROOLS-7564
descrList.forEach(descr -> {
if (descr instanceof UnitDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.setUnit((UnitDescr) descr);
} else if (descr instanceof GlobalDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.addGlobal((GlobalDescr) descr);
} else if (descr instanceof FunctionImportDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.addFunctionImport((FunctionImportDescr) descr);
} else if (descr instanceof AccumulateImportDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.addAccumulateImport((AccumulateImportDescr)
descr);
} else if (descr instanceof ImportDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.addImport((ImportDescr) descr);
} else if (descr instanceof FunctionDescr) {
FunctionDescr functionDescr = (FunctionDescr) descr;
@@ -137,12 +142,14 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
} else if (descr instanceof EnumDeclarationDescr) {
packageDescr.addEnumDeclaration((EnumDeclarationDescr) descr);
} else if (descr instanceof AttributeDescr) {
+ descr.setNamespace(packageDescr.getNamespace());
packageDescr.addAttribute((AttributeDescr) descr);
} else if (descr instanceof RuleDescr) { // QueryDescr extends
RuleDescr
RuleDescr ruleDescr = (RuleDescr) descr;
packageDescr.addRule(ruleDescr);
packageDescr.afterRuleAdded(ruleDescr);
ruleDescr.setNamespace(packageDescr.getNamespace());
+ ruleDescr.setUnit(packageDescr.getUnit());
}
});
}
@@ -579,6 +586,20 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
*/
@Override
public PatternDescr visitLhsPattern(DRLParser.LhsPatternContext ctx) {
+ if (ctx.xpathPrimary() != null) {
+ String constraint = visitConstraintChildren(ctx);
+ ExprConstraintDescr constraintDescr = BaseDescrFactory.builder(new
ExprConstraintDescr(constraint))
+ .withParserRuleContext(ctx)
+ .build();
+ constraintDescr.setType(ExprConstraintDescr.Type.NAMED);
+ constraintDescr.setPosition(0);
+ PatternDescr patternDescr = BaseDescrFactory.builder(new
PatternDescr())
+ .withParserRuleContext(ctx)
+ .build();
+ patternDescr.addConstraint(constraintDescr);
+ return patternDescr;
+ }
+
PatternDescr patternDescr = BaseDescrFactory.builder(new
PatternDescr(ctx.objectType.getText()))
.withParserRuleContext(ctx)
.build();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]