Ejemplo n.º 1
0
        public void ParseMultipleDaxQueries()
        {
            var text = @"EVALUATE t1 EVALUATE t2";

            Babel.Parser.Parser parser = ParseText(text);
            // Expect NOT to fail on parsing
        }
Ejemplo n.º 2
0
        public void ParseQueryWithOrderBy()
        {
            Babel.Parser.Parser parser = ParseText(@"DEFINE 
	MEASURE Table1[PercentProfit]=SUMX(Table1,[SalesAmount] - [TotalProductCost]) 
	MEASURE DimProductSubCategory[CountProducts]=COUNTROWS(DimProduct) 
EVALUATE
	ADDCOLUMNS(
		FILTER(
			CROSSJOIN(
				VALUES(DimDate[CalendarYear]),
				VALUES(DimProductSubCategory[EnglishProductSubCategoryName])
			),
			NOT(ISBLANK(DimDate[CalendarYear])) &&  
			NOT(ISBLANK(DimProductSubCategory[EnglishProductSubCategoryName])) && 
			(
				NOT(ISBLANK(CALCULATE(SUM(Table1[SalesAmount])))) ||
				NOT(ISBLANK(Table1[PercentProfit])) ||
				NOT(ISBLANK(DimProductSubCategory[CountProducts]))
			)
		),
		""Amount"", CALCULATE(SUM(Table1[SalesAmount])),
		""PercentProfit"", Table1[PercentProfit],
		""CountProducts"", DimProductSubCategory[CountProducts]
	)	
ORDER BY 
	DimDate[CalendarYear] DESC,
	DimProductSubCategory[EnglishProductSubCategoryName] ASC
");
            Assert.IsNotNull(parser);
        }
Ejemplo n.º 3
0
        public BlenXAuthoringScope(Babel.Parser.Parser parser, Babel.Source source)
        {
            this.parser = parser;
             this.source = source;

             // how should this be set?
             this.resolver = new Babel.Resolver();
        }
Ejemplo n.º 4
0
        public void CalculateShortcut()
        {
            var text = @" CREATE MEASURE 't3'[shortcut]=[M1](All(T)) + 't'[m 2](All(T2))";

            Babel.Parser.Parser parser = ParseText(text);
            Assert.AreEqual(1, parser.Measures.Count);
            var measure1 = parser.Measures.First();

            Assert.AreEqual("t3", measure1.TableName);
            Assert.AreEqual("shortcut", measure1.Name);
        }
Ejemplo n.º 5
0
        public void YearDayMonth()
        {
            var text = @" CREATE MEASURE 'TRANSACTIONS'[ThisYear]=Date(Year(Now()), Month(Now()), Day(Now()))";

            Babel.Parser.Parser parser = ParseText(text);
            Assert.AreEqual(1, parser.Measures.Count);
            var measure1 = parser.Measures.First();

            Assert.AreEqual("TRANSACTIONS", measure1.TableName);
            Assert.AreEqual("ThisYear", measure1.Name);
        }
Ejemplo n.º 6
0
        public void ParseTableNameTime()
        {
            Babel.Parser.Parser parser = ParseText("CREATE MEASURE 'Table1'[Hourly Avg CallCount]=AVERAGEX(CROSSJOIN(VALUES('Date'[DateID]), VALUES(Time[Hour])), [Count]);");

            Assert.AreEqual(1, parser.Measures.Count);
            var measure = parser.Measures.First();

            Assert.AreEqual("Table1", measure.TableName);
            Assert.AreEqual("Hourly Avg CallCount", measure.Name);
            Assert.AreEqual("AVERAGEX(CROSSJOIN(VALUES('Date'[DateID]), VALUES(Time[Hour])), [Count])", measure.Expression);
            Assert.AreEqual("CREATE MEASURE 'Table1'[Hourly Avg CallCount]=AVERAGEX(CROSSJOIN(VALUES('Date'[DateID]), VALUES(Time[Hour])), [Count])", measure.FullText);
        }
Ejemplo n.º 7
0
        public void ParseSimpleMeasure()
        {
            Babel.Parser.Parser parser = ParseText("CREATE MEASURE t[B]=Now()");

            Assert.AreEqual(1, parser.Measures.Count);
            var measure = parser.Measures.First();

            Assert.AreEqual("t", measure.TableName);
            Assert.AreEqual("B", measure.Name);
            Assert.AreEqual("Now()", measure.Expression);
            Assert.AreEqual("CREATE MEASURE t[B]=Now()", measure.FullText);
        }
Ejemplo n.º 8
0
        public void ParseTrueFalse()
        {
            Babel.Parser.Parser parser = ParseText("CREATE MEASURE t[B]=TRUE() && TRUE || FALSE || FALSE()");

            Assert.AreEqual(1, parser.Measures.Count);
            var measure = parser.Measures.First();

            Assert.AreEqual("t", measure.TableName);
            Assert.AreEqual("B", measure.Name);
            Assert.AreEqual("TRUE() && TRUE || FALSE || FALSE()", measure.Expression);
            Assert.AreEqual("CREATE MEASURE t[B]=TRUE() && TRUE || FALSE || FALSE()", measure.FullText);
        }
Ejemplo n.º 9
0
 public void ParseFunctionWithoutParameterAfterComma()
 {
     try
     {
         var text = @"EVALUATE ROW(""a"", Calculate([m], ))";
         Babel.Parser.Parser parser = ParseText(text);
         Assert.Fail("Exception expected");
     }
     catch (Exception e)
     {
         StringAssert.Contains("syntax error", e.Message);
     }
 }
Ejemplo n.º 10
0
        public void ParseMeasureCalcPropertyWrongFormatType()
        {
            var text = @"CREATE MEASURE 'Table1'[C]=1 CALCULATION PROPERTY WrongFormatType";

            try
            {
                Babel.Parser.Parser parser = ParseText(text);
                Assert.Fail("Exception expected");
            }
            catch (Exception e)
            {
                StringAssert.Contains("Wrong calculation property type", e.Message);
            }
        }
Ejemplo n.º 11
0
        public void ParseQueryWithTrue()
        {
            Babel.Parser.Parser parser = ParseText(@"
DEFINE MEASURE Table1[M1] = CountRows ( Table1 )
EVALUATE CalculateTable (
   ADDCOLUMNS (
      FILTER(ALL(Table3),MOD([M1],2) = 1),
	  ""X"",
	  CALCULATE(CALCULATE([M1],AllSelected(Table3)))
   )
   , Table5[BOOL] = TRUE
   , Table3[IntMeasure] > 0
   , Table3[PK] > 4
)
");
            Assert.IsNotNull(parser);
        }
Ejemplo n.º 12
0
        public void ParseDifficultDataTable()
        {
            var text = @" = 
                DATATABLE (
                    ""Quarter"", STRING,
                    ""StartDate"", DATETIME,
                    ""EndDate"", DATETIME,
                    {
                        { ""Q1"", BLANK(), ""2015-03-31"" },
                        { ""Q2"", ""2015-04-01"", DATE(2009,4,15)+TIME(2,45,21) },
                        { ""Q3"",, ""2015-09-30"" },
                        { ""Q4"", ""2015-010-01"", ""2015-12-31"" }
                    }
                )";

            Babel.Parser.Parser parser = ParseText(text);
        }
Ejemplo n.º 13
0
        public void ParseMeasureWithCalcProperty1()
        {
            var text = @"CREATE MEASURE 'Table1'[C]=1 CALCULATION PROPERTY NumberDecimal Accuracy=5 ThousandSeparator=True Format='#,0.00000'";

            Babel.Parser.Parser parser = ParseText(text);

            Assert.AreEqual(1, parser.Measures.Count);
            var measure1 = parser.Measures.First();

            Assert.AreEqual("Table1", measure1.TableName);
            Assert.AreEqual("C", measure1.Name);
            Assert.AreEqual("1", measure1.Expression);
            Assert.AreEqual("CREATE MEASURE 'Table1'[C]=1", measure1.FullText);
            Assert.IsNotNull(measure1.CalcProperty);
            Assert.AreEqual(DaxCalcProperty.FormatType.NumberDecimal, measure1.CalcProperty.Format);
            Assert.IsTrue(measure1.CalcProperty.Accuracy.HasValue);
            Assert.AreEqual(5, measure1.CalcProperty.Accuracy.Value);
        }
Ejemplo n.º 14
0
        public void ParseSimpleVarExpression2()
        {
            var text = @"=
                CALCULATETABLE (
                    ADDCOLUMNS (
                        VAR
                            OnePercentOfSales = [SalesAmount] * 0.01
                        RETURN
                            FILTER (
                                VALUES ( Product[Product Name] ),
                                [SalesAmount] >= OnePercentOfSales
                            ),
                        ""SalesOfProduct"", [SalesAmount]
                    ),
                    Product[Color] = ""Black""
                )";

            Babel.Parser.Parser parser = ParseText(text);
        }
Ejemplo n.º 15
0
        public void ParseSimpleVarExpression()
        {
            var text = @"=
                VAR
                    CurrentSales = SUM ( Sales[Quantity] )
                VAR
                    SalesLastYear = CALCULATE (
                        SUM ( Sales[Quantity] ),
                        SAMEPERIODLASTYEAR ( 'Date'[Date] )
                    )
                RETURN
                    IF (
                        AND ( CurrentSales <> 0, SalesLastYear <> 0 ),
                        DIVIDE (
                            CurrentSales - SalesLastYear,
                            SalesLastYear
                        )
                    )";

            Babel.Parser.Parser parser = ParseText(text);
        }
Ejemplo n.º 16
0
        private static Babel.Parser.Parser ParseText(string text, bool trace = false)
        {
            Babel.Parser.ErrorHandler handler = new Babel.Parser.ErrorHandler();
            Babel.Lexer.Scanner       scanner = new Babel.Lexer.Scanner();
            Babel.Parser.Parser       parser  = new Babel.Parser.Parser(); // use noarg constructor
            parser.Trace    = trace;
            parser.scanner  = scanner;
            scanner.Handler = handler;
            parser.SetHandler(handler);
            scanner.SetSourceText(text);

            var request = new ParseRequest(true);

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

            if (handler.Errors)
            {
                throw new Exception(handler.ToString());
            }
            return(parser);
        }
Ejemplo n.º 17
0
        public void SeveralMeasures()
        {
            var text = @"CALCULATE; 
CREATE MEMBER CURRENTCUBE.Measures.[__XL_Count of Models] AS 1, VISIBLE = 0; 
ALTER CUBE CURRENTCUBE UPDATE DIMENSION Measures, Default_Member = [__XL_Count of Models]; 
----------------------------------------------------------
-- PowerPivot measures command (do not modify manually) --
----------------------------------------------------------


CREATE MEASURE Table1[Measure 1]=1;

----------------------------------------------------------
-- PowerPivot measures command (do not modify manually) --
----------------------------------------------------------


CREATE MEASURE 'Table1'[MeasureCountRows]=COUNTROWS(Table1);

";

            Babel.Parser.Parser parser = ParseText(text);

            Assert.AreEqual(2, parser.Measures.Count);
            var measure1 = parser.Measures.First();

            Assert.AreEqual("Table1", measure1.TableName);
            Assert.AreEqual("Measure 1", measure1.Name);
            Assert.AreEqual("1", measure1.Expression);
            Assert.AreEqual("CREATE MEASURE Table1[Measure 1]=1", measure1.FullText);
            var measure2 = parser.Measures.Skip(1).First();

            Assert.AreEqual("Table1", measure2.TableName);
            Assert.AreEqual("MeasureCountRows", measure2.Name);
            Assert.AreEqual("COUNTROWS(Table1)", measure2.Expression);
            Assert.AreEqual("CREATE MEASURE 'Table1'[MeasureCountRows]=COUNTROWS(Table1)", measure2.FullText);
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Main function of the parsing thread.
        /// This function waits on the queue of the parsing requests and build the parsing tree for
        /// a specific file. The resulting tree is built using LibraryNode objects so that it can
        /// be used inside the class view or object browser.
        /// </summary>
        private void ParseThread()
        {
            const int waitTimeout = 500;
             // Define the array of events this function is interest in.
             WaitHandle[] eventsToWait = new WaitHandle[] { requestPresent, shutDownStarted };
             // Execute the tasks.
             while (true)
             {
            // Wait for a task or a shutdown request.
            int waitResult = WaitHandle.WaitAny(eventsToWait, waitTimeout, false);
            if (1 == waitResult)
            {
               // The shutdown of this component is started, so exit the thread.
               return;
            }
            LibraryTask task = null;
            lock (requests)
            {
               if (0 != requests.Count)
               {
                  task = requests.Dequeue();
               }
               if (0 == requests.Count)
               {
                  requestPresent.Reset();
               }
            }
            if (task == null)
            {
               continue;
            }

            if (task.Text == null)
            {
               if (System.IO.File.Exists(task.FileName))
               {
                  var parser = new Babel.Parser.Parser();
                  handler.Clear();

                  using (var stream = File.OpenRead(task.FileName))
                  {
                     Babel.Lexer.Scanner scanner = new Babel.Lexer.Scanner(stream);

                     handler.SetFileName(task.FileName);

                     scanner.Handler = handler;
                     Debug.Assert(symbolTable != null);
                     parser.SetParsingInfo(task.FileName, symbolTable, handler);
                     parser.scanner = scanner;

                     //parser.MBWInit(req);
                     var retval = parser.Parse();
                     // the parse result is to fill the symbol table

                  }
               }
            }
            else
            {
               var parser = new Babel.Parser.Parser();
               handler.Clear();

               Babel.Lexer.Scanner scanner = new Babel.Lexer.Scanner(); // string interface

               handler.SetFileName(task.FileName);

               scanner.Handler = handler;
               Debug.Assert(symbolTable != null);
               parser.SetParsingInfo(task.Text, symbolTable, handler);
               parser.scanner = scanner;

               scanner.SetSource(task.Text, 0);

               //parser.MBWInit(req);
               parser.Parse();
            }
            //LibraryNode module = new LibraryNode(
            //        System.IO.Path.GetFileName(task.FileName),
            //        LibraryNode.LibraryNodeType.PhysicalContainer);
            //CreateModuleTree(module, module, scope, "", task.ModuleID);
            //if (null != task.ModuleID)
            //{
            //    LibraryNode previousItem = null;
            //    lock (files)
            //    {
            //        if (files.TryGetValue(task.ModuleID, out previousItem))
            //        {
            //            files.Remove(task.ModuleID);
            //        }
            //    }
            //    library.RemoveNode(previousItem);
            //}
            //library.AddNode(module);
            //if (null != task.ModuleID)
            //{
            //    lock (files)
            //    {
            //        files.Add(task.ModuleID, module);
            //    }
            //}
             }
        }
Ejemplo n.º 19
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()));
        }
Ejemplo n.º 20
0
        public void ParseNumberThatStartsWithDot()
        {
            var text = @"EVALUATE ROW(""a"", .1)";

            Babel.Parser.Parser parser = ParseText(text);
        }