Package org.drools.rule.builder

Source Code of org.drools.rule.builder.QueryBuilder

package org.drools.rule.builder;

import org.drools.RuntimeDroolsException;
import org.drools.base.ClassObjectType;
import org.drools.base.DroolsQuery;
import org.drools.base.FieldFactory;
import org.drools.base.ValueType;
import org.drools.base.evaluators.Operator;
import org.drools.base.extractors.ArrayExtractor;
import org.drools.compiler.RuleError;
import org.drools.lang.descr.QueryDescr;
import org.drools.rule.LiteralConstraint;
import org.drools.rule.Pattern;
import org.drools.spi.Extractor;
import org.drools.spi.FieldExtractor;
import org.drools.spi.FieldValue;
import org.drools.spi.ObjectType;

public class QueryBuilder {
    public Pattern build(final RuleBuildContext context,
                         final QueryDescr queryDescr) {
        ObjectType objectType = new ClassObjectType( DroolsQuery.class );
        final Pattern pattern = new Pattern( context.getNextPatternId(),
                                             0, // offset is 0 by default
                                             objectType,
                                             null );
        ClassLoader classloader = context.getPkg().getPackageCompilationData().getClassLoader();
        final FieldExtractor extractor = context.getDialect().getClassFieldExtractorCache().getExtractorDroolsQuery.class, "name",  classloader );       

        final FieldValue field = FieldFactory.getFieldValue( queryDescr.getName(),
                                                             ValueType.STRING_TYPE );

        final LiteralConstraint constraint = new LiteralConstraint( extractor,
                                                                    ValueType.STRING_TYPE.getEvaluator( Operator.EQUAL ),
                                                                    field );
        // adds appropriate constraint to the pattern
        pattern.addConstraint( constraint );

        Extractor arrayExtractor = null;
        try {
            arrayExtractor = context.getDialect().getClassFieldExtractorCache().getExtractor( ((ClassObjectType) objectType).getClassType(),
                                                                                              "arguments",
                                                                                              classloader );
        } catch ( final RuntimeDroolsException e ) {
            context.getErrors().add( new RuleError( context.getRule(),
                                                    queryDescr,
                                                    e,
                                                    "Unable to create Field Extractor for 'getArguments'" ) );
        }

        String[] params = queryDescr.getParameters();
        String[] types = queryDescr.getParameterTypes();
        int i = 0;
        try {
        for ( i = 0; i < params.length; i++ ) {
            pattern.addDeclaration( params[i],
                                    new ArrayExtractor( arrayExtractor,
                                                        i,
                                                        context.getDialect().getTypeResolver().resolveType( types[i] ) ) );
        }
        } catch ( ClassNotFoundException e ) {
            context.getErrors().add( new RuleError( context.getRule(),
                                                    queryDescr,
                                                    e,
                                                    "Unable to resolve type '" + types[i] + " for parameter" + params[i] ) );           
        }
        return pattern;
    }
}
TOP

Related Classes of org.drools.rule.builder.QueryBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.