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, 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) ⇒ 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) ⇒ TitleBuilder
Returns a new instance of TitleBuilder.
60 61 62 63 64 |
# File 'lib/cocina/models/builders/title_builder.rb', line 60 def initialize(strategy:, add_punctuation:, only_one_parallel_value: true) @strategy = strategy @add_punctuation = add_punctuation @only_one_parallel_value = only_one_parallel_value 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)
48 49 50 |
# File 'lib/cocina/models/builders/title_builder.rb', line 48 def self.additional_titles(titles) [new(strategy: :all, add_punctuation: false).build(titles)].flatten - full_title(titles) end |
.build(titles, 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).
17 18 19 20 21 22 23 24 25 |
# File 'lib/cocina/models/builders/title_builder.rb', line 17 def self.build(titles, strategy: :first, add_punctuation: true) 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).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)
40 41 42 |
# File 'lib/cocina/models/builders/title_builder.rb', line 40 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)
32 33 34 |
# File 'lib/cocina/models/builders/title_builder.rb', line 32 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
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/cocina/models/builders/title_builder.rb', line 71 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 extract_title(cocina_title) 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
91 92 93 94 95 96 |
# File 'lib/cocina/models/builders/title_builder.rb', line 91 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 |