Beispiel #1
0
        public override FactValue SelfEvaluate(Dictionary <string, FactValue> workingMemory, Jint.Engine nashorn)
        {
            int numberOfTrueChildren = NumberOfTrueChildren(workingMemory);
            int sizeOfGivenList      = this.givenListSize;
            FactBooleanValue fbv     = null;

            switch (this.numberOfTarget)
            {
            case "ALL":
                if (numberOfTrueChildren == sizeOfGivenList)
                {
                    fbv = FactValue.Parse(true);
                }
                else
                {
                    fbv = FactValue.Parse(false);
                }
                break;

            case "NONE":
                if (numberOfTrueChildren == 0)
                {
                    fbv = FactValue.Parse(true);
                }
                else
                {
                    fbv = FactValue.Parse(false);
                }
                break;

            case "SOME":
                if (numberOfTrueChildren > 0)
                {
                    fbv = FactValue.Parse(true);
                }
                else
                {
                    fbv = FactValue.Parse(false);
                }
                break;

            default:
                if (numberOfTrueChildren == Int32.Parse(this.numberOfTarget))
                {
                    fbv = FactValue.Parse(true);
                }
                else
                {
                    fbv = FactValue.Parse(false);
                }
                break;
            }
            return(fbv);
        }
Beispiel #2
0
        public void HandleListItem(string parentText, string itemText, MetaType?metaType)
        {
            Tokens    tokens = Tokenizer.GetTokens(itemText);
            FactValue fv;

            if (tokens.tokensString.Equals("Da"))
            {
                DateTime factValueInDate;
                DateTime.TryParseExact(itemText, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out factValueInDate);
                fv = FactValue.Parse(factValueInDate);
            }
            else if (tokens.tokensString.Equals("De"))
            {
                fv = FactValue.Parse(Double.Parse(itemText));
            }
            else if (tokens.tokensString.Equals("No"))
            {
                fv = FactValue.Parse(Int32.Parse(itemText));
            }
            else if (tokens.tokensString.Equals("Ha"))
            {
                fv = FactValue.ParseHash(itemText);
            }
            else if (tokens.tokensString.Equals("Url"))
            {
                fv = FactValue.ParseURL(itemText);
            }
            else if (tokens.tokensString.Equals("Id"))
            {
                fv = FactValue.ParseUUID(itemText);
            }
            else if (Regex.Match(itemText, "FfAaLlSsEe").Success || Regex.Match(itemText, "TtRrUuEe").Success)
            {
                fv = FactValue.Parse(Boolean.Parse(itemText));
            }
            else
            {
                fv = FactValue.Parse(itemText);
            }
            string stringToGetFactValue = (parentText.Substring(5, parentText.IndexOf("AS", StringComparison.CurrentCulture) - 5)).Trim(); //the int value of 5 refers to the length of keyword, 'INPUT', +1

            if (metaType.Equals(MetaType.INPUT))
            {
                ((FactListValue)this.nodeSet.GetInputMap()[stringToGetFactValue]).AddFactValueToListValue(fv);
            }
            else if (metaType.Equals(MetaType.FIXED))
            {
                ((FactListValue)this.nodeSet.GetFactMap()[stringToGetFactValue]).AddFactValueToListValue(fv);
            }
        }
        /*
         * this method is to set a rule as a fact in the workingMemory
         * before this method is called, nodeName should be given and look up nodeMap in NodeSet to find variableName of the node
         * then the variableName of the node should be passed to this method.
         */

        public void SetFact(string nodeVariableName, FactValue value)
        {
            if (workingMemory.ContainsKey(nodeVariableName))
            {
                FactValue tempFv = workingMemory[nodeVariableName];

                if (tempFv.GetFactValueType().Equals(FactValueType.LIST))
                {
                    ((FactListValue)tempFv).AddFactValueToListValue(tempFv);
                }
                else
                {
                    FactListValue flv = FactValue.Parse(new List <FactValue>());
                    flv.AddFactValueToListValue(tempFv);
                }
            }
            else
            {
                workingMemory.Add(nodeVariableName, value);
            }
        }
Beispiel #4
0
        public override FactValue SelfEvaluate(Dictionary <string, FactValue> workingMemory, Jint.Engine nashorn)
        {
            FactValue fv = null;

            /*
             * Negation and Known type are a part of dependency
             * hence, only checking its variableName value against the workingMemory is necessary.
             * type is as follows;
             *  1. the rule is a plain statement
             *  2. the rule is a statement of 'A IS B'
             *  3. the rule is a statement of 'A IS IN LIST: B'
             *  4. the rule is a statement of 'needs(wants) A'. this is from a child node of ExprConclusionLine type
             */

            if (!this.isPlainStatementFormat)
            {
                if (tokens.tokensList.Any(s => s.Equals("IS")))
                {
                    fv = this.value;
                }
                else if (tokens.tokensList.Any((s) => s.Equals("IS IN LIST:")))
                {
                    bool   lineValue = false;
                    string listName  = FactValue.GetValueInString(this.GetFactValue().GetFactValueType(), this.GetFactValue());
                    if (workingMemory[listName] != null)
                    {
                        FactValue variableValueFromWorkingMemory = workingMemory[this.variableName];
                        lineValue = variableValueFromWorkingMemory != null ?
                                    ((FactListValue)workingMemory[listName]).GetValue().Any((item) => (item as FactStringValue).GetValue().Equals(FactValue.GetValueInString(variableValueFromWorkingMemory.GetFactValueType(), variableValueFromWorkingMemory)))
                        :
                                    ((FactListValue)workingMemory[listName]).GetValue().Any((item) => (item as FactStringValue).GetValue().Equals(this.variableName));
                    }

                    fv = FactValue.Parse(lineValue);
                }
            }

            return(fv);
        }
Beispiel #5
0
        public NodeSet CreateIterateNodeSet(NodeSet parentNodeSet)
        {
            DependencyMatrix          parentDM        = parentNodeSet.GetDependencyMatrix();
            Dictionary <string, Node> parentNodeMap   = parentNodeSet.GetNodeMap();
            Dictionary <int?, string> parentNodeIdMap = parentNodeSet.GetNodeIdMap();


            Dictionary <string, Node> thisNodeMap        = new Dictionary <string, Node>();
            Dictionary <int?, string> thisNodeIdMap      = new Dictionary <int?, string>();
            List <Dependency>         tempDependencyList = new List <Dependency>();
            NodeSet newNodeSet = new NodeSet();

            thisNodeMap.Add(this.nodeName, this);
            thisNodeIdMap.Add(this.nodeId, this.nodeName);
            Enumerable.Range(1, this.givenListSize).ToList().ForEach((nth) =>
            {
                parentDM.GetToChildDependencyList(this.nodeId).ForEach((item) =>
                {
                    if (this.GetNodeId() + 1 != item) // not first question id
                    {
                        Node tempChildNode = parentNodeMap[parentNodeIdMap[item]];
                        LineType lineType  = tempChildNode.GetLineType();

                        Node tempNode          = null;
                        string nextNThInString = Oridinal(nth);

                        if (lineType.Equals(LineType.VALUE_CONCLUSION))
                        {
                            tempNode = new ValueConclusionLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());
                        }
                        else if (lineType.Equals(LineType.COMPARISON))
                        {
                            tempNode             = new ComparisonLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());
                            FactValue tempNodeFv = ((ComparisonLine)tempNode).GetRHS();
                            if (tempNodeFv.GetFactValueType().Equals(FactValueType.STRING))
                            {
                                FactValue tempFv = FactValue.Parse(nextNThInString + " " + this.GetVariableName() + " " + FactValue.GetValueInString(FactValueType.STRING, tempNodeFv));
                                tempNode.SetValue(tempFv);
                            }
                        }
                        else if (lineType.Equals(LineType.EXPR_CONCLUSION))
                        {
                            tempNode = new ExprConclusionLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());
                        }


                        thisNodeMap.Add(tempNode.GetNodeName(), tempNode);
                        thisNodeIdMap.Add(tempNode.GetNodeId(), tempNode.GetNodeName());
                        tempDependencyList.Add(new Dependency(this, tempNode, parentDM.GetDependencyType(this.nodeId, item)));

                        CreateIterateNodeSetAux(parentDM, parentNodeMap, parentNodeIdMap, thisNodeMap, thisNodeIdMap, tempDependencyList, item, tempNode.GetNodeId(), nextNThInString);
                    }
                    else // first question id
                    {
                        Node firstIterateQuestionNode = parentNodeSet.GetNodeByNodeId(parentNodeSet.GetDependencyMatrix().GetToChildDependencyList(this.GetNodeId()).Min());
                        if (!thisNodeMap.ContainsKey(firstIterateQuestionNode.GetNodeName()))
                        {
                            thisNodeMap.Add(firstIterateQuestionNode.GetNodeName(), firstIterateQuestionNode);
                            thisNodeIdMap.Add(item, firstIterateQuestionNode.GetNodeName());
                            tempDependencyList.Add(new Dependency(this, firstIterateQuestionNode, parentDM.GetDependencyType(this.nodeId, item)));
                        }
                    }
                });
            });



            int numberOfRules = Node.GetStaticNodeId();

            int[,] dependencyMatrix = new int[numberOfRules, numberOfRules];


            tempDependencyList.ForEach(dp => {
                int parentId = dp.GetParentNode().GetNodeId();
                int childId  = dp.GetChildNode().GetNodeId();
                int dpType   = dp.GetDependencyType();
                dependencyMatrix[parentId, childId] = dpType;
            });



            newNodeSet.SetNodeIdMap(thisNodeIdMap);
            newNodeSet.SetNodeMap(thisNodeMap);
            newNodeSet.SetDependencyMatrix(new DependencyMatrix(dependencyMatrix));
            newNodeSet.SetFactMap(parentNodeSet.GetFactMap());
            newNodeSet.SetNodeSortedList(TopoSort.DfsTopoSort(thisNodeMap, thisNodeIdMap, dependencyMatrix));
            //      newNodeSet.getNodeSortedList().stream().forEachOrdered(item->System.out.println(item.getNodeId()+"="+item.getNodeName()));
            return(newNodeSet);
        }
Beispiel #6
0
        /*
         * this method is used when a givenList exists as a string
         */
        public void IterateFeedAnswers(string givenJsonString, NodeSet parentNodeSet, AssessmentState parentAst, Assessment ass) // this method uses JSON object via jackson library
        {
            /*
             *      givenJsonString has to be in same format as Example otherwise the engine would NOT be able to enable 'IterateLine' node
             *      --------------------------- "givenJsonString" Format ----------------------------
             *
             *      string givenJsonString = "{
             *                                  \"iterateLineVariableName\":
             *                                      [
             *                                        {
             *                                          \"1st iterateLineVariableName\":
             *                                              {
             *                                                \"1st iterateLineVariableName ruleNme1\":\"..value..\",
             *                                                \"1st iterateLineVariableName ruleNme2\":\"..value..\"
             *                                              }
             *                                        },
             *                                        {
             *                                          \"2nd iterateLineVariableName\":
             *                                              {
             *                                                \"2nd iterateLineVariableName ruleName1\":\"..value..\",
             *                                                \"2nd iterateLineVariableName ruleName2\":\"..value..\"}
             *                                        }
             *                                      ]
             *                               }";
             *
             *     -----------------------------  "givenJsonString" Example ----------------------------
             *     string givenJsonString = "{
             *                                  \"service\":
             *                                      [
             *                                        {
             *                                          \"1st service\":
             *                                              {
             *                                                \"1st service period\":\"..value..\",
             *                                                \"1st service type\":\"..value..\"
             *                                              }
             *                                        },
             *                                        {
             *                                          \"2nd service\":
             *                                              {
             *                                                \"2nd service period\":\"..value..\",
             *                                                \"2nd service type\":\"..value..\"}
             *                                        }
             *                                      ]
             *                               }";
             */
            JObject       jObject     = JObject.Parse(givenJsonString);
            List <JToken> serviceList = jObject.Property(this.variableName).ToList();

            this.givenListSize = serviceList.Count;

            if (this.iterateNodeSet == null)
            {
                this.iterateNodeSet = CreateIterateNodeSet(parentNodeSet);
                this.iterateIE      = new InferenceEngine(this.iterateNodeSet);
                if (this.iterateIE.GetAssessment() == null)
                {
                    this.iterateIE.SetAssessment(new Assessment(this.iterateNodeSet, this.GetNodeName()));
                }
            }
            while (!this.iterateIE.GetAssessmentState().GetWorkingMemory().ContainsKey(this.nodeName))
            {
                Node   nextQuestionNode = GetIterateNextQuestion(parentNodeSet, parentAst);
                string answer           = "";
                Dictionary <string, FactValueType> questionFvtMap = this.iterateIE.FindTypeOfElementToBeAsked(nextQuestionNode);
                foreach (string question in this.iterateIE.GetQuestionsFromNodeToBeAsked(nextQuestionNode))
                {
                    //    answer = jObject.GetValue(this.variableName)
                    //                    .SelectToken
                    //        jsonObj.get(this.variableName)
                    //                    .get(nextQuestionNode.getVariableName().substring(0, nextQuestionNode.getVariableName().lastIndexOf(this.variableName) + this.variableName.length()))
                    //                    .get(nextQuestionNode.getVariableName())
                    //                    .asText().trim();

                    this.iterateIE.FeedAnswerToNode(nextQuestionNode, question, FactValue.Parse(answer), this.iterateIE.GetAssessment());
                }

                Dictionary <string, FactValue> iterateWorkingMemory = this.iterateIE.GetAssessmentState().GetWorkingMemory();
                Dictionary <String, FactValue> parentWorkingMemory  = parentAst.GetWorkingMemory();

                TranseferFactValue(iterateWorkingMemory, parentWorkingMemory);
            }
        }
Beispiel #7
0
        public void CreateIterateNodeSetAux(DependencyMatrix parentDM, Dictionary <string, Node> parentNodeMap, Dictionary <int?, string> parentNodeIdMap, Dictionary <string, Node> thisNodeMap, Dictionary <int?, string> thisNodeIdMap, List <Dependency> tempDependencyList, int originalParentId, int modifiedParentId, string nextNThInString)
        {
            List <int> childDependencyList = parentDM.GetToChildDependencyList(originalParentId);

            if (childDependencyList.Count > 0)
            {
                childDependencyList.ForEach((item) => {
                    Node tempChildNode = parentNodeMap[parentNodeIdMap[item]];
                    LineType lt        = tempChildNode.GetLineType();

                    Node tempNode;
                    thisNodeMap.TryGetValue(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), out tempNode);
                    if (tempNode == null)
                    {
                        if (lt.Equals(LineType.VALUE_CONCLUSION))
                        {
                            tempNode = new ValueConclusionLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());

                            if (parentNodeMap[parentNodeIdMap[originalParentId]].GetLineType().Equals(LineType.EXPR_CONCLUSION))
                            {
                                ExprConclusionLine exprTempNode = thisNodeMap[thisNodeIdMap[modifiedParentId]] as ExprConclusionLine;
                                string replacedString           = FactValue.GetValueInString(exprTempNode.GetEquation().GetFactValueType(), exprTempNode.GetEquation()).Replace(tempChildNode.GetNodeName(), nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName());
                                exprTempNode.SetValue(FactValue.Parse(replacedString));
                                exprTempNode.SetEquation(FactValue.Parse(replacedString));
                            }
                        }
                        else if (lt.Equals(LineType.COMPARISON))
                        {
                            tempNode             = new ComparisonLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());
                            FactValue tempNodeFv = ((ComparisonLine)tempNode).GetRHS();
                            if (tempNodeFv.GetFactValueType().Equals(FactValueType.STRING))
                            {
                                FactValue tempFv = FactValue.Parse(nextNThInString + " " + this.GetVariableName() + " " + tempNodeFv);
                                tempNode.SetValue(tempFv);
                            }
                        }
                        else if (lt.Equals(LineType.EXPR_CONCLUSION))
                        {
                            tempNode = new ExprConclusionLine(nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName(), tempChildNode.GetTokens());
                        }
                    }
                    else
                    {
                        if (lt.Equals(LineType.VALUE_CONCLUSION) && parentNodeMap[parentNodeIdMap[originalParentId]].GetLineType().Equals(LineType.EXPR_CONCLUSION))
                        {
                            ExprConclusionLine exprTempNode = ((ExprConclusionLine)thisNodeMap[thisNodeIdMap[modifiedParentId]]);
                            string replacedString           = FactValue.GetValueInString(exprTempNode.GetEquation().GetFactValueType(), exprTempNode.GetEquation()).Replace(tempChildNode.GetNodeName(), nextNThInString + " " + this.GetVariableName() + " " + tempChildNode.GetNodeName());
                            exprTempNode.SetValue(FactValue.Parse(replacedString));
                            exprTempNode.SetEquation(FactValue.Parse(replacedString));
                        }
                    }

                    if (!thisNodeMap.ContainsKey(tempNode.GetNodeName()))
                    {
                        thisNodeMap.Add(tempNode.GetNodeName(), tempNode);
                        thisNodeIdMap.Add(tempNode.GetNodeId(), tempNode.GetNodeName());
                        tempDependencyList.Add(new Dependency(thisNodeMap[thisNodeIdMap[modifiedParentId]], tempNode, parentDM.GetDependencyType(originalParentId, item)));

                        CreateIterateNodeSetAux(parentDM, parentNodeMap, parentNodeIdMap, thisNodeMap, thisNodeIdMap, tempDependencyList, item, tempNode.GetNodeId(), nextNThInString);
                    }
                });
            }
        }
        public void SetValue(string valueInString, Tokens tokens)
        {
            int    tokenStringListSize = tokens.tokensStringList.Count;
            string lastTokenString     = tokens.tokensStringList[tokenStringListSize - 1];

            string[] tempArray = Regex.Split(valueInString, " ");
            string   tempStr   = tempArray[0];

            if (metaType.Equals(MetaType.FIXED))
            {
                if (tempStr.Equals("IS"))
                {
                    if (this.IsDate(lastTokenString))
                    {
                        DateTime factValueInDate;
                        DateTime.TryParseExact(tempArray[1], "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out factValueInDate);

                        this.value = FactValue.Parse(factValueInDate);
                    }
                    else if (this.IsDouble(lastTokenString))
                    {
                        double tempDouble = Double.Parse(tempArray[1]);
                        this.value = FactValue.Parse(tempDouble);
                    }
                    else if (this.IsInteger(lastTokenString))
                    {
                        int tempInt = Int32.Parse(tempArray[1]);
                        this.value = FactValue.Parse(tempInt);
                    }
                    else if (this.IsBoolean(tempArray[1]))
                    {
                        this.value = tempArray[1].ToLower().Equals("false") ? FactValue.Parse(false) : FactValue.Parse(true);
                    }
                    else if (this.IsHash(lastTokenString))
                    {
                        this.value = FactValue.ParseHash(tempArray[1]);
                    }
                    else if (this.IsURL(lastTokenString))
                    {
                        this.value = FactValue.ParseURL(tempArray[1]);
                    }
                    else if (this.IsGUID(lastTokenString))
                    {
                        this.value = FactValue.ParseUUID(tempArray[1]);
                    }
                }
                else if (tempStr.Equals("AS"))
                {
                    if (tempArray[1].Equals("LIST"))
                    {
                        this.value = FactValue.Parse(new List <FactValue>());
                    }
                    else
                    {
                        this.value = FactValue.Parse("WARNING");
                    }
                }
            }
            else if (metaType.Equals(MetaType.INPUT))
            {
                if (tempArray.Length > 1)
                {
                    /*
                     * within this case 'DefaultValue' will be set due to the statement format is as follows;
                     * 'A AS 'TEXT' IS B'
                     * and 'A' is variable, 'TEXT' is a type of variable, and 'B' is a default value.
                     * if the type is 'LIST' then variable is a list then the factValue has a default value.
                     */
                    String tempStr2 = tempArray[2];

                    if (FactValueType.LIST.ToString().Equals(tempStr))
                    {
                        List <FactValue> valueList = new List <FactValue>();
                        FactValue        tempValue;
                        if (this.IsDate(lastTokenString)) // tempStr2 is date value
                        {
                            DateTime factValueInDate;
                            DateTime.TryParseExact(tempStr2, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out factValueInDate);
                            tempValue = FactValue.Parse(factValueInDate);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsDouble(lastTokenString)) //tempStr2 is double value
                        {
                            double tempDouble = Double.Parse(tempStr2);
                            tempValue = FactValue.Parse(tempDouble);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsInteger(lastTokenString)) //tempStr2 is integer value
                        {
                            int tempInt = Int32.Parse(tempStr2);
                            tempValue = FactValue.Parse(tempInt);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsHash(lastTokenString)) //tempStr2 is integer value
                        {
                            tempValue = FactValue.ParseHash(tempStr2);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsURL(lastTokenString)) //tempStr2 is integer value
                        {
                            tempValue = FactValue.ParseURL(tempStr2);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsGUID(lastTokenString)) //tempStr2 is integer value
                        {
                            tempValue = FactValue.ParseUUID(tempStr2);
                            valueList.Add(tempValue);
                        }
                        else if (this.IsBoolean(tempStr2)) // tempStr2 is boolean value
                        {
                            if (tempStr2.ToLower().Equals("false"))
                            {
                                tempValue = FactValue.Parse(false);
                            }
                            else
                            {
                                tempValue = FactValue.Parse(true);
                            }
                            valueList.Add(tempValue);
                        }
                        else // tempStr2 is String value
                        {
                            tempValue = FactValue.Parse(tempStr2);
                            valueList.Add(tempValue);
                        }

                        this.value = FactValue.Parse(valueList);
                        ((FactListValue)this.value).SetDefaultValue(tempValue);
                    }
                    else if (FactValueType.TEXT.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(tempStr2);
                    }
                    else if (FactValueType.DATE.ToString().Equals(tempStr))
                    {
                        DateTime factValueInDate;
                        DateTime.TryParseExact(tempStr2, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out factValueInDate);

                        this.value = FactValue.Parse(factValueInDate);
                    }
                    else if (FactValueType.NUMBER.ToString().Equals(tempStr))
                    {
                        int factValueInInteger = Int32.Parse(tempStr2);
                        this.value = FactValue.Parse(factValueInInteger);
                    }
                    else if (FactValueType.DECIMAL.ToString().Equals(tempStr))
                    {
                        double factValueInDouble = Double.Parse(tempStr2);
                        this.value = FactValue.Parse(factValueInDouble);
                    }
                    else if (FactValueType.BOOLEAN.ToString().Equals(tempStr))
                    {
                        if (tempStr2.ToLower().Equals("true"))
                        {
                            this.value = FactValue.Parse(true);
                        }
                        else
                        {
                            this.value = FactValue.Parse(false);
                        }
                    }
                    else if (FactValueType.URL.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.ParseURL(tempStr2);
                    }
                    else if (FactValueType.HASH.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.ParseHash(tempStr2);
                    }
                    else if (FactValueType.UUID.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.ParseUUID(tempStr2);
                    }
                }
                else
                {
                    /*
                     * case of the statement does not have value, only contains a type of the variable
                     * so that the value will not have any default values
                     */
                    if (FactValueType.LIST.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(new List <FactValue>());
                    }
                    else if (FactValueType.TEXT.ToString().Equals(tempStr) || FactValueType.URL.ToString().Equals(tempStr) || FactValueType.HASH.ToString().Equals(tempStr) || FactValueType.UUID.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(" ");
                    }
                    else if (FactValueType.DATE.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(DateTime.MinValue);
                    }
                    else if (FactValueType.NUMBER.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(-1111);
                    }
                    else if (FactValueType.DECIMAL.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(-0.1111);
                    }
                    else if (FactValueType.BOOLEAN.ToString().Equals(tempStr))
                    {
                        this.value = FactValue.Parse(Boolean.TrueString);
                    }
                }
            }
        }
Beispiel #9
0
        public override FactValue SelfEvaluate(Dictionary <string, FactValue> workingMemory, Jint.Engine jint)
        {
            /*
             * Negation type can only be used for this line type
             *
             */

            FactValue workingMemoryLhsValue = workingMemory.ContainsKey(this.variableName) ? workingMemory[this.variableName] : null;
            string    rhsValueInString      = FactValue.GetValueInString(this.GetRHS().GetFactValueType(), this.GetRHS());

            FactValue workingMemoryRhsValue = this.GetRHS().GetFactValueType().Equals(FactValueType.STRING) ?
                                              workingMemory[rhsValueInString]
                                                     :
                                              this.GetRHS();

            String script = "";

            /*
             * There will NOT be the case of that workingMemoryRhsValue is null because the node must be in following format;
             * - A = 12231 (int or double)
             * - A = Adam sandler (String)
             * - A = 11/11/1977 (Date)
             * - A = 123123dfae1421412aer(Hash)
             * - A = 1241414-12421312-142421312(UUID)
             * - A = true(Boolean)
             * - A = www.aiBrain.com(URL)
             * - A = B(another variable)
             */

            /*
             * if it is about date comparison then string of 'script' needs rewriting
             */
            if ((workingMemoryLhsValue != null && workingMemoryLhsValue.GetFactValueType().Equals(FactValueType.DATE)) || (workingMemoryRhsValue != null && workingMemoryRhsValue.GetFactValueType().Equals(FactValueType.DATE)))
            {
                Boolean returnValue;
                switch (this.operatorString)
                {
                case ">":
                    returnValue = (((FactDateValue)workingMemoryLhsValue).GetValue()).CompareTo((((FactDateValue)workingMemoryRhsValue).GetValue())) > 0 ? true : false;
                    return(FactValue.Parse(returnValue));

                case ">=":
                    returnValue = (((FactDateValue)workingMemoryLhsValue).GetValue()).CompareTo((((FactDateValue)workingMemoryRhsValue).GetValue())) >= 0 ? true : false;
                    return(FactValue.Parse(returnValue));

                case "<":
                    returnValue = (((FactDateValue)workingMemoryLhsValue).GetValue()).CompareTo((((FactDateValue)workingMemoryRhsValue).GetValue())) < 0 ? true : false;
                    return(FactValue.Parse(returnValue));

                case "<=":
                    returnValue = (((FactDateValue)workingMemoryLhsValue).GetValue()).CompareTo((((FactDateValue)workingMemoryRhsValue).GetValue())) <= 0 ? true : false;
                    return(FactValue.Parse(returnValue));
                }
                //          script = "new Date("+((FactDateValue)workingMemoryLhsValue).getValue().getYear()+"/"+((FactDateValue)workingMemoryLhsValue).getValue().getMonthValue()+"/"+((FactDateValue)workingMemoryLhsValue).getValue().getDayOfMonth()+")"+operator+"new Date("+((FactDateValue)workingMemoryRhsValue).getValue().getYear()+"/"+((FactDateValue)workingMemoryRhsValue).getValue().getMonthValue()+"/"+((FactDateValue)workingMemoryRhsValue).getValue().getDayOfMonth()+");" ;
            }
            else if (workingMemoryLhsValue != null && (workingMemoryLhsValue.GetFactValueType().Equals(FactValueType.DECIMAL) || workingMemoryLhsValue.GetFactValueType().Equals(FactValueType.DOUBLE) ||
                                                       workingMemoryLhsValue.GetFactValueType().Equals(FactValueType.INTEGER) || workingMemoryLhsValue.GetFactValueType().Equals(FactValueType.NUMBER)))
            {
                script = FactValue.GetValueInString(workingMemoryLhsValue.GetFactValueType(), workingMemoryLhsValue) + operatorString + FactValue.GetValueInString(workingMemoryRhsValue.GetFactValueType(), workingMemoryRhsValue);
            }
            else
            {
                if (workingMemoryRhsValue != null && workingMemoryLhsValue != null)
                {
                    script = "'" + FactValue.GetValueInString(workingMemoryLhsValue.GetFactValueType(), workingMemoryLhsValue) + "' " + operatorString + " '" + FactValue.GetValueInString(workingMemoryRhsValue.GetFactValueType(), workingMemoryRhsValue) + "'";
                }
            }
            Boolean   result;
            FactValue fv = null;

            if (workingMemoryRhsValue != null && workingMemoryLhsValue != null)
            {
                result = Convert.ToBoolean(jint.Execute(script).GetCompletionValue().ToString());
                fv     = FactValue.Parse(result);
            }


            return(fv);
        }
        public override FactValue SelfEvaluate(Dictionary <string, FactValue> workingMemory, Jint.Engine jint)
        {
            /*
             * calculation can only handle int, double(long) and difference in years between two dates at the moment.
             * if difference in days or months is required then new 'keyword' must be introduced such as 'Diff Years', 'Diff Days', or 'Diff Months'
             */
            string equationInString = FactValue.GetValueInString(this.equation.GetFactValueType(), this.equation);
            string pattern          = @"[-+/*()?:;,.""](\s*)";
            string datePattern      = @"([0-2]?[0-9]|3[0-1])/(0?[0-9]|1[0-2])/([0-9][0-9])?[0-9][0-9]|([0-9][0-9])?[0-9][0-9]/(0?[0-9]|1[0-2])/([0-2]?[0-9]|3[0-1])";


            /*
             * logic for this is as follows;
             *  1. replace all variables with actual values from 'workingMemory'
             *  2. find out if equation is about date (difference in years) calculation or not
             *  3. if it is about date then call 'java.time.LocalDate'and 'java.time.temporal.ChronoUnit' package then do the calculation
             *  3-1. if it is about int or double(long) then use plain Javascript
             *
             */

            string script     = equationInString;
            string tempScript = script;
            string result;

            if (Regex.IsMatch(equationInString, pattern))
            {
                string[] tempArray       = Regex.Split(equationInString, pattern);
                int      tempArrayLength = tempArray.Length;
                string   tempItem;
                for (int i = 0; i < tempArrayLength; i++)
                {
                    tempItem = tempArray[i];
                    if (!string.IsNullOrEmpty(tempItem.Trim()) && (workingMemory.ContainsKey(tempItem.Trim()) && workingMemory[tempItem.Trim()] != null))
                    {
                        FactValue tempFv = workingMemory[tempItem.Trim()];
                        if (tempFv.GetFactValueType().Equals(FactValueType.DATE))
                        {
                            /*
                             * below line is temporary solution.
                             * Within next iteration it needs to be that this node should take dateFormatter for its constructor to determine which date format it needs
                             */
                            string tempStr = DateTime.ParseExact(FactValue.GetValueInString(tempFv.GetFactValueType(), tempFv), dateFormatter, CultureInfo.InvariantCulture).ToString().Split(' ')[0].Trim();
                            tempScript = tempScript.Replace(tempItem.Trim(), tempStr);
                        }
                        else
                        {
                            tempScript = tempScript.Replace(tempItem.Trim(), FactValue.GetValueInString(workingMemory[tempItem.Trim()].GetFactValueType(), workingMemory[tempItem.Trim()]).Trim());
                        }
                    }
                }
            }



            MatchCollection dateMatcher  = Regex.Matches(tempScript, datePattern);
            List <DateTime> dateTimeList = new List <DateTime>();

            if (dateMatcher.Count > 0)
            {
                foreach (Match match in dateMatcher)
                {
                    string[] datetimeString = Regex.Split(match.Groups[0].ToString(), @"/");
                    int      year           = 0;
                    int      month          = 0;
                    int      day            = 0;
                    if (Int32.TryParse(datetimeString[2], out year) && Int32.TryParse(datetimeString[1], out month) && Int32.TryParse(datetimeString[0], out day))
                    {
                        dateTimeList.Add(new DateTime(year, month, day));
                    }
                }

                result = (dateTimeList[0].Subtract(dateTimeList[1]).TotalDays / 365.25).ToString();
            }
            else
            {
                result = jint.Execute(tempScript).GetCompletionValue().ToString();
            }

            FactValue returnValue = null;

            switch (Tokenizer.GetTokens(result).tokensString)
            {
            case "No":
                int intResult = 0;
                Int32.TryParse(result, out intResult);
                returnValue = FactValue.Parse(intResult);
                break;

            case "De":
                returnValue = FactValue.Parse(Convert.ToDouble(result));
                break;

            //there is no function for outcome to be a date at the moment  E.g.The determination IS CALC(enrollment date + 5 days)
            //case "Da":
            default:
                returnValue = FactValue.Parse(result);
                break;
            }

            return(returnValue);
        }
Beispiel #11
0
        protected void SetValue(string lastTokenstring, string lastToken)
        {
            switch (lastTokenstring)
            {
            case "No":
                int intValue = 0;
                Int32.TryParse(lastToken, out intValue);

                this.value = FactValue.Parse(intValue);
                break;

            case "Do":
                double doubleValue = 0.0;
                Double.TryParse(lastToken, out doubleValue);

                this.value = FactValue.Parse(doubleValue);
                break;

            case "Da":
                DateTime dateValue;
                DateTime.TryParseExact(lastToken, "dd/MM/yyyy", null, System.Globalization.DateTimeStyles.None, out dateValue);

                this.value = FactValue.Parse(dateValue);
                break;

            case "Url":
                this.value = FactValue.ParseURL(lastToken);
                break;

            case "Id":
                this.value = FactValue.ParseUUID(lastToken);
                break;

            case "Ha":
                this.value = FactValue.ParseHash(lastToken);
                break;

            case "Q":
                this.value = FactValue.ParseDefiString(lastToken);
                break;

            case "L":
            case "M":
            case "U":
            case "C":
                if (this.IsBoolean(lastToken))
                {
                    this.value = string.Equals(lastToken, "false", StringComparison.OrdinalIgnoreCase)? FactValue.Parse(false) : FactValue.Parse(true);
                }
                else
                {
                    Regex regex = new Regex(@"^([""\“])(.*)([""\”]$)");

                    Match match = regex.Match(lastToken);

                    if (match.Success)
                    {
                        string newS = match.Groups[2].Value;
                        this.value = FactValue.ParseDefiString(newS);
                    }
                    else
                    {
                        this.value = FactValue.Parse(lastToken);
                    }
                }
                break;
            }
        }