@Spongcer
2015-04-10T06:50:15.000000Z
字数 1419
阅读 1777
PG pull_ands pull_ors
pull_ands() 和 pull_ors() 的就是把树状结构的 AND、OR 操作拉平.
before pull_ands(): A = 1 and B = 1 and (C = 1 and D = 1)
after pull_ands(): A = 1 and B = 1 and C = 1 and D = 1
/** pull_ands* Recursively flatten nested AND clauses into a single and-clause list.** Input is the arglist of an AND clause.* Returns the rebuilt arglist (note original list structure is not touched).*/static List *pull_ands(List *andlist){List *out_list = NIL;ListCell *arg;foreach(arg, andlist){Node *subexpr = (Node *) lfirst(arg);/** Note: we can destructively concat the subexpression's arglist* because we know the recursive invocation of pull_ands will have* built a new arglist not shared with any other expr. Otherwise we'd* need a list_copy here.*/if (and_clause(subexpr))out_list = list_concat(out_list,pull_ands(((BoolExpr *) subexpr)->args));elseout_list = lappend(out_list, subexpr);}return out_list;}/** pull_ors* Recursively flatten nested OR clauses into a single or-clause list.** Input is the arglist of an OR clause.* Returns the rebuilt arglist (note original list structure is not touched).*/static List *pull_ors(List *orlist){List *out_list = NIL;ListCell *arg;foreach(arg, orlist){Node *subexpr = (Node *) lfirst(arg);/** Note: we can destructively concat the subexpression's arglist* because we know the recursive invocation of pull_ors will have* built a new arglist not shared with any other expr. Otherwise we'd* need a list_copy here.*/if (or_clause(subexpr))out_list = list_concat(out_list,pull_ors(((BoolExpr *) subexpr)->args));elseout_list = lappend(out_list, subexpr);}return out_list;}