###################################################################
#           Copyright (c) 2016 by TAOS Technologies, Inc.
#                     All rights reserved.
#
#  This file is proprietary and confidential to TAOS Technologies.
#  No part of this file may be reproduced, stored, transmitted,
#  disclosed or used in any form or by any means other than as
#  expressly provided by the written permission from Jianhui Tao
#
###################################################################

# -*- coding: utf-8 -*-

import sys
import taos
from util.log import *
from util.cases import *
from util.sql import *


class TDTestCase:
    def init(self, conn, logSql):
        tdLog.debug("start to execute %s" % __file__)
        tdSql.init(conn.cursor())
    
        self.powers = [7, 15, 31, 63]
        self.types = ["tinyint", "smallint", "int", "bigint"]
        self.rowNum = 10
        self.ts = 1537146000000       
        
    def run(self):
        tdSql.prepare()

        for i in range(len(self.powers)):
            curType = self.types[i]
            print("======= Verify filter for %s type =========" % (curType))
            tdLog.debug(
                "create table st%s(ts timestamp, num %s) tags(id %s)" % (curType, curType, curType))
            tdSql.execute(
                "create table st%s(ts timestamp, num %s) tags(id %s)" % (curType, curType, curType))
            
            #create 10 tables, insert 10 rows for each table
            for j in range(self.rowNum):            
                tdSql.execute("create table st%s%d using st%s tags(%d)" % (curType, j + 1, curType, j + 1))
                for k in range(self.rowNum):                
                    tdSql.execute("insert into st%s%d values(%d, %d)" % (curType, j + 1, self.ts + k + 1, j * 10 + k + 1))
            
            tdSql.error("insert into st%s10 values(%d, %d)" % (curType, self.ts + 11, pow(2, self.powers[i])))
            tdSql.execute("insert into st%s10 values(%d, %d)" % (curType, self.ts + 12, pow(2, self.powers[i]) - 1))
            tdSql.error("insert into st%s10 values(%d, %d)" % (curType, self.ts + 13, pow(-2, self.powers[i])))
            tdSql.execute("insert into st%s10 values(%d, %d)" % (curType, self.ts + 14, pow(-2, self.powers[i]) + 1)) 

            # > for int type on column
            tdSql.query("select * from st%s where num > 50" % curType)
            tdSql.checkRows(51)

            # >= for int type on column
            tdSql.query("select * from st%s where num >= 50" % curType)
            tdSql.checkRows(52)

            # = for int type on column
            tdSql.query("select * from st%s where num = 50" % curType)
            tdSql.checkRows(1)

            # < for int type on column
            tdSql.query("select * from st%s where num < 50" % curType)
            tdSql.checkRows(50)

            # <= for int type on column
            tdSql.query("select * from st%s where num <= 50" % curType)
            tdSql.checkRows(51)

            # <> for int type on column
            tdSql.query("select * from st%s where num <> 50" % curType)
            tdSql.checkRows(101)

            # != for int type on column
            tdSql.query("select * from st%s where num != 50" % curType)
            tdSql.checkRows(101)

            # > for int type on tag
            tdSql.query("select * from st%s where id > 5" % curType)
            tdSql.checkRows(52)

            # >= for int type on tag
            tdSql.query("select * from st%s where id >= 5" % curType)
            tdSql.checkRows(62)

            # = for int type on tag
            tdSql.query("select * from st%s where id = 5" % curType)
            tdSql.checkRows(10)

            # < for int type on tag
            tdSql.query("select * from st%s where id < 5" % curType)
            tdSql.checkRows(40)

            # <= for int type on tag
            tdSql.query("select * from st%s where id <= 5" % curType)
            tdSql.checkRows(50)

            # <> for int type on tag
            tdSql.query("select * from st%s where id <> 5" % curType)
            tdSql.checkRows(92)

            # != for int type on tag
            tdSql.query("select * from st%s where id != 5" % curType)
            tdSql.checkRows(92)            

            print("======= Verify filter for %s type finished =========" % curType)
                                                   
    def stop(self):
        tdSql.close()
        tdLog.success("%s successfully executed" % __file__)


tdCases.addWindows(__file__, TDTestCase())
tdCases.addLinux(__file__, TDTestCase())
