Пример #1
0
        public static MeasuresContainer CreateFromDatabase(Database database)
        {
            if (database == null)
            {
                throw new ArgumentNullException(nameof(database));
            }
            if (database.Model == null)
            {
                throw new ArgumentNullException(nameof(database.Model));
            }

            var measures = new List <DaxMeasure>();

            foreach (var table in database.Model.Tables)
            {
                foreach (var tableMeasure in table.Measures)
                {
                    var measure    = ToSystemEnding(tableMeasure);
                    var newMeasure = new DaxMeasure(measure.Name, table.Name, measure.Expression);
                    newMeasure.CalcProperty = DaxCalcProperty.CreateFromJsonMeasure(measure);

                    measures.Add(newMeasure);
                }
            }

            return(new MeasuresContainer(measures));
        }
        /// <summary>
        /// Checks by the measure, whether it is a supporting or not.
        /// Used for KPI implementation of XML bim files.
        /// </summary>
        /// <param name="measure">The measure</param>
        /// <exception cref="ArgumentNullException">If measure is null</exception>
        /// <returns>true if measure is a supporting</returns>
        public static bool IsSupportingMeasure(DaxMeasure measure)
        {
            if (measure == null)
            {
                throw new ArgumentNullException(nameof(measure));
            }

            return(IsSupportingMeasure(measure.Name));
        }
        /// <summary>
        /// Saves DAX file to Measures section of BIM file
        /// </summary>
        internal static void SaveMeasuresToBimFile(string daxFilePath)
        {
            string daxFileContent = File.ReadAllText(daxFilePath);
            string customScript   = null;

            //TL: If DAX file includes custom MDX script, remove it to avoid interference with parser
            if (daxFileContent.Contains(BeginCustomScript))
            {
                // read custom script
                customScript = daxFileContent.Substring(daxFileContent.IndexOf(BeginCustomScript, StringComparison.InvariantCultureIgnoreCase), daxFileContent.IndexOf(EndCustomScript, EndCustomScript.Length, StringComparison.InvariantCultureIgnoreCase) + EndCustomScript.Length);
                // remove custom script
                daxFileContent = daxFileContent.Replace(customScript, String.Empty);
            }

            var    mc          = MeasuresContainer.ParseDaxScript(daxFileContent);
            string bimFilePath = ConvertDaxPathToBimPath(daxFilePath);

            if (!File.Exists(bimFilePath))
            {
                throw new FileNotFoundException(string.Format("Model file {0} doesn't exist", bimFilePath));
            }
            if (new FileInfo(bimFilePath).IsReadOnly)
            {
                throw new InvalidOperationException(string.Format("Model file {0} is read only", bimFilePath));
            }

            // TL -- injecting custom MDX script verbatum to the bim file
            if (!string.IsNullOrEmpty(customScript))
            {
                // insert customScript as first measure so it gets serialized first
                DaxMeasure m = new DaxMeasure();
                m.Name     = "CustomMDXScript";
                m.FullText = customScript;
                mc.Measures.Insert(0, m);
            }

            string bimScript     = System.IO.File.ReadAllText(bimFilePath);
            var    updatedScript = mc.UpdateMeasures(bimScript);

            File.WriteAllText(bimFilePath, updatedScript);
        }
Пример #4
0
        /// <summary>
        /// Parses measures from the mdx script text.  If there is an error during parsing an exception is thrown.
        /// </summary>
        /// <param name="daxScript">mdx script text</param>
        /// <returns>Enumerable dax measures</returns>
        public static MeasuresContainer ParseDaxScript(string daxScript)
        {
            var handler = new Babel.Parser.ErrorHandler();
            var scanner = new Babel.Lexer.Scanner();
            var parser  = new Babel.Parser.Parser(); // use noarg constructor

            parser.scanner  = scanner;
            scanner.Handler = handler;
            parser.SetHandler(handler);
            scanner.SetSourceText(daxScript);

            var request = new ParseRequest(true);

            request.Sink = new AuthoringSink(ParseReason.None, 0, 0, Babel.Parser.Parser.MaxErrors);
            parser.MBWInit(request);
            var parseResult = parser.Parse();

            if (handler.Errors)
            {
                throw DaxParsingException.FromHandler(handler, daxScript);
            }

            //Add support measures if measure contains KPIs
            var measures                = parser.AllMeasures;
            var supportMeasures         = new List <DaxMeasure>();
            var containsSupportMeasures = measures.GetSupportingMeasures().Count() != 0;

            if (!containsSupportMeasures)
            {
                foreach (var measure in measures)
                {
                    if (measure.CalcProperty?.KPI == null)
                    {
                        continue;
                    }

                    if (!string.IsNullOrWhiteSpace(measure.CalcProperty.KPI.TargetExpression))
                    {
                        var newMeasure = new DaxMeasure(
                            "_" + measure.Name + " Goal",
                            measure.TableName,
                            measure.CalcProperty.KPI.TargetExpression
                            );
                        supportMeasures.Add(newMeasure);
                    }

                    if (!string.IsNullOrWhiteSpace(measure.CalcProperty.KPI.StatusExpression))
                    {
                        var newMeasure = new DaxMeasure(
                            "_" + measure.Name + " Status",
                            measure.TableName,
                            measure.CalcProperty.KPI.StatusExpression
                            );
                        supportMeasures.Add(newMeasure);
                    }

                    if (!string.IsNullOrWhiteSpace(measure.CalcProperty.KPI.TrendExpression))
                    {
                        var newMeasure = new DaxMeasure(
                            "_" + measure.Name + " Trend",
                            measure.TableName,
                            measure.CalcProperty.KPI.TrendExpression
                            );
                        supportMeasures.Add(newMeasure);
                    }
                }
            }

            return(new MeasuresContainer(measures.Union(supportMeasures).ToList()));
        }