docs: def select_rows(server_context, schema_name, query_name, view_name=None,
                  filter_array=None,
                  container_path=None,
                  columns=None,
                  max_rows=None,
                  sort=None,
                  offset=None,
                  container_filter=None,
                  parameters=None,
                  show_rows=None,
                  include_total_count=None,
                  include_details_column=None,
                  include_update_column=None,
                  selection_key=None,
                  required_version=None,
                  timeout=_default_timeout
                  ):
      """
      Query data from a LabKey server
      :param server_context: A LabKey server context. See utils.create_server_context.
      :param schema_name: schema of table
      :param query_name: table name to select from
      :param view_name: pre-existing named view
      :param filter_array: set of filter objects to apply
      :param container_path: folder path if not already part of server_context
      :param columns: set of columns to retrieve
      :param max_rows: max number of rows to retrieve
      :param sort: comma separated list of column names to sort by, prefix a column with '-' to sort descending
      :param offset: number of rows to offset results by
      :param container_filter: enumeration of the various container filters available. See:
          https://www.labkey.org/download/clientapi_docs/javascript-api/symbols/LABKEY.Query.html#.containerFilter
      :param parameters: Set of parameters to pass along to a parameterized query
      :param show_rows: An enumeration of various paging styles
      :param include_total_count: Boolean value that indicates whether to include a total count value in response
      :param include_details_column: Boolean value that indicates whether to include a Details link column in results
      :param include_update_column: Boolean value that indicates whether to include an Update link column in results
      :param selection_key:
      :param required_version: decimal value that indicates the response version of the api
      :param timeout: Request timeout in seconds (defaults to 30s)
      :return:
      """
      url = server_context.build_url('query', 'getQuery.api', container_path=container_path)
  
      payload = {
          'schemaName': schema_name,
          'query.queryName': query_name
      }
  
      if view_name is not None:
          payload['query.viewName'] = view_name
  
      if filter_array is not None:
          for query_filter in filter_array:
              prefix = query_filter.get_url_parameter_name()
              payload[prefix] = query_filter.get_url_parameter_value()
  
      if columns is not None:
          payload['query.columns'] = columns
  
      if max_rows is not None:
          payload['query.maxRows'] = max_rows
  
      if sort is not None:
          payload['query.sort'] = sort
  
      if offset is not None:
          payload['query.offset'] = offset
  
      if container_filter is not None:
          payload['containerFilter'] = container_filter
  
      if parameters is not None:
          for key, value in parameters.items():
              payload['query.param.' + key] = value
  
      if show_rows is not None:
          payload['query.showRows'] = show_rows
  
      if include_total_count is not None:
          payload['includeTotalCount'] = include_total_count
  
      if include_details_column is not None:
          payload['includeDetailsColumn'] = include_details_column
  
      if include_update_column is not None:
          payload['includeUpdateColumn'] = include_update_column
  
      if selection_key is not None:
          payload['query.selectionKey'] = selection_key
  
      if required_version is not None:
          payload['apiVersion'] = required_version
  
      return server_context.make_request(url, payload, timeout=timeout)