Class: Cocina::Models::Builders::TitleBuilder
- Inherits:
-
Object
- Object
- Cocina::Models::Builders::TitleBuilder
- Extended by:
- Deprecation
- Defined in:
- lib/cocina/models/builders/title_builder.rb
Overview
TitleBuilder selects the prefered title from the cocina object for solr indexing
Class Method Summary collapse
-
.additional_titles(titles) ⇒ Array<String>
“additional titles” are all title data except for full_title.
-
.build(titles, catalog_links: [], strategy: :first, add_punctuation: true) ⇒ String, Array
The title value for Solr - for :first strategy, a string; for :all strategy, an array (e.g. title displayed in blacklight search results vs boosting values for search result rankings).
-
.full_title(titles) ⇒ Array<String>
the “full title” is the title WITH subtitle, part name, etc.
-
.main_title(titles) ⇒ Array<String>
the “main title” is the title withOUT subtitle, part name, etc.
Instance Method Summary collapse
-
#build(cocina_titles) ⇒ String, Array
rubocop:disable Metrics/PerceivedComplexity.
-
#initialize(strategy:, add_punctuation:, only_one_parallel_value: true, part_label: nil) ⇒ TitleBuilder
constructor
A new instance of TitleBuilder.
-
#main_title(titles) ⇒ Array<String>
this is the single “short title” - the title without subtitle, part name, etc.
Constructor Details
#initialize(strategy:, add_punctuation:, only_one_parallel_value: true, part_label: nil) ⇒ TitleBuilder
Returns a new instance of TitleBuilder.
63 64 65 66 67 68 |
# File 'lib/cocina/models/builders/title_builder.rb', line 63 def initialize(strategy:, add_punctuation:, only_one_parallel_value: true, part_label: nil) @strategy = strategy @add_punctuation = add_punctuation @only_one_parallel_value = only_one_parallel_value @part_label = part_label end |
Class Method Details
.additional_titles(titles) ⇒ Array<String>
“additional titles” are all title data except for full_title. We want to able able to index it separately so
we can boost matches on it in search results (boost matching these strings lower than other titles present)
50 51 52 |
# File 'lib/cocina/models/builders/title_builder.rb', line 50 def self.additional_titles(titles) [new(strategy: :all, add_punctuation: false).build(titles)].flatten - full_title(titles) end |
.build(titles, catalog_links: [], strategy: :first, add_punctuation: true) ⇒ String, Array
Returns the title value for Solr - for :first strategy, a string; for :all strategy, an array (e.g. title displayed in blacklight search results vs boosting values for search result rankings).
18 19 20 21 22 23 24 25 26 27 |
# File 'lib/cocina/models/builders/title_builder.rb', line 18 def self.build(titles, catalog_links: [], strategy: :first, add_punctuation: true) part_label = catalog_links.find { |link| link.catalog == 'folio' }&.partLabel if titles.respond_to?(:description) Deprecation.warn(self, "Calling TitleBuilder.build with a #{titles.class} is deprecated. " \ 'It must be called with an array of titles') titles = titles.description.title end new(strategy: strategy, add_punctuation: add_punctuation, part_label: part_label).build(titles) end |
.full_title(titles) ⇒ Array<String>
the “full title” is the title WITH subtitle, part name, etc. We want to able able to index it separately so
we can boost matches on it in search results (boost matching this string higher than other titles present)
42 43 44 |
# File 'lib/cocina/models/builders/title_builder.rb', line 42 def self.full_title(titles) [new(strategy: :first, add_punctuation: false, only_one_parallel_value: false).build(titles)].flatten.compact end |
.main_title(titles) ⇒ Array<String>
the “main title” is the title withOUT subtitle, part name, etc. We want to index it separately so
we can boost matches on it in search results (boost matching this string higher than matching full title string)
e.g. "The Hobbit" (main_title) vs "The Hobbit, or, There and Back Again (full_title)
34 35 36 |
# File 'lib/cocina/models/builders/title_builder.rb', line 34 def self.main_title(titles) new(strategy: :first, add_punctuation: false).main_title(titles) end |
Instance Method Details
#build(cocina_titles) ⇒ String, Array
rubocop:disable Metrics/PerceivedComplexity
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/cocina/models/builders/title_builder.rb', line 76 def build(cocina_titles) cocina_title = primary_title(cocina_titles) || untyped_title(cocina_titles) cocina_title = other_title(cocina_titles) if cocina_title.blank? if strategy == :first result = extract_title(cocina_title) add_part_label(result) else result = cocina_titles.map { |ctitle| extract_title(ctitle) }.flatten if only_one_parallel_value? && result.length == 1 result.first else result end end end |
#main_title(titles) ⇒ Array<String>
this is the single “short title” - the title without subtitle, part name, etc.
this may be useful for boosting and exact matching for search results
96 97 98 99 100 101 |
# File 'lib/cocina/models/builders/title_builder.rb', line 96 def main_title(titles) cocina_title = primary_title(titles) || untyped_title(titles) cocina_title = other_title(titles) if cocina_title.blank? extract_main_title(cocina_title) end |