寻求生成最短CQL过滤器的表与权限ID最优分组算法
最优CQL过滤器分组算法:最小化条件字符串长度
问题明确
你手里有一个tables数组,每个元素包含一张表的table_id和对应的privilege_ids数组。当前生成的CQL过滤器是多个(table_id in (...) and privilege_id in (...))的逻辑与组合,但这种方式会因重复的权限ID产生冗余。需要找到一种分组方式,合并共享权限的表,让最终的CQL字符串最短。
核心算法思路(适配1-10张表的小场景)
不用复杂算法,贪心+局部最优就足够解决问题,步骤如下:
- 统计权限关联关系
先整理所有权限ID对应的table_id集合,比如'def'关联表[1,2,3,4,5],'abc'关联表[1,2,3];同时统计每个权限的出现频次,频次越高的权限越优先作为合并核心。 - 按重叠度优先合并
从共享权限最多的表组开始合并:先提取所有表共有的权限集合,对应所有表的table_id组;再处理部分表共享的权限,把共享同一权限子集的表归为一组。 - 验证合并是否划算
每次合并前计算长度变化:单个分组长度为len("(table_id in (...))") + len("(privilege_id in (...))"),总长度是所有分组长度之和加上分组间and的长度(n个分组对应n-1个and)。如果合并后总长度更短,就保留该合并,否则放弃。 - 处理零散项
最后剩下的单个表或小表组,要么单独成组,要么尝试和现有组合并,选总长度更短的方案。
示例演示
以你给出的5张表为例:
- 表1:
privilege_ids = ['abc','def','ghi'] - 表2:
privilege_ids = ['abc','def','ghi'] - 表3:
privilege_ids = ['abc','def','ghi'] - 表4:
privilege_ids = ['def','ghi','jkl'] - 表5:
privilege_ids = ['def','ghi','jkl']
原分组的CQL如下:
((table_id in (1,2,3)) and (privilege_id in ('abc','def','ghi'))) and ((table_id in (4,5)) and (privilege_id in ('def','ghi','jkl')))
按算法优化后,拆为三组的CQL更短:
((table_id in (1,2,3,4,5)) and (privilege_id in ('def','ghi'))) and ((table_id in (1,2,3)) and (privilege_id in ('abc'))) and ((table_id in (4,5)) and (privilege_id in ('jkl')))
原因是原分组中重复的'def','ghi'仅需写一次,减少了冗余字符,整体字符串长度更短。
场景适配
- 小场景(1-3张表):直接枚举所有可能的分组方式,选最短的即可,计算量可忽略。
- 极端场景(10张表共享大量权限):将所有表归为一组,共享权限只写一次,独有权限单独分组,效率最高。
- 常规重叠场景:贪心合并共享权限最多的组,既能保证最短长度,又无需过多计算时间。
内容的提问来源于stack exchange,提问作者Meyra
相关产品推荐
相关产品推荐

