def _process_data_contents(element): if "row" in element: if cls._elements_row is None: cls._elements_row = [] cls._elements_row.append(rewrites(element["row"])) if "graph" in element: if cls._elements_graph is None: cls._elements_graph = [] cls._elements_graph.append(rewrites(element["graph"]))
def cast(cls, elements, returns=None, types=None, auth=None, cypher=None): if types is None: types = cls._types if auth is None: auth = cls._auth if cypher is None: cypher = cls._cypher neutral = lambda x: x def cast_element(element, func): # We also allow the use of constants like NODE, etc if isinstance(func, string_types): func_lower = func.lower() if func_lower in types_keys: func = types[func_lower] if func in (types.get("node", ""), types.get("relationship", "")): obj = func(element["self"], update_dict=element, auth=auth, cypher=cypher) return obj elif func in (types.get("path", ""), types.get("position", "")): obj = func(element, auth=auth, cypher=cypher) return obj elif func in (None, True, False): sub_func = lambda x: x is func return sub_func(element) elif isinstance(element, (list, tuple)): if isinstance(func, Iterable): objs = [cast_element(obj, func._class) for obj in element] return iter(objs) elif isinstance(func, (list, tuple)): objs = [] for i, obj in enumerate(element): try: sub_func = func[i] except IndexError: pass # We keep the last value for sub_func objs.append(cast_element(obj, sub_func)) return type(func)(objs) elif callable(func): return func(element) else: objs = [cast_element(obj, func) for obj in element] return type(func)(objs) elif func == RAW: return element else: return func(element) def _process_data_contents(element): if "row" in element: if cls._elements_row is None: cls._elements_row = [] cls._elements_row.append(rewrites(element["row"])) if "graph" in element: if cls._elements_graph is None: cls._elements_graph = [] cls._elements_graph.append(rewrites(element["graph"])) if not returns or returns is RAW: if len(elements) > 0: results = [] for element in elements: # For IPython Notebook and data_contents _process_data_contents(element) # For transactional Cypher endpoint results.append(rewrites(element.get("rest", None))) return results else: return elements else: results = [] if not isinstance(returns, (tuple, list)): returns = [returns] else: returns = list(returns) for row in elements: # For IPython Notebook and data_contents _process_data_contents(row) # For transactional Cypher endpoint if "rest" in row: row = row["rest"] row = rewrites(row) # We need both list to have the same lenght len_row = len(row) len_returns = len(returns) if len_row > len_returns: returns += [neutral] * (len_row - len_returns) returns = returns[:len_row] # And now, apply i-th function to the i-th column in each row casted_row = [] types_keys = types.keys() for i, element in enumerate(row): func = returns[i] casted_row.append(cast_element(element, func)) if cls is not None and cls._return_single_rows: results.append(*casted_row) else: results.append(casted_row) return results