Class: SearchResultData

Inherits:
Object
  • Object
show all
Defined in:
frontend/app/models/search_result_data.rb

Class Method Summary (collapse)

Instance Method Summary (collapse)

Constructor Details

- (SearchResultData) initialize(search_data)

Returns a new instance of SearchResultData



3
4
5
6
7
8
9
10
# File 'frontend/app/models/search_result_data.rb', line 3

def initialize(search_data)
  @search_data = search_data
  @facet_data = {}

  self.class.run_result_hooks(search_data)
  init_facets
  init_sorts
end

Class Method Details

+ (Object) ACCESSION_FACETS



227
228
229
# File 'frontend/app/models/search_result_data.rb', line 227

def self.ACCESSION_FACETS
  ["subjects", "accession_date_year", "creators"]
end

+ (Object) add_result_hook(&block)



260
261
262
263
# File 'frontend/app/models/search_result_data.rb', line 260

def self.add_result_hook(&block)
  @result_hooks ||= []
  @result_hooks << block
end

+ (Object) AGENT_FACETS



223
224
225
# File 'frontend/app/models/search_result_data.rb', line 223

def self.AGENT_FACETS
  ["primary_type", "source", "rules"]
end

+ (Object) BASE_FACETS



219
220
221
# File 'frontend/app/models/search_result_data.rb', line 219

def self.BASE_FACETS
  ["primary_type","creators","subjects"]
end

+ (Object) BASE_SORT_FIELDS



215
216
217
# File 'frontend/app/models/search_result_data.rb', line 215

def self.BASE_SORT_FIELDS
  %w(create_time user_mtime)
end

+ (Object) CLASSIFICATION_FACETS



255
256
257
# File 'frontend/app/models/search_result_data.rb', line 255

def self.CLASSIFICATION_FACETS
  []
end

+ (Object) DIGITAL_OBJECT_FACETS



235
236
237
# File 'frontend/app/models/search_result_data.rb', line 235

def self.DIGITAL_OBJECT_FACETS
  ["subjects", "publish", "digital_object_type", "level", "primary_type"]
end

+ (Object) EVENT_FACETS



247
248
249
# File 'frontend/app/models/search_result_data.rb', line 247

def self.EVENT_FACETS
  ["event_type", "outcome"]
end

+ (Object) LOCATION_FACETS



239
240
241
# File 'frontend/app/models/search_result_data.rb', line 239

def self.LOCATION_FACETS
  ["temporary"]
end

+ (Object) RESOURCE_FACETS



231
232
233
# File 'frontend/app/models/search_result_data.rb', line 231

def self.RESOURCE_FACETS
  ["subjects", "publish", "level", "classification_path", "primary_type"]
end

+ (Object) run_result_hooks(results)



266
267
268
269
270
271
# File 'frontend/app/models/search_result_data.rb', line 266

def self.run_result_hooks(results)
  @result_hooks ||= []
  Array(@result_hooks).each do |hook|
    hook.call(results)
  end
end

+ (Object) SUBJECT_FACETS



243
244
245
# File 'frontend/app/models/search_result_data.rb', line 243

def self.SUBJECT_FACETS
  ["source", "first_term_type"]
end

+ (Object) UNTITLED_TYPES



251
252
253
# File 'frontend/app/models/search_result_data.rb', line 251

def self.UNTITLED_TYPES
  ["event"]
end

Instance Method Details

- (Object) [](key)



44
45
46
# File 'frontend/app/models/search_result_data.rb', line 44

def [](key)
  @search_data[key]
end

- (Object) []=(key, value)



48
49
50
# File 'frontend/app/models/search_result_data.rb', line 48

def []=(key, value)
  @search_data[key] = value
end

- (Object) current_sort_direction(index = 0)



180
181
182
183
184
# File 'frontend/app/models/search_result_data.rb', line 180

def current_sort_direction(index = 0)
  return "desc" unless sorted?

  @sort_data[index][:direction]
end

- (Object) facet_display_string(facet_group, facet)



79
80
81
# File 'frontend/app/models/search_result_data.rb', line 79

def facet_display_string(facet_group, facet)
  "#{I18n.t("search_results.filter.#{facet_group}", :default => facet_group)}: #{facet_label_string(facet_group, facet)}"
end

- (Object) facet_label_for_filter(filter)



56
57
58
59
60
61
62
63
64
65
66
# File 'frontend/app/models/search_result_data.rb', line 56

def facet_label_for_filter(filter)
  filter_json = JSON.parse(filter)
  facet = filter_json.keys[0]
  term = filter_json[facet]

  if @facet_data.has_key?(facet) and @facet_data[facet].has_key?(term)
    @facet_data[facet][term][:display_string]
  else
    facet_display_string(facet, term)
  end
end

- (Object) facet_label_for_query



211
212
213
# File 'frontend/app/models/search_result_data.rb', line 211

def facet_label_for_query
  "#{I18n.t("search_results.filter.query")}: #{@search_data[:criteria]["q"]}"
end

- (Object) facet_label_string(facet_group, facet)



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'frontend/app/models/search_result_data.rb', line 83

def facet_label_string(facet_group, facet)
  return I18n.t("#{facet}._singular", :default => I18n.t("plugins.#{facet}._singular", :default => facet)) if facet_group === "primary_type"
  return I18n.t("enumerations.name_source.#{facet}", :default => I18n.t("enumerations.subject_source.#{facet}", :default => facet)) if facet_group === "source"
  return I18n.t("enumerations.name_rule.#{facet}", :default => facet) if facet_group === "rules"
  return I18n.t("boolean.#{facet.to_s}", :default => facet) if facet_group === "publish"
  return I18n.t("enumerations.digital_object_digital_object_type.#{facet.to_s}", :default => facet) if facet_group === "digital_object_type"
  return I18n.t("enumerations.location_temporary.#{facet.to_s}", :default => facet) if facet_group === "temporary"
  return I18n.t("enumerations.event_event_type.#{facet.to_s}", :default => facet) if facet_group === "event_type"
  return I18n.t("enumerations.event_outcome.#{facet.to_s}", :default => facet) if facet_group === "outcome"
  return I18n.t("enumerations.subject_term_type.#{facet.to_s}", :default => facet) if facet_group === "first_term_type"

  if facet_group === "source"
    if single_type? and types[0] === "subject"
      return I18n.t("enumerations.subject_source.#{facet}", :default => facet)
    else
      return I18n.t("enumerations.name_source.#{facet}", :default => facet)
    end
  end

  if facet_group === "level"
      if single_type? and types[0] === "digital_object"
        return I18n.t("enumerations.digital_object_level.#{facet.to_s}", :default => facet)
      else
        return I18n.t("enumerations.archival_record_level.#{facet.to_s}", :default => facet)
      end
  end

  # labels for collection management groups
  return I18n.t("#{facet}._singular", :default => facet) if facet_group === "parent_type"
  return I18n.t("enumerations.collection_management_processing_priority.#{facet}", :default => facet) if facet_group === "processing_priority"
  return I18n.t("enumerations.collection_management_processing_status.#{facet}", :default => facet) if facet_group === "processing_status"

  if facet_group === "classification_path"
    return ClassificationHelper.format_classification(ASUtils.json_parse(facet))
  end

  facet
end

- (Object) facet_query_string(facet_group, facet)



40
41
42
# File 'frontend/app/models/search_result_data.rb', line 40

def facet_query_string(facet_group, facet)
  {facet_group => facet}.to_json
end

- (Object) facets_for_filter



68
69
70
71
72
73
74
75
76
77
# File 'frontend/app/models/search_result_data.rb', line 68

def facets_for_filter
  facet_data_for_filter = @facet_data.clone
  facet_data_for_filter.each {|facet_group, facets| 
    facets.delete_if{|facet, facet_map|
      facet_map[:count] === @search_data['total_hits']
    }
  }
  facet_data_for_filter.delete_if {|facet_group, facets| facets.empty?}
  facet_data_for_filter
end

- (Boolean) filtered_terms?

Returns:

  • (Boolean)


52
53
54
# File 'frontend/app/models/search_result_data.rb', line 52

def filtered_terms?
  @search_data[:criteria].has_key?("filter_term[]") and @search_data[:criteria]["filter_term[]"].reject{|f| f.empty?}.length > 0
end

- (Boolean) has_titles?

Returns:

  • (Boolean)


126
127
128
129
130
131
132
# File 'frontend/app/models/search_result_data.rb', line 126

def has_titles?
  if @search_data[:criteria].has_key?("type[]") and (types - self.class.UNTITLED_TYPES).empty?
    false
  else
    true
  end
end

- (Object) init_facets



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'frontend/app/models/search_result_data.rb', line 13

def init_facets
  @search_data['facets']['facet_fields'].each {|facet_group, facets|
    @facet_data[facet_group] = {}
    facets.each_slice(2).each {|facet_and_count|
      next if facet_and_count[1] === 0

      @facet_data[facet_group][facet_and_count[0]] = {
        :label => facet_label_string(facet_group, facet_and_count[0]),
        :count => facet_and_count[1],
        :filter_term => facet_query_string(facet_group, facet_and_count[0]),
        :display_string => facet_display_string(facet_group, facet_and_count[0])
      }
    }
  }
end

- (Object) init_sorts



30
31
32
33
34
35
36
37
# File 'frontend/app/models/search_result_data.rb', line 30

def init_sorts
  if sorted?
    @sort_data = @search_data[:criteria]["sort"].split(", ").map {|s|
      matches = s.match(/(\S+)\s(asc|desc)/)
      {:field => matches[1], :direction => matches[2]}
    }
  end
end

- (Boolean) query?

Returns:

  • (Boolean)


207
208
209
# File 'frontend/app/models/search_result_data.rb', line 207

def query?
  not @search_data[:criteria]["q"].blank?
end

- (Boolean) results?

Returns:

  • (Boolean)


122
123
124
# File 'frontend/app/models/search_result_data.rb', line 122

def results?
  @search_data.has_key?('results') and not @search_data['results'].empty?
end

- (Boolean) single_type?

Returns:

  • (Boolean)


134
135
136
137
138
139
140
141
142
# File 'frontend/app/models/search_result_data.rb', line 134

def single_type?
  if @search_data[:criteria].has_key?("type[]")
    @search_data[:criteria]["type[]"].length === 1
  elsif @search_data[:type]
    true
  else
    false
  end
end

- (Object) sort_fields



148
149
150
151
152
# File 'frontend/app/models/search_result_data.rb', line 148

def sort_fields
  @sort_fields ||= [].concat(self.class.BASE_SORT_FIELDS)

  single_type? ? @sort_fields : @sort_fields + ['primary_type']
end

- (Object) sort_filter_for(field, default = "asc")



187
188
189
190
191
192
193
# File 'frontend/app/models/search_result_data.rb', line 187

def sort_filter_for(field, default = "asc")
  return "#{field} #{default}" if field != sorted_by

  return "" if current_sort_direction != default

  return "#{field} #{default === "asc" ? "desc" : "asc"}"
end

- (Boolean) sorted?

Returns:

  • (Boolean)


154
155
156
# File 'frontend/app/models/search_result_data.rb', line 154

def sorted?
  @search_data[:criteria].has_key?("sort")
end

- (Object) sorted_by(index = 0)



162
163
164
165
166
167
168
# File 'frontend/app/models/search_result_data.rb', line 162

def sorted_by(index = 0)
  if sorted? && @sort_data[index]
    @sort_data[index][:field]
  else
    nil
  end
end

- (Boolean) sorted_by?(field)

Returns:

  • (Boolean)


171
172
173
174
175
176
177
# File 'frontend/app/models/search_result_data.rb', line 171

def sorted_by?(field)
  @sort_data.each do |entry|
    return true if entry[:field] == field
  end

  false
end

- (Object) sorted_by_label(title_label, index = 0)



195
196
197
198
199
200
201
202
203
204
205
# File 'frontend/app/models/search_result_data.rb', line 195

def sorted_by_label(title_label, index = 0)
  _sorted_by = sorted_by(index)

  if _sorted_by.nil?
    return weightable? ? I18n.t("search_sorting.relevance") : I18n.t("search_sorting.select")
  end

  label = _sorted_by == 'title_sort' ? title_label : I18n.t("search_sorting.#{_sorted_by}")
  direction = I18n.t("search_sorting.#{current_sort_direction(index)}")
  "#{label} #{direction}"
end

- (Object) types



144
145
146
# File 'frontend/app/models/search_result_data.rb', line 144

def types
  @search_data[:criteria]["type[]"]
end

- (Boolean) weightable?

Returns:

  • (Boolean)


158
159
160
# File 'frontend/app/models/search_result_data.rb', line 158

def weightable?
  @search_data[:criteria].has_key?("q")
end