示例#1
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultForQueryRowVariableContext(AnalysisProcessingQueryResultRowExecutionContext rowContext, AnalysisProcessingValueExecutionContext valueExecutionContext)
        {
            bool complete          = true;
            var  objectResultArray = new List <object>();
            int  i = 0;

            foreach (AnalysisValueFunction func in this.Arguments)
            {
                AnalysisValueIntermediateResult res = func.ResultForQueryRowVariableContext(rowContext, valueExecutionContext.ChildExecutionContextAtIndex(i++));
                if (!res.Complete)
                {
                    complete = false;
                }

                if (res == null)
                {
                    objectResultArray.Add(new AnalysisValueIntermediateResult(0));
                }
                else
                {
                    objectResultArray.Add(res);
                }
            }

            if (!complete)
            {
                return(new AnalysisValueIntermediateResultWithFormula(this, objectResultArray, rowContext, valueExecutionContext));
            }

            return(this.ObjectResultForArguments(objectResultArray));
        }
示例#2
0
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ObjectResultForResultRow(ICrmDataSourceRow row)
        {
            var objectResultArray = new List <JsValue>();

            foreach (AnalysisValueFunction func in this.Arguments)
            {
                AnalysisValueIntermediateResult res = func.ObjectResultForResultRow(row);
                if (res == null || !res.Complete)
                {
                    objectResultArray.Add(new JsValue(0));
                }
                else
                {
                    objectResultArray.Add(res.JavascriptResult);
                }
            }

            JsValue resultValue = this.JavascriptFunction.Invoke(objectResultArray.ToArray());

            if (resultValue.IsString())
            {
                return(new AnalysisValueIntermediateResult(resultValue.ToString()));
            }
            else if (resultValue.IsNumber())
            {
                return(new AnalysisValueIntermediateResult(resultValue.ToDouble()));
            }
            else
            {
                return(new AnalysisValueIntermediateResult(resultValue));
            }
        }
        /// <summary>
        /// Text result for result row
        /// </summary>
        /// <param name="row">Row</param>
        /// <returns>Text result</returns>
        public virtual string TextResultForResultRow(ICrmDataSourceRow row)
        {
            AnalysisValueIntermediateResult res = this.ObjectResultForResultRow(row);

            if (res != null)
            {
                return(res.TextResult);
            }

            return(string.Empty);
        }
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ResultForQueryRowVariableContext(AnalysisProcessingQueryResultRowExecutionContext row, AnalysisProcessingValueExecutionContext valueExecutionContext)
        {
            AnalysisProcessingValueExecutionContext childExecutionContext = valueExecutionContext.ChildExecutionContextAtIndex(0);
            AnalysisValueIntermediateResult         result = this.ArgumentFunction.ResultForQueryRowVariableContext(row, childExecutionContext);

            if (result.Complete)
            {
                return(this.AnalysisFunction.ResultWithArgumentRowContextValueContext(result.JavascriptResult, row, valueExecutionContext));
            }
            else
            {
                return(new AnalysisValueIntermediateResultWithFunction(this, result, row, valueExecutionContext));
            }
        }
        /// <inheritdoc/>
        public override AnalysisValueIntermediateResult ObjectResultForResultRow(ICrmDataSourceRow row)
        {
            AnalysisValueIntermediateResult argumentResult = this.ArgumentFunction.ObjectResultForResultRow(row);

            if (argumentResult.Complete)
            {
                AnalysisValueIntermediateResult res = this.AnalysisFunction.ResultWithArgumentRowContextValueContext(argumentResult.JavascriptResult, null, null);
                if (res.Complete)
                {
                    return(res);
                }
            }

            return(new AnalysisValueIntermediateResult("configError: incomplete"));
        }
        /// <inheritdoc/>
        public override List <object> CategoriesForRow(ICrmDataSourceRow row)
        {
            List <object> stringValueArray;

            if (this.valueFunction == null)
            {
                stringValueArray = new List <object> {
                    "invalid"
                };
            }
            else
            {
                AnalysisValueIntermediateResult result = this.valueFunction.ObjectResultForResultRow(row);
                if (result.IsTextResult)
                {
                    stringValueArray = new List <object> {
                        result.TextResult
                    };
                }
                else if (result.IsObject)
                {
                    stringValueArray = result.ArrayResult;
                    var arr = new List <object>();
                    foreach (object v in stringValueArray)
                    {
                        if (v is string)
                        {
                            arr.Add((string)v);
                        }
                    }

                    stringValueArray = arr;
                }
                else
                {
                    stringValueArray = new List <object> {
                        result.TextResult
                    };
                }
            }

            List <object> categoryValueArray = null;

            foreach (string rawValue in stringValueArray)
            {
                AnalysisCategoryValue categoryValue = this.ValueDictionary.ValueOrDefault(rawValue) as AnalysisCategoryValue;
                if (categoryValue == null)
                {
                    categoryValue = new AnalysisCategoryValue(this, rawValue, rawValue);
                    if (categoryValue != null)
                    {
                        this.AddToValueDictionary(categoryValue);
                    }
                }

                if (categoryValue != null)
                {
                    if (categoryValueArray == null)
                    {
                        categoryValueArray = new List <object> {
                            categoryValue
                        };
                    }
                    else
                    {
                        categoryValueArray.Add(categoryValue);
                    }
                }
            }

            return(categoryValueArray);
        }
        /// <summary>
        /// Executes computation step
        /// </summary>
        /// <returns>Boolean value for execute computation step</returns>
        public override bool ExecuteComputationStep()
        {
            this.complete = true;
            int i, objectCount = this.objectValues.Count, xObjectCount = this.xObjectValues.Count;

            for (i = 0; i < objectCount; i++)
            {
                AnalysisValueIntermediateResult result = this.objectValues[i] as AnalysisValueIntermediateResult;
                if (!result.Complete)
                {
                    result = result.ExecuteStep();
                    this.objectValues[i] = result;
                    if (!result.Complete)
                    {
                        this.complete = false;
                    }
                }
            }

            for (i = 0; i < xObjectCount; i++)
            {
                AnalysisValueIntermediateResult result = this.xObjectValues[i] as AnalysisValueIntermediateResult;
                if (!result.Complete)
                {
                    result = result.ExecuteStep();
                    this.xObjectValues[i] = result;
                    if (!result.Complete)
                    {
                        this.complete = false;
                    }
                }
            }

            if (this.complete)
            {
                AnalysisValueOptions valueOptions = this.ProcessingResultColumn.ResultColumn.ValueOptions;
                if (objectCount > 0)
                {
                    if (valueOptions.IsStatic && this.objectValues.Count > 1)
                    {
                        this.objectValues = new List <object> {
                            this.objectValues[0]
                        };
                    }

                    if (valueOptions.IsText)
                    {
                        foreach (AnalysisValueIntermediateResult result in this.objectValues)
                        {
                            this.AddStringValue(result.TextResult);
                        }
                    }
                    else
                    {
                        foreach (AnalysisValueIntermediateResult result in this.objectValues)
                        {
                            this.AddDoubleValue(result.NumberResult);
                        }
                    }
                }

                if (xObjectCount > 0)
                {
                    if (valueOptions.IsStatic && this.xObjectValues.Count > 1)
                    {
                        var resultPerXCategory = new Dictionary <string, object>();
                        foreach (AnalysisValueIntermediateResult res in this.xObjectValues)
                        {
                            if (res.XCategoryKey == null)
                            {
                                continue;
                            }

                            resultPerXCategory.SetObjectForKey(res, res.XCategoryKey);
                        }

                        this.xObjectValues = new List <object>(resultPerXCategory.Values);
                    }

                    if (valueOptions.IsText)
                    {
                        foreach (AnalysisValueIntermediateResult result in this.xObjectValues)
                        {
                            this.AddStringValueXCategoryKey(result.TextResult, result.XCategoryKey);
                        }
                    }
                    else
                    {
                        foreach (AnalysisValueIntermediateResult result in this.xObjectValues)
                        {
                            this.AddDoubleValueXCategoryKey(result.NumberResult, result.XCategoryKey);
                        }
                    }
                }
            }

            return(this.complete);
        }
        /// <summary>
        /// Applies row x category value
        /// </summary>
        /// <param name="dataSourceRow">Data source row</param>
        /// <param name="xCategoryValueArray">X category value array</param>
        /// <param name="sumLine">Sum line</param>
        /// <returns>Boolean value for apply result</returns>
        public override bool ApplyRowXCategoryValueArraySumLine(ICrmDataSourceRow dataSourceRow, List <object> xCategoryValueArray, bool sumLine)
        {
            string significantRowIdentifierForRow = $"{this.YCategoryValue.Key}_{this.SignificantRowIdentifierForRow(dataSourceRow)}";

            if (this.significantRows == null)
            {
                this.significantRows = new Dictionary <string, object> {
                    { significantRowIdentifierForRow, 1 }
                };
            }
            else if (this.significantRows.ValueOrDefault(significantRowIdentifierForRow) != null)
            {
                return(false);
            }
            else
            {
                this.significantRows.SetObjectForKey(1, significantRowIdentifierForRow);
            }

            if (this.ValueFunction.ReturnsNumber)
            {
                double r = this.ValueFunction.NumberResultForResultRow(dataSourceRow);
                this.AddDoubleValue(r);
                foreach (AnalysisProcessingXCategoryValue xCategoryValue in xCategoryValueArray)
                {
                    this.AddDoubleValueXCategoryKey(r, xCategoryValue.Key);
                }
            }
            else if (this.ValueFunction.ReturnsObject)
            {
                AnalysisProcessingQueryResultRowExecutionContext rowExecutionContext = new AnalysisProcessingQueryResultRowExecutionContext(dataSourceRow, this.YCategoryValue, null, this.ProcessingResultColumn.ProcessingContext);
                AnalysisValueIntermediateResult objectResult = this.ValueFunction.ResultForQueryRowVariableContext(rowExecutionContext, sumLine ? this.SumExecutionContext : this.ExecutionContext);
                if (objectResult != null)
                {
                    if (objectResult.Complete)
                    {
                        if (this.ResultColumn.ValueOptions.IsText)
                        {
                            this.AddStringValue(objectResult.TextResult);
                        }
                        else
                        {
                            this.AddDoubleValue(objectResult.NumberResult);
                        }
                    }
                    else
                    {
                        if (this.objectValues == null)
                        {
                            this.objectValues = new List <object> {
                                objectResult
                            };
                        }
                        else
                        {
                            this.objectValues.Add(objectResult);
                        }

                        this.complete = false;
                    }
                }

                foreach (AnalysisProcessingXCategoryValue xCategoryValue in xCategoryValueArray)
                {
                    rowExecutionContext = new AnalysisProcessingQueryResultRowExecutionContext(dataSourceRow, this.YCategoryValue, xCategoryValue, this.ProcessingResultColumn.ProcessingContext);
                    AnalysisValueIntermediateResult xObjectResult = this.ValueFunction.ResultForQueryRowVariableContext(rowExecutionContext, sumLine ? this.SumXExecutionContext : this.XExecutionContext);
                    if (xObjectResult != null)
                    {
                        if (xObjectResult.Complete)
                        {
                            if (this.ResultColumn.ValueOptions.IsText)
                            {
                                this.AddStringValueXCategoryKey(xObjectResult.TextResult, xCategoryValue.Key);
                            }
                            else
                            {
                                this.AddDoubleValueXCategoryKey(xObjectResult.NumberResult, xCategoryValue.Key);
                            }
                        }
                        else
                        {
                            if (this.xObjectValues == null)
                            {
                                this.xObjectValues = new List <object> {
                                    xObjectResult
                                };
                            }
                            else
                            {
                                this.xObjectValues.Add(xObjectResult);
                            }

                            this.complete = false;
                        }

                        return(objectResult.Complete && xObjectResult.Complete);
                    }
                }

                return(objectResult.Complete);
            }
            else if (this.ValueFunction.ReturnsText)
            {
                string stringValue = this.ValueFunction.TextResultForResultRow(dataSourceRow);
                this.AddStringValue(stringValue);
                foreach (AnalysisProcessingXCategoryValue xCategoryValue in xCategoryValueArray)
                {
                    this.AddStringValueXCategoryKey(stringValue, xCategoryValue.Key);
                }
            }

            return(true);
        }
 /// <summary>
 /// Result for argument row variable context
 /// </summary>
 /// <param name="result">Result row</param>
 /// <param name="row">Row</param>
 /// <param name="valueExecutionContext">Value.AnalysisValueFunction execution context</param>
 /// <returns>Returns analysis value intermediate result</returns>
 public AnalysisValueIntermediateResult ResultForArgumentRowVariableContext(AnalysisValueIntermediateResult result, AnalysisProcessingQueryResultRowExecutionContext row, AnalysisProcessingValueExecutionContext valueExecutionContext)
 {
     return(this.AnalysisFunction.ResultWithArgumentRowContextValueContext(result.JavascriptResult, row, valueExecutionContext));
 }