from __future__ import print_function
import unittest
from timeit import timeit
from pprint import pprint


class IndexTreePerfTestCase(unittest.TestCase):
    templates = """
_templates = ["dc.env.host.measurement.field*"]
templates = parse_influxdb_graphite_templates(_templates)
tags = [[u','.join(['='.join([tag, val])
                 for tag in ['host', 'dc', 'env']])
        for val in [u''.join([choice(ascii_letters)
                      for _ in range(4)])
            for _ in range(10)]]]
measurements = [u''.join([choice(ascii_letters) for _ in range(8)])
                for _ in range(200)]
all_series = [u','.join([m, t])
    for m in measurements
    for _t in tags
    for t in _t]

fields = {m: [u''.join([choice(ascii_letters) for _ in range(8)])
              for _ in range(10)]
    for m in measurements}
"""
    series = """
series = [u'.'.join([u''.join([choice(ascii_letters) for _ in range(8)])
                                     for _ in range(28)])
                          for _ in range(5, 500)]"""
    timeit_setup = """from string import ascii_letters
from random import randint, choice
from influxgraph.templates import parse_influxdb_graphite_templates
%s
%s
queries = ['.'.join(['*' for _ in range(1,10)]) for _ in range(10,20)]"""
    py_timeit_insert_stmt = """
index = Node()
split_series = [serie.split('.') for serie in series]
for split_path in split_series:
    index.insert_split_path(split_path)
    """
    py_timeit_tmpl_stmt = """
index = py_parse_series(all_series, fields, templates)
    """
    timeit_insert_stmt = """
index = parse_series(series, None, None)
    """
    timeit_tmpl_stmt = """
index = parse_series(all_series, fields, templates)
    """
    timeit_query_stmt = """
for query in queries:
    index.query(query)
    """

    def time_index(self, index_import, insert_stmt, tmpl_stmt):
        return timeit(
            stmt=insert_stmt,
            setup=self.timeit_setup % (self.series, index_import), number=10), \
            timeit(
                stmt=tmpl_stmt,
                setup="\n".join([self.timeit_setup % (self.templates, index_import)]),
                number=10), \
            timeit(stmt=self.timeit_query_stmt,
                   setup="\n".join([self.timeit_setup % (self.series, index_import),
                                    self.py_timeit_insert_stmt]),
                   number=10)

    def test_python_index(self):
        index_import = """
from influxgraph.classes.tree import NodeTreeIndex as Node
from influxgraph.utils import parse_series as py_parse_series"""
        load_time, reload_time, query_time = self.time_index(
            index_import, self.py_timeit_insert_stmt, self.py_timeit_tmpl_stmt)
        pprint("Python index load time is %s" % (load_time,))
        pprint("Python index template load time is %s" % (reload_time,))
        pprint("Python index query time is %s" % (query_time,))

    def test_c_index(self):
        c_node_import = """
from influxgraph.ext.templates import parse_series
from influxgraph.ext.nodetrie import Node"""
        load_time, reload_time, query_time = self.time_index(
            c_node_import, self.timeit_insert_stmt, self.timeit_tmpl_stmt)
        pprint("C index load time is %s" % (load_time,))
        pprint("C index template load time is %s" % (reload_time,))
        pprint("C index query time is %s" % (query_time,))