class CityStatDatabase(Database):
    '''CityStatDatabase类用来处理城市统计数据库

    '''
    def __init__(self):
        Database.__init__(self)
        self.connect('regionDB','CityStatistics')
        self.ad = AdminData()

    def find(self,conds,is_to_standard_form=True):
        '''查询城市统计年鉴的区域数据

        :param dict conds: 查询条件
        :param bool is_to_standard_form: 标示参数,表示是否输出为标准格式
        :return: 城市统计年鉴的区域数据
        :rtype: list
        '''
        projection = conds.get('projection')
        if projection is None:
            projection = {'region':1,'year':1,'value':1,'acode':1,'_id':0,'variable':1,'scale':1}
        else:
            conds.pop('projection')
        # 设置sorts
        sorts = conds.get('sorts')
        if sorts is None:
            sorts= [('year',ASCENDING),('acode',ASCENDING)]
        else:
            conds.pop('sorts')

        # 设置时间
        period = conds.get('year')
        if period is None:
            variables = conds.get('variable',self.variables)
            period = self.period(variables)
        else:
            conds.pop('year')

        result = []
        conditions = dict()
        for key in conds:
            if re.match('region',key) is not None:
                continue
            if isinstance(conds[key],list):
                conditions[key] = {'$in':conds[key]}
            else:
                conditions[key] = conds[key]

        # 重点是设置区域
        if 'region' in conds:
            for year in period:
                conditions['year'] = year
                self.ad.set_year(year)
                conditions['acode'] = {'$in':[region['acode'] for item in conds['region'] for region in self.ad[tuple(item)]]}
                result.extend(list(self.collection.find(conditions,projection).sort(sorts)))
            result_found = pd.DataFrame(result)
        else:
            if isinstance(period,list):
                conditions['year'] = {'$in':period}
            else:
                conditions['year'] = period
            result_found = pd.DataFrame(list(self.collection.find(conditions,projection).sort(sorts)))

        result = result_found.drop_duplicates(take_last=True)

        if is_to_standard_form:
            return RegionFormat(result).transform()
        else:
            return result

    @property
    def variables(self):
        return self.collection.find().distinct('variable')

    def period(self,variable):
        '''获得变量的所有时期

        :param str,list variable: 变量
        :return: 变量的年份
        :rtype: list
        '''
        if isinstance(variable,str):
            posts = self.collection.find({'variable':variable}).distinct('year')
        else:
            posts = set()
            for var in variable:
                periods = self.collection.find({'variable':var}).distinct('year')
                posts.update(periods)
            posts = list(posts)
        return sorted(posts)