async def METHOD_NAME(self, query_expr, offset, length):
    length = int(length)
    offset = int(offset)
    try:
        # Separate out api supported url params
        query_expr, filter_attr = Connector.modify_query_expr(query_expr)
        limit = int(query_expr.get('limit', 50))
        if limit > 50:
            if length > limit:
                length = limit
            query_expr["limit"] = 50
        # Grab the response, extract the response code, and convert it to readable json
        # $(offset) param not included as data source not support this
        response = self.api_client.run_search(query_expr, length)
        response_code = response['code']
        # Construct a response object
        event_list = []
        for event in response.get("data", []):
            event = json.dumps(event.__dict__, default=Connector.default)
            event_list.append(json.loads(event))
        return_obj = dict()
        if response_code == 200:
            return_obj['success'] = True
            return_obj['data'] = event_list
            # filter data based on filter_attr
            return_obj = Connector.filter_response(return_obj, filter_attr)
            # slice the records as per the provided offset and length(limit)
            return_obj['data'] = return_obj['data'][offset:length]
        else:
            ErrorResponder.fill_error(return_obj, response, ['message'], connector=self.connector)
        return return_obj
    except Exception as err:
        self.logger.error('error when getting search results: {}'.format(err))
        import traceback
        self.logger.error(traceback.print_stack())
        raise