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); }
/// <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())); }