flexget.plugins.cli.explain_sql
Covered: 29 lines
Missed: 12 lines
Skipped 18 lines
Percent: 70 %
 1
import logging
 2
from optparse import SUPPRESS_HELP
 3
from time import time
 4
from sqlalchemy.orm.query import Query
 5
from sqlalchemy.orm import sessionmaker
 6
from sqlalchemy.ext.compiler import compiles
 7
from sqlalchemy.sql.expression import Executable, ClauseElement, _literal_as_text
 8
from flexget import manager
 9
from flexget.plugin import register_parser_option
10
from flexget.event import event
12
log = logging.getLogger('explain_sql')
15
class Explain(Executable, ClauseElement):
17
    def __init__(self, stmt):
18
        self.statement = _literal_as_text(stmt)
21
@compiles(Explain)
22
def explain(element, compiler, **kw):
23
    text = 'EXPLAIN QUERY PLAN ' + compiler.process(element.statement)
24
    return text
27
class ExplainQuery(Query):
29
    def __iter__(self):
30
        log.info('Query:\n\t%s' % unicode(self).replace('\n', '\n\t'))
31
        explain = self.session.execute(Explain(self)).fetchall()
32
        text = '\n\t'.join('|'.join(str(x) for x in line) for line in explain)
33
        before = time()
34
        result = Query.__iter__(self)
35
        log.info('Query Time: %0.3f Explain Query Plan:\n\t%s' % (time() - before, text))
36
        return result
39
@event('manager.execute.started')
40
def register_sql_explain(man):
41
    if man.options.explain_sql:
42
        maininit = manager.Session.__init__
44
        def init(*args, **kwargs):
45
            kwargs['query_cls'] = ExplainQuery
46
            return maininit(*args, **kwargs)
48
        manager.Session.__init__ = init
51
@event('manager.execute.completed')
52
def deregister_sql_explain(man):
53
    if man.options.explain_sql:
54
        manager.Session = sessionmaker()
57
register_parser_option('--explain-sql', action='store_true', dest='explain_sql', default=False,
58
                       help=SUPPRESS_HELP)