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)
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