Exemplo n.º 1
0
        public void Where_Parallel()
        {
            XDatabaseContext historicalContext = new XDatabaseContext(SampleDatabase.XDatabaseContext)
            {
                RequestedAsOfDateTime = new DateTime(2017, 12, 04, 00, 00, 00, DateTimeKind.Utc)
            };

            Assert.AreEqual(3000, historicalContext.Query("readRange \"3d\" WebRequest\r\nwhere [ID] != \"\"").Count());
            Assert.AreEqual(732, historicalContext.Query("readRange \"3d\" WebRequest\r\nwhere Cast([IsPremiumUser], Boolean) = \"\"").Count());
        }
Exemplo n.º 2
0
        public void XqlParser_QueryEvaluation()
        {
            XDatabaseContext context = SampleDatabase.XDatabaseContext;
            IXTable          source  = context.Query(@"
                read WebRequest
                cast [ServerPort], Int32
                cast [ResponseBytes], Int32, None, 0, InvalidOrNull
                ");

            // Results from WebRequest.20171202.r5.n1000, counts validated against Excel

            // Single Term
            Assert.AreEqual(423, RunAndCount("where [ServerPort] = 80", source, context));

            // OR
            Assert.AreEqual(1000, RunAndCount("where [ServerPort] = 80 OR [ServerPort] = 443", source, context));

            // AND
            Assert.AreEqual(278, RunAndCount("where [ServerPort] = 80 AND [ResponseBytes] > 1000", source, context));

            // Precedence: Counts are correct for precedence; default is 'AND' terms evaluate together first
            Assert.AreEqual(55, RunAndCount("where [ServerPort] = 80 AND ([ResponseBytes] > 1200 OR [ResponseBytes] < 900)", source, context));
            Assert.AreEqual(22 + 95, RunAndCount("where ([ServerPort] = 80 AND [ResponseBytes] > 1200) OR [ResponseBytes] < 900", source, context));
            Assert.AreEqual(22 + 95, RunAndCount("where [ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900", source, context));
        }
Exemplo n.º 3
0
        public void XqlParser_QueryParsing()
        {
            XDatabaseContext context = SampleDatabase.XDatabaseContext;
            IXTable          source  = context.Query(@"read WebRequest.Typed");

            // Single Term
            Assert.AreEqual("[ServerPort] = 80", ParseExpression("[ServerPort] = 80", source, context).ToString());

            // Column to Column
            Assert.AreEqual("[ServerPort] < [RequestBytes]", ParseExpression("[ServerPort] < [RequestBytes]", source, context).ToString());

            // Column to Function(Constant)
            Assert.AreEqual("[ServerName] = ToUpper(\"ws-front-4\")", ParseExpression("[ServerName] = ToUpper(\"ws-front-4\")", source, context).ToString());

            // Column to Function(Column)
            Assert.AreEqual("[ServerName] = ToUpper([ServerName])", ParseExpression("[ServerName] = ToUpper([ServerName])", source, context).ToString());

            // Compare to null and empty
            Assert.AreEqual("[ServerName] = \"\"", ParseExpression("[ServerName] = \"\"", source, context).ToString());
            Assert.AreEqual("[ServerName] = null", ParseExpression("[ServerName] = null", source, context).ToString());

            // Multiple Clauses, explicit AND
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 900", ParseExpression("[ServerPort] = 80 AND [ResponseBytes] > 900", source, context).ToString());

            // Multiple Clauses, implicit AND
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 900", ParseExpression("[ServerPort] = 80 [ResponseBytes] > 900", source, context).ToString());

            // AND and OR with no parens, AND is tighter, parens omitted on ToString
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900", ParseExpression("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900", source, context).ToString());

            // AND and OR with AND parens, AND is tighter, parens omitted because same as default precedence
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900", ParseExpression("([ServerPort] = 80 AND [ResponseBytes] > 1200) OR [ResponseBytes] < 900", source, context).ToString());

            // AND and OR with OR parens, parens on output to maintain evaluation order
            Assert.AreEqual("[ServerPort] = 80 AND ([ResponseBytes] > 1200 OR [ResponseBytes] < 900)", ParseExpression("[ServerPort] = 80 AND ([ResponseBytes] > 1200 OR [ResponseBytes] < 900)", source, context).ToString());

            // AND after OR [OrExpression parsing falls out correctly]
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900 AND [ServerPort] != 443", ParseExpression("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR [ResponseBytes] < 900 AND [ServerPort] != 443", source, context).ToString());

            // NOT
            Assert.AreEqual("NOT([ServerPort] = 80)", ParseExpression("NOT([ServerPort] = 80)", source, context).ToString());

            // Operators are case insensitive
            Assert.AreEqual("[ServerPort] = 80 AND [ResponseBytes] > 1200 OR NOT([ResponseBytes] < 900)", ParseExpression("[ServerPort] = 80 aNd [ResponseBytes] > 1200 oR nOT [ResponseBytes] < 900", source, context).ToString());

            // Unclosed quotes shouldn't parse across lines
            Assert.AreEqual("[ServerName] != \"8\"", ParseExpression("[ServerName] != \"8\r\nschema", source, context).ToString());
            Assert.AreEqual("[ServerName] != \"\"", ParseExpression("[ServerName] != \"\nschema", source, context).ToString());
            Assert.AreEqual("[ServerName] != \"   \"", ParseExpression("[ServerName] != \"   \nschema", source, context).ToString());

            // Constant = Constant rule
            Verify.Exception <ArgumentException>(() => ParseExpression("80 = 80", source, context));

            // String = Quoted Only Constant rule
            Verify.Exception <ArgumentException>(() => ParseExpression("[ServerName] = 80", source, context));
            Assert.AreEqual("[ServerName] = \"80\"", ParseExpression("[ServerName] = \"80\"", source, context).ToString());
        }
Exemplo n.º 4
0
        public void Database_ReadRange()
        {
            SampleDatabase.EnsureBuilt();

            // Asking for 2d from 2017-12-04 should get 2017-12-03 and 2017-12-02 crawls
            XDatabaseContext historicalContext = new XDatabaseContext(SampleDatabase.XDatabaseContext)
            {
                RequestedAsOfDateTime = new DateTime(2017, 12, 04, 00, 00, 00, DateTimeKind.Utc)
            };

            Assert.AreEqual(2000, historicalContext.Query("readRange 2d WebRequest").RunAndDispose());

            // Asking for 3d should get all three crawls
            Assert.AreEqual(3000, historicalContext.Query("readRange 3d WebRequest").RunAndDispose());

            // Asking for 4d should error (no version for the range start)
            Verify.Exception <UsageException>(() => historicalContext.Query("readRange 4d WebRequest").RunAndDispose());
        }
Exemplo n.º 5
0
        public void Database_ReadRange()
        {
            SampleDatabase.EnsureBuilt();

            // Asking for 2d from 2017-12-04 should get 2017-12-03 and 2017-12-02 crawls
            XDatabaseContext historicalContext = new XDatabaseContext(SampleDatabase.XDatabaseContext)
            {
                RequestedAsOfDateTime = new DateTime(2017, 12, 04, 00, 00, 00, DateTimeKind.Utc)
            };

            Assert.AreEqual(2000, historicalContext.Query("readRange 2d WebRequest").Count());

            // Asking for 3d should get all three crawls
            Assert.AreEqual(3000, historicalContext.Query("readRange 3d WebRequest").Count());

            // Asking for 4d should get all three crawls (allowed to ask for beyond first version)
            Assert.AreEqual(3000, historicalContext.Query("readRange 4d WebRequest").Count());

            // Asking for unknown table should error
            Verify.Exception <UsageException>(() => historicalContext.Query("readRange 4d WebRequester").Count());

            // Asking for negative TimeSpan should error
            Verify.Exception <UsageException>(() => historicalContext.Query("readRange -4d WebRequest").Count());
        }
Exemplo n.º 6
0
 private static int RunAndCount(string query, IXTable source, XDatabaseContext context)
 {
     source.Reset();
     return((int)context.Query(query, source).RunWithoutDispose());
 }