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