124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck# Copyright (c) 2015 The Chromium Authors. All rights reserved. 224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck# Use of this source code is governed by a BSD-style license that can be 324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck# found in the LICENSE file. 424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckimport datetime 524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckimport operator 624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckimport unittest 724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckfrom perf_insights import corpus_query 924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 10cef7893435aa41160dd1255c43cb8498279738ccChris Craik 1124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckclass FilterTests(unittest.TestCase): 12cef7893435aa41160dd1255c43cb8498279738ccChris Craik 1324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testEqNumber(self): 1424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck f = corpus_query.Filter.FromString("a = 3") 1524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 1624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertEquals(f.a.fieldName, 'a') 1724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertEquals(f.op, operator.eq) 1824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertEquals(f.b.constant, 3) 1924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 2024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'a': 4})) 2124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'a': 3})) 2224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 2324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testInTuple(self): 2424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck f = corpus_query.Filter.FromString("a IN (1, 2)") 25cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.a.fieldName, 'a') 26cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.op, corpus_query._InOp) 27cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.b.constant, (1, 2)) 2824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 2924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'a': 3})) 3024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'a': 1})) 3124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 3224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testInTupleStr(self): 3324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck f = corpus_query.Filter.FromString("a IN ('a', 'b')") 34cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.a.fieldName, 'a') 35cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.op, corpus_query._InOp) 36cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.b.constant, ('a', 'b')) 3724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 3824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'a': 'c'})) 3924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'a': 'a'})) 4024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testPropertyAndValueOrder(self): 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi with self.assertRaises(Exception): 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi corpus_query.Filter.FromString("'c' IN tags") 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi with self.assertRaises(Exception): 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi corpus_query.Filter.FromString("'test' = a") 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi with self.assertRaises(Exception): 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi corpus_query.Filter.FromString("'test' = 'test'") 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi with self.assertRaises(Exception): 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi corpus_query.Filter.FromString("a = b") 5024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 5124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testDateComparison(self): 5224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck f = corpus_query.Filter.FromString( 5324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck "date >= Date(2015-01-02 3:04:05.678)") 54cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.a.fieldName, 'date') 55cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(f.op, operator.ge) 5624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 57cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertTrue(isinstance(f.b.constant, datetime.datetime)) 5824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck at = datetime.datetime(2015, 1, 2, 3, 4, 5, 678000) 5924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertEquals(f.b.constant, at) 6024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 6124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck before = datetime.datetime(2014, 12, 1, 2, 3, 4, 0) 6224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'date': before})) 6324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 6424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck after = datetime.datetime(2015, 2, 3, 4, 5, 6, 789000) 6524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'date': at})) 6624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'date': after})) 6724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 6824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 6924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reckclass CorpusQueryTests(unittest.TestCase): 70cef7893435aa41160dd1255c43cb8498279738ccChris Craik 7124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testSimple(self): 7224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck q = corpus_query.CorpusQuery.FromString('') 7324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(q.Eval({'a': 1})) 7424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 7524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testSimpleOp(self): 7624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck q = corpus_query.CorpusQuery.FromString('a = 3') 7724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 1})) 7824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(q.Eval({'a': 3})) 7924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 8024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testMultipleFiltersOp(self): 8124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck q = corpus_query.CorpusQuery.FromString( 8224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 'a = 3 AND b = 4') 8324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 1, 'b': 1})) 8424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 3, 'b': 1})) 8524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 1, 'b': 4})) 8624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(q.Eval({'a': 3, 'b': 4})) 8724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 8824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck def testDateRange(self): 8924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck f = corpus_query.CorpusQuery.FromString( 9024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 'date >= Date(2015-01-01 00:00:00.00) AND ' + 9124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 'date < Date(2015-02-01 00:00:00.00)') 9224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 9324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck just_before_start = datetime.datetime(2014, 12, 31, 23, 59, 59, 99999) 9424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck start = datetime.datetime(2015, 1, 1, 0, 0, 0, 0) 9524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck end = datetime.datetime(2015, 2, 1, 0, 0, 0, 0) 9624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck just_before_end = datetime.datetime(2015, 1, 31, 23, 59, 59, 999999) 9724e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck middle = datetime.datetime(2015, 1, 15, 0, 0, 0, 0) 9824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck way_after = datetime.datetime(2015, 3, 1, 0, 0, 0, 0) 9924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 10024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'date': just_before_start})) 10124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'date': start})) 10224e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'date': middle})) 10324e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(f.Eval({'date': just_before_end})) 10424e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'date': end})) 10524e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(f.Eval({'date': way_after})) 10624e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck 107cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSimpleOpWithMaxTraceHandles(self): 10824e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck q = corpus_query.CorpusQuery.FromString('a = 3 AND MAX_TRACE_HANDLES=3') 10924e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertTrue(q.Eval({'a': 3}, 0)) 11024e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 3}, 3)) 11124e1a9362ca2bf7d5cf659231f70375b3761edbaJohn Reck self.assertFalse(q.Eval({'a': 3}, 4)) 1128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testSimpleQueryString(self): 1148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString('') 1158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), '') 1168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, '') 1198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args, []) 1208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testSimpleOpQueryString(self): 1228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString('a = 3') 1238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), 'a = 3') 1248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, 'WHERE a = :1') 127cef7893435aa41160dd1255c43cb8498279738ccChris Craik self.assertEquals(args[0], 3) 1288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testMultipleFiltersOpQueryString(self): 1308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString( 1318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'a = 3 AND b = 4') 1328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), 'a = 3 AND b = 4') 1338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, 'WHERE a = :1 AND b = :2') 1368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[0], 3) 1378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[1], 4) 1388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testDateRangeQueryString(self): 1408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString( 1418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'date >= Date(2015-01-01 00:00:00.00) AND ' + 1428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'date < Date(2015-02-01 00:00:00.00)') 1438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), 1448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'date >= Date(2015-01-01 00:00:00.000000) AND ' 1458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 'date < Date(2015-02-01 00:00:00.000000)') 1468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, "WHERE date >= :1 AND date < :2") 1498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[0], datetime.datetime(2015, 01, 01, 0, 0, 0)) 1508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[1], datetime.datetime(2015, 02, 01, 0, 0, 0)) 1518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 152cef7893435aa41160dd1255c43cb8498279738ccChris Craik def testSimpleOpWithMaxTraceHandlesQueryString(self): 1538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString('a = 3 AND MAX_TRACE_HANDLES=3') 1548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), 'a = 3 AND MAX_TRACE_HANDLES=3') 1558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, 'WHERE a = :1 LIMIT 3') 1588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[0], 3) 1598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testMixedTupleQueryString(self): 1618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString("a IN ('a', 'b', 3, 'c')") 1628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), "a IN ('a', 'b', 3, 'c')") 1638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, "WHERE a IN :1") 1668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args[0], ('a', 'b', 3, 'c')) 1678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def testMaxTraceHandlesQueryString(self): 1698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi q = corpus_query.CorpusQuery.FromString("MAX_TRACE_HANDLES=1") 1708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(q.AsQueryString(), "MAX_TRACE_HANDLES=1") 1718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (gql, args) = q.AsGQLWhereClause() 1738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(gql, "LIMIT 1") 1748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEquals(args, []) 175