示例#1
0
 def __init__(self, *args, **kwargs):
   unittest.TestCase.__init__(self, *args, **kwargs)
   self.trace  = self.loadTrace(testTrace1)
   self.trace2 = self.loadTrace(testTrace2)
   self.env    = TraceQueryLanguage.Environment({
     "t0": self.trace,
     "t1": self.trace2
   })
示例#2
0
 def testOrderBy(self):
   result = TraceQueryLanguage.query(self.env, "select event.seq, event.name from t0 order by event.name desc, event.seq")
   self.assertEqual(len(result.rows), len(self.trace.events))
   self.assertEqual(result.rows[0][0], 41998)
示例#3
0
 def testSelectMultipleTables(self):
   result = TraceQueryLanguage.query(self.env, "select distinct event.seq, event.name from t0, t1 where t0.event.duration > 1000")
   self.assertEqual(len(result.rows), 3)
示例#4
0
 def testSelectInto(self):
   result = TraceQueryLanguage.query(self.env, "select * into new_trace from t0 where event.name = 'vgDrawPath'")
   assert "new_trace" in self.env.traces
   self.assertEqual(len(self.env.traces["new_trace"].events), 3)
示例#5
0
 def testWhereClause2(self):
   result = TraceQueryLanguage.query(self.env, "select event.seq, event.name from t0 where event.name = 'vgDrawPath'")
   self.assertEqual(len(result.rows), 3)
示例#6
0
 def testWhereClause(self):
   result = TraceQueryLanguage.query(self.env, "select event.seq, event.name from t0 where event.seq > 1000")
   self.assertEqual(len(result.rows), 91)
示例#7
0
 def testBasicQuery2(self):
   result = TraceQueryLanguage.query(self.env, "select * from t0")
   self.assertEqual(len(result.rows), len(self.trace.events))
示例#8
0
 def testBasicQuery(self):
   result = TraceQueryLanguage.query(self.env, "select event.seq, event.name from t0")
   self.assertEqual(len(result.rows), len(self.trace.events))
   self.assertEqual(len(result.columns), 2)
示例#9
0
  def select(self, expression):
    """
    Choose events from one or many traces based on a condition. The condition for
    choosing the events is expressed in an SQL-like language.
    
    Here are some example queries to get you started:
    
      - SELECT event.seq, event.name FROM t0
        List all events in trace 't0'.
        
      - SELECT event.seq, event.name FROM t0 WHERE event.duration > 10000
        List all events that took more than 10 milliseconds.

      - SELECT event.seq, event.name FROM t0 WHERE event.name = "glDrawElements"
        List all glDrawElements events.

      - SELECT event.seq, event.duration, event.name FROM t0 ORDER BY event.duration DESC LIMIT 10
        List the ten longest running events.

      - SELECT event.seq, event.name FROM t0 ORDER BY event.duration
        List all events that took more than 10 milliseconds.

      - SELECT * FROM t0
        List all possible attribute values for all events in trace 't0'.

      - SELECT * INTO t1 FROM t0 WHERE event.seq > 1000 AND event.seq < 2000
        Copy a 1000 events from trace 't0' into trace 't1'.

      - SELECT event.seq, event.name FROM t0, t1 WHERE t0.event.seq=t1.event.seq
        List corresponding events from traces 't0' and 't1'.

      - SELECT DISTINCT event.name FROM t0 WHERE event.values.path
        List all functions that have a path parameter.

    @param expression:   A trace query language expression
    """
    
    # Prepare the environment for the query
    env = TraceQueryLanguage.Environment(dict(self.analyzer.traces.items()))
    
    # Perform the query
    try:
      result = TraceQueryLanguage.query(env, "select " + expression)
      
      # Copy any new created traces over to the analyzer
      newTraces = []
      for traceName, trace in env.traces.items():
        if not traceName in self.analyzer.traces:
          self.analyzer.traces[traceName] = trace
          newTraces.append(traceName)

      resultDesc = "%d %s selected"% (len(result.rows), len(result.rows) > 1 and "events" or "event")

      if not newTraces:
        self.analyzer.reportInfo(str(result))
      else:
        resultDesc += " into " + ", ".join(newTraces)

      self.analyzer.reportInfo(resultDesc + ".")

    except TraceQueryLanguage.QueryException, e:
      self.analyzer.reportError(e)