use of org.drools.drl.ast.descr.PatternDescr in project drools by kiegroup.
the class FromCollectVisitor method trasformFromCollectToCollectList.
public void trasformFromCollectToCollectList(PatternDescr pattern, CollectDescr collectDescr) {
// The inner pattern of the "from collect" needs to be processed to have the binding
final PatternDescr collectDescrInputPattern = collectDescr.getInputPattern();
if (!parentVisitor.initPattern(collectDescrInputPattern)) {
return;
}
final AccumulateDescr accumulateDescr = new AccumulateDescr();
accumulateDescr.setInputPattern(collectDescrInputPattern);
accumulateDescr.addFunction("collectList", null, false, new String[] { collectDescrInputPattern.getIdentifier() });
final PatternDescr transformedPatternDescr = new PatternDescr(pattern.getObjectType(), pattern.getIdentifier());
for (BaseDescr o : pattern.getConstraint().getDescrs()) {
transformedPatternDescr.addConstraint(o);
}
transformedPatternDescr.setSource(accumulateDescr);
transformedPatternDescr.accept(parentVisitor);
}
use of org.drools.drl.ast.descr.PatternDescr in project drools by kiegroup.
the class PatternHandler method start.
public Object start(final String uri, final String localName, final Attributes attrs, final ExtensibleXmlParser parser) throws SAXException {
parser.startElementBuilder(localName, attrs);
final String objectType = attrs.getValue("object-type");
if (objectType == null || objectType.trim().equals("")) {
throw new SAXParseException("<pattern> requires an 'object-type' attribute", parser.getLocator());
}
PatternDescr patternDescr = null;
final String identifier = attrs.getValue("identifier");
if (identifier == null || identifier.trim().equals("")) {
patternDescr = new PatternDescr(objectType);
} else {
patternDescr = new PatternDescr(objectType, identifier);
}
return patternDescr;
}
use of org.drools.drl.ast.descr.PatternDescr in project drools by kiegroup.
the class PatternHandler method end.
public Object end(final String uri, final String localName, final ExtensibleXmlParser parser) throws SAXException {
final Element element = parser.endElementBuilder();
final PatternDescr patternDescr = (PatternDescr) parser.getCurrent();
final Object parent = parser.getParent();
if (parent instanceof PatternDestinationDescr) {
final PatternDestinationDescr parentDescr = (PatternDestinationDescr) parent;
parentDescr.setInputPattern(patternDescr);
} else {
final ConditionalElementDescr parentDescr = (ConditionalElementDescr) parent;
parentDescr.addDescr(patternDescr);
}
return patternDescr;
}
use of org.drools.drl.ast.descr.PatternDescr 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.PatternDescr in project drools by kiegroup.
the class MVELAccumulateBuilderTest method testSimpleExpression.
@Test
public void testSimpleExpression() {
KnowledgeBuilderImpl pkgBuilder = new KnowledgeBuilderImpl();
pkgBuilder.addPackage(new PackageDescr("pkg1"));
InternalKnowledgePackage pkg = pkgBuilder.getPackage("pkg1");
final RuleDescr ruleDescr = new RuleDescr("rule 1");
final KnowledgeBuilderConfigurationImpl conf = pkgBuilder.getBuilderConfiguration();
DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry(pkg.getName()).getDialectCompiletimeRegistry();
MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect("mvel");
final RuleBuildContext context = new RuleBuildContext(pkgBuilder, ruleDescr, dialectRegistry, pkg, mvelDialect);
final AccumulateDescr accDescr = new AccumulateDescr();
final PatternDescr inputPattern = new PatternDescr("org.drools.mvel.compiler.Cheese", "$cheese");
accDescr.setInputPattern(inputPattern);
accDescr.setInitCode("total = 0;");
accDescr.setActionCode("total += $cheese.price;");
accDescr.setReverseCode("total -= $cheese.price;");
accDescr.setResultCode("new Integer(total)");
final MVELAccumulateBuilder builder = new MVELAccumulateBuilder();
final Accumulate acc = (Accumulate) builder.build(context, accDescr);
((MVELCompileable) acc.getAccumulators()[0]).compile((MVELDialectRuntimeData) pkgBuilder.getPackageRegistry(pkg.getName()).getDialectRuntimeRegistry().getDialectData("mvel"));
InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
StatefulKnowledgeSessionImpl ksession = (StatefulKnowledgeSessionImpl) kBase.newKieSession();
BuildContext buildContext = new BuildContext(kBase, Collections.emptyList());
MockLeftTupleSink sink = new MockLeftTupleSink(buildContext);
MockTupleSource source = new MockTupleSource(1, buildContext);
source.setObjectCount(1);
sink.setLeftTupleSource(source);
final Cheese cheddar1 = new Cheese("cheddar", 10);
final Cheese cheddar2 = new Cheese("cheddar", 8);
final InternalFactHandle f0 = (InternalFactHandle) ksession.insert(new InitialFactImpl());
final InternalFactHandle f1 = (InternalFactHandle) ksession.insert(cheddar1);
final InternalFactHandle f2 = (InternalFactHandle) ksession.insert(cheddar2);
final LeftTupleImpl tuple = new LeftTupleImpl(f0, sink, true);
Object wmContext = acc.createWorkingMemoryContext();
AccumulateNode.AccumulateContext accContext = new AccumulateNode.AccumulateContext();
Object funcContext = acc.createFunctionContext();
funcContext = acc.init(wmContext, accContext, funcContext, tuple, ksession);
accContext.setFunctionContext(funcContext);
Object value1 = acc.accumulate(wmContext, accContext, tuple, f1, ksession);
acc.accumulate(wmContext, accContext, tuple, f2, ksession);
assertEquals(new Integer(18), acc.getResult(wmContext, accContext, tuple, ksession));
LeftTuple match = new FromNodeLeftTuple();
match.setContextObject(value1);
acc.tryReverse(wmContext, accContext, tuple, f1, null, match, ksession);
assertEquals(new Integer(8), acc.getResult(wmContext, accContext, tuple, ksession));
}
Aggregations