class Celsius::Primo::SoapApi::Searcher::SearchBrief::SearchRequestTransformation::AddSortByList

Public Instance Methods

call() click to toggle source

SortField is optional, so we have to add it on the fly if necessary

# File lib/celsius/primo/soap_api/searcher/search_brief/search_request_transformation/add_sort_by_list.rb, line 10
def call
  if sort_fields = (Celsius::Hash.deep_find_key(source, :sort) || []).first
    primo_search_request = transformation.inner_search_request.locate("PrimoSearchRequest").first
    insert_sort_by_node(primo_search_request, sort_fields)
  end
end

Private Instance Methods

insert_sort_by_node(primo_search_request, sort_fields) click to toggle source
# File lib/celsius/primo/soap_api/searcher/search_brief/search_request_transformation/add_sort_by_list.rb, line 21
  def insert_sort_by_node(primo_search_request, sort_fields)
    # Order matters, SortField *must* be inserted after <Languages>
    index_of_languages = primo_search_request.nodes.index do |node|
      node.value == "Languages"
    end

    # primo can only handle *one* sort field
    sort_field = transformation.sort_field_mapping(sort_fields.first)

    sort_by_list = Ox.parse(
      <<-xml
        <SortByList>
          <SortField>#{sort_field}</SortField>
        </SortByList>
      xml
    )

    # insert the SortByList at the appropriate position
    primo_search_request.nodes.insert(index_of_languages + 1, sort_by_list)
  end