use of org.drools.core.rule.Pattern in project drools by kiegroup.
the class KnowledgeBuilderTest method testAnd.
@Test
public void testAnd() throws Exception {
final KnowledgeBuilderImpl builder = new KnowledgeBuilderImpl();
final RuleImpl rule = createRule(new AndDescr(), builder, "update(stilton);");
assertLength(0, builder.getErrors().getErrors());
final GroupElement lhs = rule.getLhs();
assertLength(1, lhs.getChildren());
final GroupElement and = (GroupElement) lhs.getChildren().get(0);
assertLength(1, and.getChildren());
final Pattern pattern = (Pattern) and.getChildren().get(0);
}
use of org.drools.core.rule.Pattern in project drools by kiegroup.
the class KnowledgeBuilderTest method testNot.
@Test
public void testNot() throws Exception {
KnowledgeBuilderImpl builder = new KnowledgeBuilderImpl();
// Make sure we can't accessa variable bound inside the not node
RuleImpl rule = createRule(new NotDescr(), builder, "update(stilton);");
assertTrue(builder.hasErrors());
builder = new KnowledgeBuilderImpl();
rule = createRule(new NotDescr(), builder, "");
assertEquals(0, builder.getErrors().getErrors().length);
final GroupElement lhs = rule.getLhs();
assertLength(1, lhs.getChildren());
final GroupElement not = (GroupElement) lhs.getChildren().get(0);
assertLength(1, not.getChildren());
final Pattern pattern = (Pattern) not.getChildren().get(0);
}
use of org.drools.core.rule.Pattern in project drools by kiegroup.
the class QueryBuilder method build.
public Pattern build(final RuleBuildContext context, final QueryDescr queryDescr) {
ObjectType queryObjectType = ClassObjectType.DroolsQuery_ObjectType;
final Pattern pattern = new Pattern(context.getNextPatternId(), // offset is 0 by default
0, queryObjectType, null);
final InternalReadAccessor extractor = PatternBuilder.getFieldReadAccessor(context, queryDescr, pattern, "name", null, true);
final QueryNameConstraint constraint = new QueryNameConstraint(extractor, queryDescr.getName());
PatternBuilder.registerReadAccessor(context, queryObjectType, "name", constraint);
// adds appropriate constraint to the pattern
pattern.addConstraint(constraint);
ObjectType argsObjectType = ClassObjectType.DroolsQuery_ObjectType;
InternalReadAccessor arrayExtractor = PatternBuilder.getFieldReadAccessor(context, queryDescr, null, argsObjectType, "elements", null, true);
QueryImpl query = ((QueryImpl) context.getRule());
String[] params;
String[] types;
int numParams = queryDescr.getParameters().length;
if (query.isAbductive()) {
params = Arrays.copyOf(queryDescr.getParameters(), queryDescr.getParameters().length + 1);
types = Arrays.copyOf(queryDescr.getParameterTypes(), queryDescr.getParameterTypes().length + 1);
} else {
params = queryDescr.getParameters();
types = queryDescr.getParameterTypes();
}
Declaration[] declarations = new Declaration[params.length];
Class<?> abductionReturnKlass = null;
if (query.isAbductive()) {
Abductive abductive = queryDescr.getTypedAnnotation(Abductive.class);
abductionReturnKlass = abductive.target();
params[numParams] = "";
types[numParams] = abductionReturnKlass.getName();
}
int i = 0;
try {
for (i = 0; i < params.length; i++) {
Declaration declr = pattern.addDeclaration(params[i]);
// this bit is different, notice its the ArrayElementReader that we wire up to, not the declaration.
ArrayElementReader reader = new ArrayElementReader(arrayExtractor, i, context.getDialect().getTypeResolver().resolveType(types[i]));
PatternBuilder.registerReadAccessor(context, argsObjectType, "elements", reader);
declr.setReadAccessor(reader);
declarations[i] = declr;
}
query.setParameters(declarations);
} catch (ClassNotFoundException e) {
context.addError(new DescrBuildError(context.getParentDescr(), queryDescr, e, "Unable to resolve type '" + types[i] + " for parameter" + params[i]));
}
context.setPrefixPattern(pattern);
if (query.isAbductive()) {
String returnName = "";
try {
AnnotationDescr ann = queryDescr.getAnnotation(Abductive.class);
Object[] argsVal = ((Object[]) ann.getValue("args"));
String[] args = argsVal != null ? Arrays.copyOf(argsVal, argsVal.length, String[].class) : null;
returnName = types[numParams];
ObjectType objectType = new ClassObjectType(abductionReturnKlass, false);
objectType = context.getPkg().getClassFieldAccessorStore().wireObjectType(objectType, (AbductiveQuery) query);
((AbductiveQuery) query).setReturnType(objectType, params, args, declarations);
} catch (NoSuchMethodException e) {
context.addError(new DescrBuildError(context.getParentDescr(), queryDescr, e, "Unable to resolve abducible constructor for type : " + returnName + " with types " + Arrays.toString(types)));
} catch (IllegalArgumentException e) {
context.addError(new DescrBuildError(context.getParentDescr(), queryDescr, e, e.getMessage()));
}
}
return pattern;
}
use of org.drools.core.rule.Pattern in project drools by kiegroup.
the class AnnotationsTest method testCollectAnnotationsParsingAndBuilding.
@Test
public void testCollectAnnotationsParsingAndBuilding() throws Exception {
final DrlParser parser = new DrlParser(LanguageLevelOption.DRL6);
final KnowledgeBuilderImpl kBuilder = new KnowledgeBuilderImpl();
kBuilder.addPackage(new PackageDescr("org.drools"));
String ruleDrl = "package org.drools.compiler; " + " " + "dialect 'mvel' " + " " + "import java.util.Collection; " + "import " + Annot.class.getCanonicalName() + "; " + " " + "rule \"test collect with annotation\" " + " when " + " Collection() from collect ( " + " String() @Annot " + " ) " + " then " + "end " + "";
final PackageDescr pkgDescr = parser.parse(new StringReader(ruleDrl));
// just checking there is no parsing errors
assertFalse(parser.getErrors().toString(), parser.hasErrors());
kBuilder.addPackage(pkgDescr);
assertTrue(kBuilder.getErrors().toString(), kBuilder.getErrors().isEmpty());
final RuleImpl rule = kBuilder.getPackage(pkgDescr.getName()).getRule("test collect with annotation");
List<? extends RuleConditionElement> nested = ((Pattern) rule.getLhs().getChildren().get(0)).getSource().getNestedElements();
assertEquals(1, nested.size());
Map<String, AnnotationDefinition> annotations = ((Pattern) nested.get(0)).getAnnotations();
assertEquals(1, annotations.size());
assertNotNull(annotations.keySet().iterator().next());
}
use of org.drools.core.rule.Pattern in project drools by kiegroup.
the class AnnotationsTest method testTypedSimpleArrays.
@Test
public void testTypedSimpleArrays() {
String drl = "package org.drools.test; " + "import " + Simple.class.getName().replace("$", ".") + "; " + "rule Foo " + "when " + " String() @Simple( numbers = { 1, 2, 3 } ) " + "then " + "end ";
KieHelper helper = new KieHelper();
helper.addContent(drl, ResourceType.DRL);
Pattern p = ((Pattern) ((RuleImpl) helper.build().getRule("org.drools.test", "Foo")).getLhs().getChildren().get(0));
Map<String, AnnotationDefinition> defs = p.getAnnotations();
assertEquals(1, defs.size());
AnnotationDefinition simple = defs.get(Simple.class.getName().replace("$", "."));
assertNotNull(simple);
Object val = simple.getPropertyValue("numbers");
assertTrue(val instanceof int[]);
}
Aggregations