最近有个需求是写一个多级的 可以嵌套的 where filter
例如下面的 sql filter
Supp_name = 'uniqlo' and (Supp_no > '5' and (Sum_not_a_qty > 'wu~~~~'))
分析上述 sql 语句 可以得出 总共有 三级嵌套 由里到外分别是
1.(Sum_not_a_qty > 'wu~~~~')
2.(Supp_no > '5' and (Sum_not_a_qty > 'wu~~~~'))
3.Supp_name = 'uniqlo' and (Supp_no > '5' and (Sum_not_a_qty > 'wu~~~~'))
那么在 python 里面是这么生成的
supp_no = DvFilter("Supp_no").GREATER_THAN(5) # 2
Sum_not_a_qty = DvFilter("Sum_not_a_qty").GREATER_THAN("wu~~~~") # 1
supp_no.AND(Sum_not_a_qty) # 2
dv.addFilter("Supp_name").Equal_to("uniqlo").AND(supp_no) # 3
print(dv.filter.sql_text)
Dvfilter class 的部分实现如下
def valueSwitcher(self,expr):
if type(expr).__name__ == "DvFilter":
self.field_dict.update(expr.field_dict)
self.field_dict[expr.fileld_name]="0"
return "({expr})".format(expr=expr.sql_text)
else:
return "'{expr}'".format(expr=expr)
def Equal_to(self,expr):
self.sql_text = "{field_name} = {expr}"\
.format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
return self
def GREATER_THAN(self,expr):
self.sql_text = "{field_name} > {expr}"\
.format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
return self
def AND(self,expr):
self.sql_text = "{field_name} and {expr}"\
.format(field_name=self.sql_text,expr= self.valueSwitcher(expr))
return self
如果看过 Csharp Linq 的实现方式 可以了解. return self 十分类似于 下面这种
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source)
{
}
因为 return 了 self . 所以可以 连续 链式的调用, 当然在方法处理的时候 要考虑到链式调用所带来的问题 例如:
dv.addFilter("Supp_name").Equal_to("uniqlo").AND(supp_no).Equal_to("a")
#output
Supp_name = 'uniqlo' and (Supp_no > '5' and (Sum_not_a_qty > 'wu~~~~')) = 'a'
显然生成的嵌套级别是不对的
网友评论