import itertools import json import re from typing import List def group(_input): d = list(itertools.chain(*list(map(lambda x: list(x.items()), _input)))) _s = [[a, [c for _, c in b]] for a, b in itertools.groupby(sorted(d, key=lambda x: x[0]), key=lambda x: x[0])] return {a: group(b) if all(isinstance(i, dict) for i in b) else list(itertools.chain(*b)) for a, b in _s} def fix_values(dic): for k, v in dic.items(): if isinstance(v, list): dic[k] = ''.join(v) else: fix_values(v) return dic def trim(s): """clear all white characters""" return re.sub(r'\s', '', s) def build_query(items, indent=2): """ transform a tree into grqphql query string """ dic = build_dict(items) return re.sub(r'["\s]', '', json.dumps(dic, indent=indent))[1:-1] def build_dict(items): """ transform a list of conditions into dictionary """ dicts = [] for item in items: json_str = '{' + re.sub(r'([$\w]+)', r'"\1"', item) + '}' dic = json.loads(json_str) dicts.append(dic) dic = group(dicts) return fix_values(dic)