Search in sources :

Example 1 with GenListType

use of org.kie.dmn.feel.lang.types.GenListType in project drools by kiegroup.

the class ParserHelper method recoverScope.

public void recoverScope(String name) {
    LOG.trace("[{}] recoverScope( name: {}) with currentScope: {}", this.currentScope.getName(), name, currentScope);
    Scope s = this.currentScope.getChildScopes().get(name);
    if (s != null) {
        currentScope = s;
        if (currentScope.getType() != null && currentScope.getType().equals(BuiltInType.UNKNOWN)) {
            enableDynamicResolution();
        }
    } else {
        Symbol resolved = this.currentScope.resolve(name);
        Type scopeType = resolved != null ? resolved.getType() : null;
        if (scopeType instanceof GenListType) {
            scopeType = ((GenListType) scopeType).getGen();
        }
        if (resolved != null && scopeType instanceof CompositeType) {
            pushScope(scopeType);
            CompositeType type = (CompositeType) scopeType;
            for (Map.Entry<String, Type> f : type.getFields().entrySet()) {
                this.currentScope.define(new VariableSymbol(f.getKey(), f.getValue()));
            }
            LOG.trace(".. PUSHED, scope name {} with symbols {}", this.currentName.peek(), this.currentScope.getSymbols());
        } else if (resolved != null && scopeType instanceof SimpleType) {
            BuiltInType resolvedBIType = null;
            if (scopeType instanceof BuiltInType) {
                resolvedBIType = (BuiltInType) scopeType;
            } else if (scopeType instanceof AliasFEELType) {
                resolvedBIType = ((AliasFEELType) scopeType).getBuiltInType();
            } else {
                throw new UnsupportedOperationException("Unsupported BIType " + scopeType + "!");
            }
            pushScope(resolvedBIType);
            switch(resolvedBIType) {
                // FEEL spec table 53
                case DATE:
                    this.currentScope.define(new VariableSymbol("year", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("month", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("day", BuiltInType.NUMBER));
                    if (isFeatDMN12weekday()) {
                        // Table 60 spec DMN v1.2
                        this.currentScope.define(new VariableSymbol("weekday", BuiltInType.NUMBER));
                    }
                    break;
                case TIME:
                    this.currentScope.define(new VariableSymbol("hour", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("minute", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("second", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("time offset", BuiltInType.DURATION));
                    this.currentScope.define(new VariableSymbol("timezone", BuiltInType.NUMBER));
                    break;
                case DATE_TIME:
                    this.currentScope.define(new VariableSymbol("year", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("month", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("day", BuiltInType.NUMBER));
                    if (isFeatDMN12weekday()) {
                        // Table 60 spec DMN v1.2
                        this.currentScope.define(new VariableSymbol("weekday", BuiltInType.NUMBER));
                    }
                    this.currentScope.define(new VariableSymbol("hour", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("minute", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("second", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("time offset", BuiltInType.DURATION));
                    this.currentScope.define(new VariableSymbol("timezone", BuiltInType.NUMBER));
                    break;
                case DURATION:
                    // TODO might need to distinguish between `years and months duration` and `days and time duration`
                    this.currentScope.define(new VariableSymbol("years", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("months", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("days", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("hours", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("minutes", BuiltInType.NUMBER));
                    this.currentScope.define(new VariableSymbol("seconds", BuiltInType.NUMBER));
                    break;
                case RANGE:
                    this.currentScope.define(new VariableSymbol("start included", BuiltInType.BOOLEAN));
                    this.currentScope.define(new VariableSymbol("start", BuiltInType.UNKNOWN));
                    this.currentScope.define(new VariableSymbol("end", BuiltInType.UNKNOWN));
                    this.currentScope.define(new VariableSymbol("end included", BuiltInType.BOOLEAN));
                    break;
                // table 53 applies only to type(e) is a date/time/duration
                case UNKNOWN:
                    enableDynamicResolution();
                    break;
                default:
                    break;
            }
        } else {
            pushScope();
        }
    }
}
Also used : Symbol(org.kie.dmn.feel.lang.Symbol) VariableSymbol(org.kie.dmn.feel.lang.types.VariableSymbol) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) SimpleType(org.kie.dmn.feel.lang.SimpleType) SimpleType(org.kie.dmn.feel.lang.SimpleType) CompositeType(org.kie.dmn.feel.lang.CompositeType) Type(org.kie.dmn.feel.lang.Type) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) AliasFEELType(org.kie.dmn.feel.lang.types.AliasFEELType) GenListType(org.kie.dmn.feel.lang.types.GenListType) Scope(org.kie.dmn.feel.lang.Scope) GenListType(org.kie.dmn.feel.lang.types.GenListType) AliasFEELType(org.kie.dmn.feel.lang.types.AliasFEELType) Map(java.util.Map) VariableSymbol(org.kie.dmn.feel.lang.types.VariableSymbol) CompositeType(org.kie.dmn.feel.lang.CompositeType)

Example 2 with GenListType

use of org.kie.dmn.feel.lang.types.GenListType in project drools by kiegroup.

the class CompileEvaluateTest method testHyphenInPropertyOfCollectionForAccessor.

@Test
public void testHyphenInPropertyOfCollectionForAccessor() {
    MapBackedType compositeType = new MapBackedType().addField("Primary-Key", BuiltInType.STRING).addField("Value", BuiltInType.STRING);
    CompilerContext ctx = feel.newCompilerContext();
    ctx.addInputVariableType("my input", new GenListType(compositeType));
    CompiledExpression compiledExpression = feel.compile("my input[1].Primary-Key", ctx);
    assertTrue(errors.isEmpty());
    Map<String, Object> inputs = new HashMap<>();
    inputs.put("my input", Arrays.asList(prototype(entry("Primary-Key", "k987"))));
    Object result = feel.evaluate(compiledExpression, inputs);
    assertThat(result, is("k987"));
    assertTrue(errors.isEmpty());
}
Also used : HashMap(java.util.HashMap) GenListType(org.kie.dmn.feel.lang.types.GenListType) CompilerContext(org.kie.dmn.feel.lang.CompilerContext) MapBackedType(org.kie.dmn.feel.lang.impl.MapBackedType) CompiledExpression(org.kie.dmn.feel.lang.CompiledExpression) Test(org.junit.Test)

Example 3 with GenListType

use of org.kie.dmn.feel.lang.types.GenListType in project drools by kiegroup.

the class CompileEvaluateTest method testHyphenInPropertyOfCollectionForProjection.

@Test
public void testHyphenInPropertyOfCollectionForProjection() {
    MapBackedType compositeType = new MapBackedType().addField("Primary-Key", BuiltInType.STRING).addField("Value", BuiltInType.STRING);
    CompilerContext ctx = feel.newCompilerContext();
    ctx.addInputVariableType("input", new GenListType(compositeType));
    CompiledExpression compiledExpression = feel.compile("input.Primary-Key", ctx);
    assertTrue(errors.isEmpty());
    Map<String, Object> inputs = new HashMap<>();
    inputs.put("input", Arrays.asList(prototype(entry("Primary-Key", "k987"))));
    Object result = feel.evaluate(compiledExpression, inputs);
    assertThat(result, is(Arrays.asList("k987")));
    assertTrue(errors.isEmpty());
}
Also used : HashMap(java.util.HashMap) GenListType(org.kie.dmn.feel.lang.types.GenListType) CompilerContext(org.kie.dmn.feel.lang.CompilerContext) MapBackedType(org.kie.dmn.feel.lang.impl.MapBackedType) CompiledExpression(org.kie.dmn.feel.lang.CompiledExpression) Test(org.junit.Test)

Example 4 with GenListType

use of org.kie.dmn.feel.lang.types.GenListType in project drools by kiegroup.

the class CompositeTypeImpl method addField.

public void addField(String name, DMNType type) {
    this.fields.put(name, type);
    MapBackedType mbType = !isCollection() ? (MapBackedType) getFeelType() : (MapBackedType) ((GenListType) getFeelType()).getGen();
    mbType.addField(name, ((BaseDMNTypeImpl) type).getFeelType());
}
Also used : GenListType(org.kie.dmn.feel.lang.types.GenListType) MapBackedType(org.kie.dmn.feel.lang.impl.MapBackedType)

Example 5 with GenListType

use of org.kie.dmn.feel.lang.types.GenListType in project drools by kiegroup.

the class DMNCompilerImpl method buildTypeDef.

/**
 * @param topLevel null if it is a top level ItemDefinition
 */
private DMNType buildTypeDef(DMNCompilerContext ctx, DMNModelImpl dmnModel, DMNNode node, ItemDefinition itemDef, DMNType topLevel) {
    BaseDMNTypeImpl type = null;
    if (itemDef.getTypeRef() != null) {
        // this is a reference to an existing type, so resolve the reference
        type = (BaseDMNTypeImpl) resolveTypeRef(dmnModel, itemDef, itemDef, itemDef.getTypeRef());
        if (type != null) {
            UnaryTests allowedValuesStr = itemDef.getAllowedValues();
            // or if it changes the metadata for the base type
            if (topLevel == null || allowedValuesStr != null || itemDef.isIsCollection() != type.isCollection()) {
                // we have to clone this type definition into a new one
                String name = itemDef.getName();
                String namespace = dmnModel.getNamespace();
                String id = itemDef.getId();
                BaseDMNTypeImpl baseType = type;
                Type baseFEELType = type.getFeelType();
                if (baseFEELType instanceof BuiltInType) {
                    // Then it is an ItemDefinition in place for "aliasing" a base FEEL type, for having type(itemDefname) I need to define its SimpleType.
                    baseFEELType = new AliasFEELType(itemDef.getName(), (BuiltInType) baseFEELType);
                }
                List<UnaryTest> av = null;
                if (allowedValuesStr != null) {
                    av = ctx.getFeelHelper().evaluateUnaryTests(ctx, allowedValuesStr.getText(), dmnModel, itemDef, Msg.ERR_COMPILING_ALLOWED_VALUES_LIST_ON_ITEM_DEF, allowedValuesStr.getText(), node.getName());
                }
                boolean isCollection = itemDef.isIsCollection();
                if (isCollection) {
                    baseFEELType = new GenListType(baseFEELType);
                }
                if (type instanceof CompositeTypeImpl) {
                    CompositeTypeImpl compositeTypeImpl = (CompositeTypeImpl) type;
                    type = new CompositeTypeImpl(namespace, name, id, isCollection, compositeTypeImpl.getFields(), baseType, baseFEELType);
                } else if (type instanceof SimpleTypeImpl) {
                    type = new SimpleTypeImpl(namespace, name, id, isCollection, av, baseType, baseFEELType);
                }
                if (topLevel != null) {
                    ((BaseDMNTypeImpl) type).setBelongingType(topLevel);
                }
            }
            if (topLevel == null) {
                DMNType registered = dmnModel.getTypeRegistry().registerType(type);
                if (registered != type) {
                    MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, itemDef, dmnModel, null, null, Msg.DUPLICATED_ITEM_DEFINITION, itemDef.getName());
                }
            }
        }
    } else if (itemDef.getItemComponent() != null && itemDef.getItemComponent().size() > 0) {
        // first, locate preregistered or create anonymous inner composite
        if (topLevel == null) {
            type = (CompositeTypeImpl) dmnModel.getTypeRegistry().resolveType(dmnModel.getNamespace(), itemDef.getName());
        } else {
            DMNCompilerHelper.checkVariableName(dmnModel, itemDef, itemDef.getName());
            type = new CompositeTypeImpl(dmnModel.getNamespace(), itemDef.getName(), itemDef.getId(), itemDef.isIsCollection());
            ((BaseDMNTypeImpl) type).setBelongingType(topLevel);
        }
        // second, add fields to located composite
        for (ItemDefinition fieldDef : itemDef.getItemComponent()) {
            DMNCompilerHelper.checkVariableName(dmnModel, fieldDef, fieldDef.getName());
            DMNType fieldType = buildTypeDef(ctx, dmnModel, node, fieldDef, type);
            fieldType = fieldType != null ? fieldType : dmnModel.getTypeRegistry().unknown();
            ((CompositeTypeImpl) type).addField(fieldDef.getName(), fieldType);
        }
    } else if (isFunctionItem(itemDef)) {
        FunctionItem fi = itemDef.getFunctionItem();
        String name = itemDef.getName();
        String namespace = dmnModel.getNamespace();
        String id = itemDef.getId();
        Map<String, DMNType> params = new HashMap<>();
        for (InformationItem p : fi.getParameters()) {
            DMNType resolveTypeRef = resolveTypeRef(dmnModel, itemDef, itemDef, p.getTypeRef());
            params.put(p.getName(), resolveTypeRef);
        }
        DMNType returnType = resolveTypeRef(dmnModel, itemDef, itemDef, fi.getOutputTypeRef());
        List<Type> feelPs = fi.getParameters().stream().map(InformationItem::getName).map(n -> ((BaseDMNTypeImpl) params.get(n)).getFeelType()).collect(Collectors.toList());
        GenFnType feeltype = new GenFnType(feelPs, ((BaseDMNTypeImpl) returnType).getFeelType());
        type = new SimpleFnTypeImpl(namespace, name, id, feeltype, params, returnType, fi);
        DMNType registered = dmnModel.getTypeRegistry().registerType(type);
        if (registered != type) {
            MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, itemDef, dmnModel, null, null, Msg.DUPLICATED_ITEM_DEFINITION, itemDef.getName());
        }
    } else {
        DMNType unknown = (BaseDMNTypeImpl) resolveTypeRef(dmnModel, itemDef, itemDef, null);
        type = new SimpleTypeImpl(dmnModel.getNamespace(), itemDef.getName(), itemDef.getId(), itemDef.isIsCollection(), null, unknown, ((BaseDMNTypeImpl) unknown).getFeelType());
        if (topLevel == null) {
            DMNType registered = dmnModel.getTypeRegistry().registerType(type);
            if (registered != type) {
                MsgUtil.reportMessage(logger, DMNMessage.Severity.ERROR, itemDef, dmnModel, null, null, Msg.DUPLICATED_ITEM_DEFINITION, itemDef.getName());
            }
        } else {
            ((BaseDMNTypeImpl) type).setBelongingType(topLevel);
        }
    }
    return type;
}
Also used : DMNModelInstrumentedBase(org.kie.dmn.model.api.DMNModelInstrumentedBase) DecisionTable(org.kie.dmn.model.api.DecisionTable) DMNElementReference(org.kie.dmn.model.api.DMNElementReference) DMNMessage(org.kie.dmn.api.core.DMNMessage) ListIterator(java.util.ListIterator) URL(java.net.URL) SimpleFnTypeImpl(org.kie.dmn.core.impl.SimpleFnTypeImpl) FEELProfile(org.kie.dmn.feel.lang.FEELProfile) URISyntaxException(java.net.URISyntaxException) ResourceFactory(org.kie.internal.io.ResourceFactory) LoggerFactory(org.slf4j.LoggerFactory) ItemDefNodeImpl(org.kie.dmn.core.ast.ItemDefNodeImpl) Either(org.kie.dmn.feel.util.Either) FileSystemResource(org.drools.core.io.impl.FileSystemResource) SimpleTypeImpl(org.kie.dmn.core.impl.SimpleTypeImpl) DMNCompiler(org.kie.dmn.api.core.DMNCompiler) TInformationItem(org.kie.dmn.model.v1_1.TInformationItem) Matcher(java.util.regex.Matcher) DMNModel(org.kie.dmn.api.core.DMNModel) Map(java.util.Map) URI(java.net.URI) DMNCompilerConfiguration(org.kie.dmn.api.core.DMNCompilerConfiguration) DMNFactory(org.kie.dmn.core.api.DMNFactory) UnaryTest(org.kie.dmn.feel.runtime.UnaryTest) ImportType(org.kie.dmn.core.compiler.ImportDMNResolverUtil.ImportType) DecisionServices(org.kie.dmn.model.v1_1.extensions.DecisionServices) DMNNode(org.kie.dmn.api.core.ast.DMNNode) BusinessKnowledgeModelNodeImpl(org.kie.dmn.core.ast.BusinessKnowledgeModelNodeImpl) Collection(java.util.Collection) BaseDMNTypeImpl(org.kie.dmn.core.impl.BaseDMNTypeImpl) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) OutputClause(org.kie.dmn.model.api.OutputClause) Set(java.util.Set) DMNModelImpl(org.kie.dmn.core.impl.DMNModelImpl) Import(org.kie.dmn.model.api.Import) ItemDefNode(org.kie.dmn.api.core.ast.ItemDefNode) Reader(java.io.Reader) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) BusinessKnowledgeModelNode(org.kie.dmn.api.core.ast.BusinessKnowledgeModelNode) FunctionItem(org.kie.dmn.model.api.FunctionItem) Resource(org.kie.api.io.Resource) List(java.util.List) NamedElement(org.kie.dmn.model.api.NamedElement) Entry(java.util.Map.Entry) ItemDefinition(org.kie.dmn.model.api.ItemDefinition) Optional(java.util.Optional) InputDataNode(org.kie.dmn.api.core.ast.InputDataNode) Pattern(java.util.regex.Pattern) QName(javax.xml.namespace.QName) InformationItem(org.kie.dmn.model.api.InformationItem) DMNMarshaller(org.kie.dmn.api.marshalling.DMNMarshaller) AliasFEELType(org.kie.dmn.feel.lang.types.AliasFEELType) GenListType(org.kie.dmn.feel.lang.types.GenListType) MsgUtil(org.kie.dmn.core.util.MsgUtil) DMNType(org.kie.dmn.api.core.DMNType) GenFnType(org.kie.dmn.feel.lang.types.GenFnType) HashMap(java.util.HashMap) Deque(java.util.Deque) Function(java.util.function.Function) Definitions(org.kie.dmn.model.api.Definitions) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) DecisionServiceNodeImpl(org.kie.dmn.core.ast.DecisionServiceNodeImpl) DecisionNode(org.kie.dmn.api.core.ast.DecisionNode) DMNMarshallerFactory(org.kie.dmn.backend.marshalling.v1x.DMNMarshallerFactory) DMNBaseNode(org.kie.dmn.core.ast.DMNBaseNode) Decision(org.kie.dmn.model.api.Decision) LinkedList(java.util.LinkedList) XMLConstants(javax.xml.XMLConstants) Type(org.kie.dmn.feel.lang.Type) Logger(org.slf4j.Logger) InformationRequirement(org.kie.dmn.model.api.InformationRequirement) KnowledgeRequirement(org.kie.dmn.model.api.KnowledgeRequirement) IOException(java.io.IOException) DMNExtensionRegister(org.kie.dmn.api.marshalling.DMNExtensionRegister) Consumer(java.util.function.Consumer) DMNImportPMMLInfo(org.kie.dmn.core.pmml.DMNImportPMMLInfo) UnaryTests(org.kie.dmn.model.api.UnaryTests) DecisionServiceNode(org.kie.dmn.api.core.ast.DecisionServiceNode) CompositeTypeImpl(org.kie.dmn.core.impl.CompositeTypeImpl) DRGElement(org.kie.dmn.model.api.DRGElement) Msg(org.kie.dmn.core.util.Msg) Collections(java.util.Collections) DecisionService(org.kie.dmn.model.api.DecisionService) InputStream(java.io.InputStream) DecisionNodeImpl(org.kie.dmn.core.ast.DecisionNodeImpl) HashMap(java.util.HashMap) ItemDefinition(org.kie.dmn.model.api.ItemDefinition) TInformationItem(org.kie.dmn.model.v1_1.TInformationItem) InformationItem(org.kie.dmn.model.api.InformationItem) BaseDMNTypeImpl(org.kie.dmn.core.impl.BaseDMNTypeImpl) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) SimpleFnTypeImpl(org.kie.dmn.core.impl.SimpleFnTypeImpl) UnaryTest(org.kie.dmn.feel.runtime.UnaryTest) ImportType(org.kie.dmn.core.compiler.ImportDMNResolverUtil.ImportType) BuiltInType(org.kie.dmn.feel.lang.types.BuiltInType) AliasFEELType(org.kie.dmn.feel.lang.types.AliasFEELType) GenListType(org.kie.dmn.feel.lang.types.GenListType) DMNType(org.kie.dmn.api.core.DMNType) GenFnType(org.kie.dmn.feel.lang.types.GenFnType) Type(org.kie.dmn.feel.lang.Type) SimpleTypeImpl(org.kie.dmn.core.impl.SimpleTypeImpl) GenListType(org.kie.dmn.feel.lang.types.GenListType) GenFnType(org.kie.dmn.feel.lang.types.GenFnType) AliasFEELType(org.kie.dmn.feel.lang.types.AliasFEELType) FunctionItem(org.kie.dmn.model.api.FunctionItem) UnaryTests(org.kie.dmn.model.api.UnaryTests) CompositeTypeImpl(org.kie.dmn.core.impl.CompositeTypeImpl) DMNType(org.kie.dmn.api.core.DMNType)

Aggregations

GenListType (org.kie.dmn.feel.lang.types.GenListType)5 HashMap (java.util.HashMap)3 Map (java.util.Map)2 Test (org.junit.Test)2 CompiledExpression (org.kie.dmn.feel.lang.CompiledExpression)2 CompilerContext (org.kie.dmn.feel.lang.CompilerContext)2 MapBackedType (org.kie.dmn.feel.lang.impl.MapBackedType)2 IOException (java.io.IOException)1 InputStream (java.io.InputStream)1 Reader (java.io.Reader)1 URI (java.net.URI)1 URISyntaxException (java.net.URISyntaxException)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 Deque (java.util.Deque)1 HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1