Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Development merge #182

Merged
merged 1 commit into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,18 @@
class ApplicationController < ActionController::Base

before_action :check_api_status

def check_api_status
# Make a simple SES request to check the service is working
# This is skipped during tests

unless Rails.env.test?
check = SesLookup.new([{ value: 346696 }]).test_api_response

if check.has_key?("error")
render template: "layouts/shared/error/500", locals: { status: check.dig("error", "errorType"), message: check.dig("error", "errorMessage") }
end
end
end

end
5 changes: 4 additions & 1 deletion app/helpers/application_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,12 @@ def filter_field_name(field)
department_t: 'Department',
year: 'Date',
month: 'Date',
session: 'Session'
session: 'Session',
primaryMember_ses: 'Primary member'
}

raise "Unknown field name '#{field}'" if Rails.env.development? && !field_names.keys.include?(field.to_sym)

field_names[field.to_sym]
end

Expand Down
5 changes: 4 additions & 1 deletion app/models/hierarchy_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def hierarchy_data

def formatted_ses_data
ret = {}
ses_data.keys.each {|a| ret[a.first] = a.last }
ses_data.keys.each { |a| ret[a.first] = a.last }

ret
end
Expand Down Expand Up @@ -49,7 +49,10 @@ def organise_hierarchy_data(ses_data)
def top_level_types
return unless ses_data.is_a?(Hash)

return [] if ses_data.has_key?("error")

ret = []

# select types that have 'Content Type' as their parent
ses_data.select { |k, v| v.first.dig("fields").first.dig("field", "id") == "346696" }.keys.map do |id, name|
ret << { id: id, name: name }
Expand Down
18 changes: 17 additions & 1 deletion app/models/search_data.rb
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ def facets
facet_field_data.slice("type_sesrollup", "legislature_ses", "date_dt", "department_ses",
"member_ses", "tablingMember_ses", "askingMember_ses", "leadMember_ses",
"answeringMember_ses", "legislativeStage_ses", "legislationTitle_ses", "subject_ses",
"topic_ses", "year", "publisher_ses").map { |k, v| { field_name: k, facets: sort_facets(v['buckets']) } }
"topic_ses", "year", "publisher_ses", "primaryMember_ses").map { |k, v| { field_name: k, facets: sort_facets(v['buckets']) } }
end

def type_facets
Expand All @@ -268,6 +268,22 @@ def session_facets
facet_field_data.select { |field| field.split('_').first == "session" }
end

def primary_member_facets
return [] unless search

facet_field_data = search.dig(:data, 'facets')
return [] if facet_field_data.blank?

ret = []
facet_field_data.dig("primaryMember_ses", "buckets").each do |bucket|
bucket.dig("unique_combined", "buckets").each do |sub_bucket|
ret << sub_bucket
end
end

ret
end

def sort_facets(facet_field)
facet_field.sort_by { |h| h["count"] }.reverse
end
Expand Down
48 changes: 27 additions & 21 deletions app/models/ses_lookup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,18 +45,11 @@ def evaluated_responses
# fetch response
response = api_response(uri)

# try to parse the response as JSON & extract terms
begin
parsed_response = JSON.parse(response)
evaluated = parsed_response.dig('terms')
rescue JSON::ParserError
# contrary to SES API documentation, errors seem to be returned as XML regardless of specified TEMPLATE
evaluated = Hash.from_xml(response)
puts "Error: #{evaluated}" if Rails.env.development?
end

# collate responses
output << evaluated
# extract terms
terms = response.dig('terms')

# collate terms from all responses
output << terms
end
end

Expand All @@ -70,8 +63,12 @@ def evaluated_responses

def evaluated_hierarchy_response
uri = ses_browse_service_uri
response = JSON.parse(api_response(uri))
response.dig("terms")
api_response(uri)
end

def test_api_response
uri = ses_term_service_uri("346696")
api_response(uri)
end

def data
Expand Down Expand Up @@ -108,14 +105,15 @@ def extract_hierarchy_data
# the hashes contain a nested 'term' hash containing 'id' and 'name'

# If SES returns an error, we'll get an error key returned from evaluated_response
return responses.first if responses.first&.has_key?(:error)
return responses if responses.has_key?("error")

unless responses.compact.blank?
responses.each do |response|
terms = responses.dig('terms')
unless terms.compact.blank?
terms.each do |term|
new_key = []
new_key << response.dig('term', 'id')&.to_i
new_key << response.dig('term', 'name')
ret[new_key] = response.dig('term', 'hierarchy')
new_key << term.dig('term', 'id')&.to_i
new_key << term.dig('term', 'name')
ret[new_key] = term.dig('term', 'hierarchy')
end
end

Expand All @@ -139,6 +137,14 @@ def group_size
def api_response(uri)
raise 'Please stub this method to avoid HTTP requests in test environment' if Rails.env.test?

api_get_request(uri)
raw_response = api_get_request(uri)

begin
JSON.parse(raw_response)
rescue JSON::ParserError
# contrary to SES API documentation, errors seem to be returned as XML regardless of specified TEMPLATE
evaluated_as_xml = Hash.from_xml(raw_response)
puts "Error: #{evaluated_as_xml}" if Rails.env.development?
end
end
end
16 changes: 16 additions & 0 deletions app/models/solr_search.rb
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,22 @@ def facet_hash
}
end

ret['primaryMember_ses'] = {
"type": "terms",
"field": "askingMember_ses",
"limit": 80,
"facet": {
"unique_combined": {
"type": "terms",
"field": "leadMember_ses",
"limit": -1,
"facet": {
"unique_count": "unique(askingMember_ses)"
}
}
}
}

ret.to_json
end

Expand Down
4 changes: 2 additions & 2 deletions app/views/search/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
<%#= render 'search/fragments/data', data: @search_data.search, title: 'Search response' %>
<%#= render 'search/fragments/data', data: @ses_data, title: 'SES results' %>
<%#= render 'search/fragments/data', data: @search_data.facets, title: 'Facets' %>
<%#= render 'search/fragments/data', data: @search_data.primary_member_facets, title: 'Primary Member Facets' %>
<%#= render 'search/fragments/data', data: @search_data.type_facets, title: 'Type facets' %>
<%#= render 'search/fragments/data', data: @search_data.hierarchy_data, title: 'Hierarchy data' %>
<%#= render 'search/fragments/data', data: @top_level, title: 'Hierarchy top level types' %>
<%#= render 'search/fragments/data', data: @toggled_facets, title: 'Toggled facets' %>
<%#= render 'search/fragments/data', data: request.params, title: 'All params' %>
<% end %>

Expand Down Expand Up @@ -53,7 +53,7 @@
<% end %>
<%= render 'search/results/facets/date_facet' %>
<%= render 'search/results/facets/session_facet', facet_data: @search_data.session_facets %>
<% @search_data.facets.select { |h| ["session_t", "department_ses", "member_ses", "tablingMember_ses", "askingMember_ses", "leadMember_ses", "answeringMember_ses", "legislativeStage_ses", "legislationTitle_ses", "subject_ses", "publisher_ses"].include?(h.dig(:field_name)) }.each do |facet_field| %>
<% @search_data.facets.select { |h| ["session_t", "department_ses", "member_ses", "primaryMember_ses", "tablingMember_ses", "askingMember_ses", "leadMember_ses", "answeringMember_ses", "legislativeStage_ses", "legislationTitle_ses", "subject_ses", "publisher_ses"].include?(h.dig(:field_name)) }.each do |facet_field| %>
<%= render 'filter_section', facet_field: format_facets(facet_field) %>
<% end %>
</div>
Expand Down
2 changes: 1 addition & 1 deletion coverage/.last_run.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"result": {
"line": 81.51
"line": 80.73
}
}
Loading
Loading