个人技术分享

现有示例数据

# 示例数据
pending_join = [
{'increment': "department = 'Finance'", 'statement_index': 0},
{'increment': "name = 'Lisa'", 'statement_index': 2},
{'increment': "gender = 'Female'", 'statement_index': 3},
{'increment': "hire_date < '2022-01-01'", 'statement_index': 1},
]

logic = [
{'operator': 'and', 'operands': [0, 1], 'result': 'result1'},
{'operator': 'and', 'operands': [2, 3], 'result': 'result2'},
{'operator': 'or', 'operands': ['result1', 'result2'], 'result': 'result3'},
]

要求输出

# 示例输出
output = "((department = 'Finance' AND hire_date < '2022-01-01') OR (name = 'Lisa' AND gender = 'Female'))"

思路:

1.在logic中查找最后的result,依据是它的operands没有出现过的result

2.构建递归函数,返回条件是参数operand为数字,并返回pending_join[x].increment

# coding=utf-8

# 示例数据
pending_join = [
{'increment': "department = 'Finance'", 'statement_index': 0},
{'increment': "name = 'Lisa'", 'statement_index': 2},
{'increment': "gender = 'Female'", 'statement_index': 3},
{'increment': "hire_date < '2022-01-01'", 'statement_index': 1},
]

logic = [
{'operator': 'and', 'operands': [0, 1], 'result': 'result1'},
{'operator': 'and', 'operands': [2, 3], 'result': 'result2'},
{'operator': 'or', 'operands': ['result1', 'result2'], 'result': 'result3'},
]

# 示例输出
output = "((department = 'Finance' AND hire_date < '2022-01-01') OR (name = 'Lisa' AND gender = 'Female'))"

def final_result(logic_op):
    result_list = []
    operands_list = []
    for op in logic_op:
        result_list.append(op.get('result'))
        operands_list.append(op.get('operands')[0])
        operands_list.append(op.get('operands')[1])
    for op in logic_op:
        if not op.get('result') in operands_list:
            print('final_result:',op.get('result'))
            return op.get('result')
            
def get_result(operand):
    # return str
    if str(operand).isnumeric():
        for peading in pending_join:
            if peading.get('statement_index')==operand:
                return peading.get('increment')
    for op in logic:
        if op.get('result') == operand:
            op1 = op.get('operands')[0]
            op2 = op.get('operands')[1]
            return '({} {} {})'.format(get_result(op1),op.get('operator').upper(),get_result(op2))

final_res = final_result(logic)
fr = get_result(str(final_res))
print(fr)