Python生成多级嵌套字符串的一种实现思路

2019-11-05  本文已影响0人  Codmowa

最近有个需求是写一个多级的 可以嵌套的 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'

显然生成的嵌套级别是不对的

上一篇 下一篇

猜你喜欢

热点阅读