use of org.drools.drl.ast.descr.FromDescr 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.FromDescr in project drools by kiegroup.
the class PatternBuilder method isPassThroughPattern.
private static boolean isPassThroughPattern(PatternDescr pattern, String identifier) {
// We should add properties in the 2nd pattern to create a correct property reactivity mask.
if (pattern.getSource() instanceof FromDescr) {
FromDescr from = (FromDescr) pattern.getSource();
String expr = from.getExpression().trim();
if (identifier.equals(expr)) {
return true;
}
}
return false;
}
use of org.drools.drl.ast.descr.FromDescr 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.FromDescr 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.FromDescr in project drools by kiegroup.
the class AccumulateInline method parseAccumulatePattern.
void parseAccumulatePattern() {
PatternDescr pattern = accumulateDescr.getInputPattern();
if (pattern == null || pattern.getSource() == null) {
return;
}
PatternSourceDescr sourceDescr = pattern.getSource();
if (sourceDescr instanceof FromDescr) {
DeclarativeInvokerDescr invokerDescr = ((FromDescr) sourceDescr).getDataSource();
String mvelBlock = addCurlyBracesToBlock(addSemicolon(invokerDescr.getText()));
CompiledBlockResult fromCodeCompilationResult = mvelCompiler.compileStatement(mvelBlock);
BlockStmt fromBlock = fromCodeCompilationResult.statementResults();
for (Statement stmt : fromBlock.getStatements()) {
stmt.findAll(NameExpr.class).stream().map(Node::toString).filter(context::hasDeclaration).forEach(usedExternalDeclarations::add);
}
}
}
Aggregations