01: package org.drools.rule.builder;
02:
03: import org.drools.RuntimeDroolsException;
04: import org.drools.base.ClassObjectType;
05: import org.drools.base.DroolsQuery;
06: import org.drools.base.FieldFactory;
07: import org.drools.base.ValueType;
08: import org.drools.base.evaluators.Operator;
09: import org.drools.base.extractors.ArrayExtractor;
10: import org.drools.compiler.RuleError;
11: import org.drools.lang.descr.QueryDescr;
12: import org.drools.rule.LiteralConstraint;
13: import org.drools.rule.Pattern;
14: import org.drools.spi.Extractor;
15: import org.drools.spi.FieldExtractor;
16: import org.drools.spi.FieldValue;
17: import org.drools.spi.ObjectType;
18:
19: public class QueryBuilder {
20: public Pattern build(final RuleBuildContext context,
21: final QueryDescr queryDescr) {
22: ObjectType objectType = new ClassObjectType(DroolsQuery.class);
23: final Pattern pattern = new Pattern(context.getNextPatternId(),
24: 0, // offset is 0 by default
25: objectType, null);
26: ClassLoader classloader = context.getPkg()
27: .getPackageCompilationData().getClassLoader();
28: final FieldExtractor extractor = context.getDialect()
29: .getClassFieldExtractorCache().getExtractor(
30: DroolsQuery.class, "name", classloader);
31:
32: final FieldValue field = FieldFactory.getFieldValue(queryDescr
33: .getName(), ValueType.STRING_TYPE);
34:
35: final LiteralConstraint constraint = new LiteralConstraint(
36: extractor, ValueType.STRING_TYPE
37: .getEvaluator(Operator.EQUAL), field);
38: // adds appropriate constraint to the pattern
39: pattern.addConstraint(constraint);
40:
41: Extractor arrayExtractor = null;
42: try {
43: arrayExtractor = context.getDialect()
44: .getClassFieldExtractorCache().getExtractor(
45: ((ClassObjectType) objectType)
46: .getClassType(), "arguments",
47: classloader);
48: } catch (final RuntimeDroolsException e) {
49: context
50: .getErrors()
51: .add(
52: new RuleError(context.getRule(),
53: queryDescr, e,
54: "Unable to create Field Extractor for 'getArguments'"));
55: }
56:
57: String[] params = queryDescr.getParameters();
58: String[] types = queryDescr.getParameterTypes();
59: int i = 0;
60: try {
61: for (i = 0; i < params.length; i++) {
62: pattern.addDeclaration(params[i], new ArrayExtractor(
63: arrayExtractor, i, context.getDialect()
64: .getTypeResolver()
65: .resolveType(types[i])));
66: }
67: } catch (ClassNotFoundException e) {
68: context.getErrors().add(
69: new RuleError(context.getRule(), queryDescr, e,
70: "Unable to resolve type '" + types[i]
71: + " for parameter" + params[i]));
72: }
73: return pattern;
74: }
75: }
|