Example #1
0
 def update(self, tb_id, params, update_share_version=True, is_del=False):
     if TB.VERSION in params and update_share_version:
         # 更新此表依赖的分享表的version
         share_model = Share()
         shares = share_model.get(
             {Share.TB_ID: tb_id},
             (Share.SH_ID, Share.VERSION, Share.ROW_FILTER, Share.DEP_ID))
         if shares:
             cond = (VField.FIELD_ID, VField.TITLE, VField.AGGREGATOR)
             table_vfield = VField().get(
                 {
                     VField.TB_ID: tb_id,
                     VField.FLAG: VField.TABLE_VFIELD_FLAG
                 }, cond)
             tb_info = self.get_one({TB.TB_ID: tb_id}, (TB.STORAGE_ID, ))
             storage_id = tb_info[TB.STORAGE_ID]
             # todo: 这里依赖mobius实现的不太好
             mobius = Mobius()
             for share in shares:
                 share[Share.VERSION] = 0 if share[
                     Share.VERSION] is None else share[Share.VERSION]
                 update_info = {Share.VERSION: share[Share.VERSION] + 1}
                 # 更新分享表的数据条数
                 if share[Share.
                          ROW_FILTER] == '[]' and not share[Share.DEP_ID]:
                     if TB.DATA_COUNT in params:
                         update_info[Share.DATA_COUNT] = params[
                             TB.DATA_COUNT]
                 else:
                     if TB.DATA_COUNT in params and params[
                             TB.DATA_COUNT] == 0:
                         update_info[Share.DATA_COUNT] = 0
                     else:
                         dep_list = [share]
                         self.find_parent_sh(shares, share[Share.SH_ID],
                                             dep_list)
                         row_filter = []
                         for sh in dep_list:
                             row_filter += json.loads(sh[Share.ROW_FILTER])
                         expand_filter = expand_vfield(
                             row_filter, table_vfield)
                         where = ' and '.join(expand_filter)
                         if not expand_filter and TB.DATA_COUNT in params:
                             update_info[Share.DATA_COUNT] = params[
                                 TB.DATA_COUNT]
                         else:
                             try:
                                 count_data = mobius.query(
                                     'select count(1) as count from %s where %s'
                                     % (storage_id, where))
                                 update_info[Share.DATA_COUNT] = count_data[
                                     'data'][0][0]
                             except Exception as e:
                                 self.logger.error(e)
                 share_model.update(share[Share.SH_ID], update_info)
     return self._update({TB.TB_ID: tb_id, 'is_del': is_del}, params)
Example #2
0
 def add_with_share(self, params):
     required_params = (Field.NAME, Field.TYPE)
     for rp in required_params:
         if rp not in params:
             self.logger.warn('缺失字段:%s' % rp)
             return None
     if not params.get(Field.FIELD_ID, ''):
         params[Field.FIELD_ID] = create_field_id()
     if params[Field.TYPE] == Field.NULL_DATA_TYPE:
         params[Field.TYPE] = Field.STRING_TYPE
     fid = params[Field.FIELD_ID]
     if self._create(params):
         tb_id = params[Field.TB_ID]
         share_model = Share()
         shares = share_model.get({Share.TB_ID: tb_id},
                                  (Share.SH_ID, Share.COL_FILTER))
         for share in shares:
             col_filter = json.loads(share[Share.COL_FILTER])
             col_filter.append(fid)
             share_model.update(share[Share.SH_ID],
                                {Share.COL_FILTER: col_filter})
         return fid
     else:
         return None