Beispiel #1
0
 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"]))
Beispiel #2
0
    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