def _get_query_parts(self, query_str, search_options=None):

        if search_options is None:
            search_options = {}

        if query_str is None:
            raise NipapValueError("'query_string' must not be None")

        # find query parts
        query_str_parts = []
        try:
            for part in shlex.split(query_str.encode('utf-8')):
                query_str_parts.append({ 'string': part.decode('utf-8') })
        except ValueError as exc:
            if str(exc) == 'No closing quotation':
                raise NipapValueError(str(exc))
            raise exc

        # Handle empty search.
        # We need something to iterate over, but shlex.split() returns
        # zero-element list for an empty string, so we have to append one
        # manually
        if len(query_str_parts) == 0:
            query_str_parts.append({ 'string': '' })

        return query_str_parts
starts the threaded_server on a separate thread. this turns the 
dataset/ETHPy150Open SpriteLink/NIPAP/nipap/nipap/backend.py/Nipap._get_query_parts--crossover with--dataset/ETHPy150Open deanhiller/databus/webapp/play1.3.x/python/Lib/site-packages/Rpyc/Utils/Serving.py/start_threaded_server