/// <summary>
        /// Fetches the switch data.
        /// </summary>
        /// <param name="variableName">Name of the variable.</param>
        /// <param name="oldAmbientData">The old ambient data.</param>
        /// <returns></returns>
        public string FetchSwitchData(string variableName, IList <string> oldAmbientData)
        {
            ErrorResultTO        errors;
            Guid                 dlId = FetchDataListID(oldAmbientData);
            IBinaryDataListEntry tmp  = EvaluateForSwitch(variableName, dlId, out errors);

            if (errors.HasErrors())
            {
                Compiler.UpsertSystemTag(dlId, enSystemTag.Dev2Error, errors.MakeDataListReady(), out errors);
            }

            if (tmp != null)
            {
                if (tmp.IsRecordset)
                {
                    string error;
                    return(tmp.TryFetchLastIndexedRecordsetUpsertPayload(out error).TheValue);
                }

                var scalar = tmp.FetchScalar();

                return(scalar.TheValue);
            }

            return(string.Empty);
        }
        static string GetValueForDecisionVariable(Guid dlId, string decisionColumn)
        {
            if (!String.IsNullOrEmpty(decisionColumn))
            {
                IBinaryDataListItem  binaryDataListItem = null;
                ErrorResultTO        errors;
                IBinaryDataListEntry entry = Compiler.Evaluate(dlId, enActionType.User, decisionColumn, false, out errors);
                if (entry != null && entry.IsRecordset)
                {
                    string error;
                    var    indexType = DataListUtil.GetRecordsetIndexType(decisionColumn);
                    if (indexType == enRecordsetIndexType.Numeric)
                    {
                        var index      = int.Parse(DataListUtil.ExtractIndexRegionFromRecordset(decisionColumn));
                        var columnName = DataListUtil.ExtractFieldNameFromValue(decisionColumn);

                        binaryDataListItem = entry.TryFetchRecordsetColumnAtIndex(columnName, index, out error);
                    }
                    else
                    {
                        binaryDataListItem = entry.TryFetchLastIndexedRecordsetUpsertPayload(out error);
                    }
                }
                else
                {
                    if (entry != null)
                    {
                        binaryDataListItem = entry.FetchScalar();
                    }
                }
                if (binaryDataListItem != null)
                {
                    var value = binaryDataListItem.TheValue;
                    // handle \n coming from value ;)
                    value = value.Replace("\r\n", "__R__N__");
                    value = value.Replace("\n", "\r\n");
                    value = value.Replace("__R__N__", "\r\n");
                    return(value);
                }
            }
            return(null);
        }
示例#3
0
        /// <summary>
        /// Evaluates the function.
        /// </summary>
        /// <param name="expressionTO">The expression TO.</param>
        /// <param name="curDLID">The cur DLID.</param>
        /// <param name="errors">The errors.</param>
        /// <returns></returns>
        public string EvaluateFunction(IEvaluationFunction expressionTO, Guid curDLID, out ErrorResultTO errors)
        {
            string            expression = expressionTO.Function;
            IDataListCompiler compiler   = DataListFactory.CreateDataListCompiler();
            SyntaxTreeBuilder builder    = new SyntaxTreeBuilder();
            ErrorResultTO     allErrors  = new ErrorResultTO();


            // Travis.Frisinger : 31.01.2013 - Hi-jack this and evaluate all our internal
            IBinaryDataListEntry bde = compiler.Evaluate(curDLID, enActionType.CalculateSubstitution, expression, false, out errors);

            allErrors.MergeErrors(errors);
            if (bde != null)
            {
                expression = bde.FetchScalar().TheValue;
                if (expression.StartsWith("\""))
                {
                    expression = expression.Replace("\"", "").Trim();
                }
            }

            Node[] nodes  = builder.Build(expression);
            string result = string.Empty;

            if (builder.EventLog.HasEventLogs)
            {
                IEnumerable <string> err = EvaluateEventLogs(expression);

                foreach (string e in err)
                {
                    allErrors.AddError(e);
                }
            }
            else
            {
                List <Node> allNodes = new List <Node>();
                nodes[0].CollectNodes(allNodes);

                IterationNodeValueSource valueSource = null;
                bool startedIteration          = false;
                bool isIteration               = false;
                bool pendingIterationRecordSet = false;
                int  maxRecords    = -1;
                int  currentRecord = 0;

                do
                {
                    if (startedIteration)
                    {
                        foreach (Node t in allNodes)
                        {
                            t.EvaluatedValue = null;
                        }
                    }

                    for (int i = allNodes.Count - 1; i >= 0; i--)
                    {
                        if (allNodes[i] is IterationNode)
                        {
                            IterationNode refNode = allNodes[i] as IterationNode;
                            if (valueSource == null)
                            {
                                valueSource = new IterationNodeValueSource(1);
                            }
                            refNode.ValueSource       = valueSource;
                            pendingIterationRecordSet = true;
                            isIteration = true;
                        }
                        else if (allNodes[i] is DatalistRecordSetNode)
                        {
                            DatalistRecordSetNode refNode = allNodes[i] as DatalistRecordSetNode;

                            if (refNode.Parameter != null)
                            {
                                if ((refNode.Parameter.Items != null && refNode.Parameter.Items.Length != 0) || refNode.Parameter.Statement != null)
                                {
                                    refNode.Parameter.EvaluatedValue = InternalEval(refNode.Parameter.GetEvaluatedValue());
                                }
                            }


                            // this way we fetch the correct field with the data...
                            IBinaryDataListEntry e = compiler.Evaluate(curDLID, enActionType.User, refNode.GetRepresentationForEvaluation(), false, out errors);
                            allErrors.MergeErrors(errors);
                            string error;
                            refNode.EvaluatedValue = e.TryFetchLastIndexedRecordsetUpsertPayload(out error).TheValue;
                            allErrors.AddError(error);

                            if (pendingIterationRecordSet)
                            {
                                pendingIterationRecordSet = false;

                                if (refNode.NestedIdentifier != null)
                                {
                                    allErrors.AddError("An error occurred while parsing { " + expression + " } Iteration operator can not be used with nested recordset identifiers.");
                                    break;
                                }

                                string evaluateRecordLeft = refNode.GetRepresentationForEvaluation();
                                evaluateRecordLeft = evaluateRecordLeft.Substring(2, evaluateRecordLeft.IndexOf('(') - 2);

                                int                  totalRecords = 0;
                                IBinaryDataList      bdl          = compiler.FetchBinaryDataList(curDLID, out errors);
                                IBinaryDataListEntry entry;
                                if (bdl.TryGetEntry(evaluateRecordLeft, out entry, out error))
                                {
                                    totalRecords = entry.FetchLastRecordsetIndex();
                                }
                                allErrors.AddError(error);

                                maxRecords = Math.Max(totalRecords, maxRecords);
                            }
                        }
                        else if (allNodes[i] is DatalistReferenceNode)
                        {
                            DatalistReferenceNode refNode = allNodes[i] as DatalistReferenceNode;
                            IBinaryDataListEntry  entry   = compiler.Evaluate(curDLID, enActionType.User, refNode.GetRepresentationForEvaluation(), false, out errors);
                            allErrors.MergeErrors(errors);

                            if (entry.IsRecordset)
                            {
                                string error;
                                refNode.EvaluatedValue = entry.TryFetchLastIndexedRecordsetUpsertPayload(out error).TheValue;
                                double testParse;
                                if (!Double.TryParse(refNode.EvaluatedValue, out testParse))
                                {
                                    refNode.EvaluatedValue = String.Concat("\"", refNode.EvaluatedValue, "\"");                                                        //Bug 6438
                                }
                            }
                            else
                            {
                                refNode.EvaluatedValue = entry.FetchScalar().TheValue;
                                double testParse;
                                if (!Double.TryParse(refNode.EvaluatedValue, out testParse))
                                {
                                    refNode.EvaluatedValue = String.Concat("\"", refNode.EvaluatedValue, "\"");                                                        //Bug 6438
                                }
                            }
                        }
                        else if (allNodes[i] is BinaryOperatorNode && allNodes[i].Identifier.Start.Definition == TokenKind.Colon)
                        {
                            BinaryOperatorNode biNode = (BinaryOperatorNode)allNodes[i];

                            if (!(biNode.Left is DatalistRecordSetFieldNode))
                            {
                                allErrors.AddError("An error occurred while parsing { " + expression + " } Range operator can only be used with record set fields.");
                                break;
                            }

                            if (!(biNode.Right is DatalistRecordSetFieldNode))
                            {
                                allErrors.AddError("An error occurred while parsing { " + expression + " } Range operator can only be used with record set fields.");
                                break;
                            }

                            DatalistRecordSetFieldNode fieldLeft  = (DatalistRecordSetFieldNode)biNode.Left;
                            DatalistRecordSetFieldNode fieldRight = (DatalistRecordSetFieldNode)biNode.Right;

                            string evaluateFieldLeft  = (fieldLeft.Field != null) ? fieldLeft.Field.GetEvaluatedValue() : fieldLeft.Identifier.Content;
                            string evaluateFieldRight = (fieldRight.Field != null) ? fieldRight.Field.GetEvaluatedValue() : fieldRight.Identifier.Content;

                            if (!String.Equals(evaluateFieldLeft, evaluateFieldRight, StringComparison.Ordinal))
                            {
                                allErrors.AddError("An error occurred while parsing { " + expression + " } Range operator must be used with the same record set fields.");
                                break;
                            }

                            string evaluateRecordLeft = fieldLeft.RecordSet.GetRepresentationForEvaluation();
                            evaluateRecordLeft = evaluateRecordLeft.Substring(2, evaluateRecordLeft.IndexOf('(') - 2);
                            string evaluateRecordRight = fieldRight.RecordSet.GetRepresentationForEvaluation();
                            evaluateRecordRight = evaluateRecordRight.Substring(2, evaluateRecordRight.IndexOf('(') - 2);

                            if (!String.Equals(evaluateRecordLeft, evaluateRecordRight, StringComparison.Ordinal))
                            {
                                allErrors.AddError("An error occurred while parsing { " + expression + " } Range operator must be used with the same record sets.");
                                break;
                            }

                            int                  totalRecords = 0;
                            IBinaryDataList      bdl          = compiler.FetchBinaryDataList(curDLID, out errors);
                            string               error;
                            IBinaryDataListEntry entry;
                            if (bdl.TryGetEntry(evaluateRecordLeft, out entry, out error))
                            {
                                totalRecords = entry.FetchLastRecordsetIndex();
                            }

                            string rawParamLeft = fieldLeft.RecordSet.Parameter.GetEvaluatedValue();
                            rawParamLeft = rawParamLeft.Length == 2 ? "" : rawParamLeft.Substring(1, rawParamLeft.Length - 2);
                            string rawParamRight = fieldRight.RecordSet.Parameter.GetEvaluatedValue();
                            rawParamRight = rawParamRight.Length == 2 ? "" : rawParamRight.Substring(1, rawParamRight.Length - 2);

                            int startIndex;
                            int endIndex;

                            if (!String.IsNullOrEmpty(rawParamLeft))
                            {
                                if (!Int32.TryParse(rawParamLeft, out startIndex) || startIndex <= 0)
                                {
                                    allErrors.AddError("An error occurred while parsing { " + expression + " } Recordset index must be a positive whole number that is greater than zero.");
                                    break;
                                }
                            }
                            else
                            {
                                startIndex = 1;
                            }

                            if (!String.IsNullOrEmpty(rawParamRight))
                            {
                                if (!Int32.TryParse(rawParamRight, out endIndex) || endIndex <= 0)
                                {
                                    allErrors.AddError("An error occurred while parsing { " + expression + " } Recordset index must be a positive whole number that is greater than zero.");
                                    break;
                                }

                                if (endIndex > totalRecords)
                                {
                                    allErrors.AddError("An error occurred while parsing { " + expression + " } Recordset end index must be a positive whole number that is less than the number of entries in the recordset.");
                                    break;
                                }
                            }
                            else
                            {
                                endIndex = totalRecords;
                            }

                            endIndex++;

                            StringBuilder rangeBuilder = new StringBuilder();

                            for (int k = startIndex; k < endIndex; k++)
                            {
                                if (k != startIndex)
                                {
                                    rangeBuilder.Append("," + entry.TryFetchRecordsetColumnAtIndex(evaluateFieldLeft, k, out error).TheValue);
                                    allErrors.AddError(error);
                                }
                                else
                                {
                                    rangeBuilder.Append(entry.TryFetchRecordsetColumnAtIndex(evaluateFieldLeft, k, out error).TheValue);
                                    allErrors.AddError(error);
                                }
                            }
                            allNodes[i].EvaluatedValue = rangeBuilder.ToString();
                        }
                    }

                    string evaluatedValue = nodes[0].GetEvaluatedValue();
                    result = InternalEval(evaluatedValue);

                    if (startedIteration)
                    {
                        currentRecord = valueSource.Index++;
                    }

                    if (isIteration && !startedIteration)
                    {
                        startedIteration = true;
                        currentRecord    = valueSource.Index++;
                    }
                }while(startedIteration && currentRecord < maxRecords);
            }

            errors = allErrors;

            return(result);
        }