use of org.drools.drl.ast.descr.MVELExprDescr in project drools by kiegroup.
the class PatternBuilder method lookupObjectType.
private Declaration lookupObjectType(RuleBuildContext context, PatternDescr patternDescr) {
List<? extends BaseDescr> descrs = patternDescr.getConstraint().getDescrs();
if (descrs.size() != 1 || !(descrs.get(0) instanceof ExprConstraintDescr)) {
return null;
}
ExprConstraintDescr descr = (ExprConstraintDescr) descrs.get(0);
String expr = descr.getExpression();
if (expr.charAt(0) != '/') {
return null;
}
XpathAnalysis xpathAnalysis = XpathAnalysis.analyze(expr);
if (xpathAnalysis.hasError()) {
registerDescrBuildError(context, patternDescr, "Invalid xpath expression '" + expr + "': " + xpathAnalysis.getError());
return null;
}
XpathPart firstXpathChunk = xpathAnalysis.getPart(0);
String identifier = firstXpathChunk.getField();
DeclarationScopeResolver resolver = context.getDeclarationResolver();
if (resolver.hasDataSource(identifier)) {
patternDescr.setObjectType(findObjectType(context, firstXpathChunk, identifier));
FromDescr fromDescr = new FromDescr();
fromDescr.setDataSource(new MVELExprDescr(identifier));
patternDescr.setSource(fromDescr);
patternDescr.removeAllConstraint();
firstXpathChunk.getConstraints().forEach(s -> patternDescr.addConstraint(new ExprConstraintDescr(s)));
if (!xpathAnalysis.isSinglePart()) {
String xpathExpr = (patternDescr.getIdentifier() == null ? "" : patternDescr.getIdentifier() + " : ") + expr.substring(xpathAnalysis.getPart(1).getStart());
patternDescr.addConstraint(new ExprConstraintDescr(xpathExpr));
patternDescr.setIdentifier("$void$");
}
} else {
Declaration declr = resolver.getDeclaration(identifier);
if (declr == null) {
registerDescrBuildError(context, patternDescr, "The identifier '" + identifier + "' is not in scope");
return null;
}
patternDescr.setObjectType(declr.getExtractor().getExtractToClassName());
expr = (patternDescr.getIdentifier() != null ? patternDescr.getIdentifier() + (patternDescr.isUnification() ? " := " : " : ") : "") + expr.substring(identifier.length() + 1);
descr.setExpression(expr);
return declr;
}
return null;
}
use of org.drools.drl.ast.descr.MVELExprDescr in project drools by kiegroup.
the class PatternUtil method normalizeOOPathPattern.
public static PatternDescr normalizeOOPathPattern(PatternDescr pattern, RuleContext context) {
String oopathExpr = pattern.getDescrs().get(0).getText();
XpathAnalysis xpathAnalysis = XpathAnalysis.analyze(oopathExpr);
XpathAnalysis.XpathPart firstPart = xpathAnalysis.getPart(0);
PatternDescr normalizedPattern = new PatternDescr();
normalizedPattern.setObjectType(findPatternType(firstPart, context));
firstPart.getConstraints().stream().map(ExprConstraintDescr::new).forEach(normalizedPattern::addConstraint);
if (xpathAnalysis.getParts().size() == 1) {
normalizedPattern.setIdentifier(pattern.getIdentifier());
} else {
StringBuilder sb = new StringBuilder();
if (pattern.getIdentifier() != null) {
sb.append(pattern.getIdentifier()).append(": ");
}
for (int i = 1; i < xpathAnalysis.getParts().size(); i++) {
sb.append("/").append(xpathAnalysis.getPart(i));
}
normalizedPattern.addConstraint(new ExprConstraintDescr(sb.toString()));
}
FromDescr source = new FromDescr();
source.setDataSource(new MVELExprDescr(firstPart.getField()));
normalizedPattern.setSource(source);
return normalizedPattern;
}
use of org.drools.drl.ast.descr.MVELExprDescr in project drools by kiegroup.
the class SourceDescrBuilderImpl method expression.
public P expression(String expression) {
FromDescr from = new FromDescr();
from.setDataSource(new MVELExprDescr(expression));
from.setResource(descr.getResource());
descr.setSource(from);
return parent;
}
use of org.drools.drl.ast.descr.MVELExprDescr in project drools by kiegroup.
the class RuleParserTest method testSimpleAccessorWithFrom.
@Test
public void testSimpleAccessorWithFrom() throws Exception {
final RuleDescr rule = (RuleDescr) parseResource("rule", "test_SimpleAccessorWithFrom.drl");
assertFalse(parser.getErrors().toString(), parser.hasErrors());
final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get(0);
final FromDescr from = (FromDescr) pattern.getSource();
final MVELExprDescr accessor = (MVELExprDescr) from.getDataSource();
assertEquals("something.doIt", accessor.getExpression());
}
use of org.drools.drl.ast.descr.MVELExprDescr in project drools by kiegroup.
the class RuleParserTest method testComplexChainedAcessor.
@Test
public void testComplexChainedAcessor() throws Exception {
final RuleDescr rule = (RuleDescr) parseResource("rule", "test_ComplexChainedCallWithFrom.drl");
assertFalse(parser.getErrors().toString(), parser.hasErrors());
final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get(0);
final FromDescr from = (FromDescr) pattern.getSource();
final MVELExprDescr accessor = (MVELExprDescr) from.getDataSource();
assertEquals("doIt1( foo,bar,42,\"hello\",[ a : \"b\"], [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]", accessor.getExpression());
}
Aggregations