Class: Catalog::Entry

Inherits:
Object
  • Object
show all
Defined in:
lib/catalog/entry.rb

Overview

A Catalog::Entry has many entry items. Together Catalog::Entries form a Catalog

!! Make sure to add a dependency for all Entry types to the bottom of this file !! or build may not inherit correctly (would otherwise need to be above def initialize

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object, sort_order = []) ⇒ Entry

Returns a new instance of Entry.



37
38
39
40
41
42
43
# File 'lib/catalog/entry.rb', line 37

def initialize(object, sort_order = [])
  @object = object
  @items = []
  @sort_order = sort_order
  build
  index_items
end

Instance Attribute Details

#datesArray

Returns:

  • (Array)


21
22
23
# File 'lib/catalog/entry.rb', line 21

def dates
  @dates
end

#item_indexHash

An index of all the EntryItems by global_id taken from "object"

Returns:

  • (Hash)

    { global_id => [EntryItem] }



17
18
19
# File 'lib/catalog/entry.rb', line 17

def item_index
  @item_index
end

#itemsArray

Each item is a line item in the Entry

Returns:

  • (Array)


12
13
14
# File 'lib/catalog/entry.rb', line 12

def items
  @items
end

#objectObject

The target object(s) for this entry



8
9
10
# File 'lib/catalog/entry.rb', line 8

def object
  @object
end

#sort_orderArray

Returns of strings, the array determines nesting order all entries in the catalog should have sorts of the same length !! Not yet implemented !!.

Returns:

  • (Array)

    of strings, the array determines nesting order all entries in the catalog should have sorts of the same length !! Not yet implemented !!



35
36
37
# File 'lib/catalog/entry.rb', line 35

def sort_order
  @sort_order
end

#sourcesArray

Returns:

  • (Array)


25
26
27
# File 'lib/catalog/entry.rb', line 25

def sources
  @sources
end

#topicsScope

Returns:

  • (Scope)


29
30
31
# File 'lib/catalog/entry.rb', line 29

def topics
  @topics
end

Instance Method Details

#all_citationsObject (protected)



189
190
191
# File 'lib/catalog/entry.rb', line 189

def all_citations
  items.map(&:citation).compact
end

#all_datesArray of Date (protected)

Some duplication here

Returns:

  • (Array of Date)

    !! not Time



195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/catalog/entry.rb', line 195

def all_dates
  d = []
  sources.each do |s|
    d.push s.cached_nomenclature_date
  end

  items.each do |i|
    d.push i.nomenclature_date
  end

  d.compact.uniq.sort
end

#all_sourcesArray of Source (protected)

Here .source is item.source, not item.object.source, i.e. it comes from a specific citation, not one of many citations for the object.

!! Redefined in some subclasses

Returns:



185
186
187
# File 'lib/catalog/entry.rb', line 185

def all_sources
  items.collect{|i| i.source}.compact
end

#all_topicsArray of Topics (protected)

Returns:

  • (Array of Topics)


209
210
211
212
# File 'lib/catalog/entry.rb', line 209

def all_topics
  # Optimized: collect topics directly from items instead of O(n²) iteration through sources
  items.flat_map(&:topics).uniq.compact.sort
end

#buildObject

Redefined in subclasses! !! This is default only, it should be (re)defined in subclasses.



47
48
49
50
# File 'lib/catalog/entry.rb', line 47

def build
  @items << Catalog::EntryItem.new(object:, citation: object.origin_citation)
  true
end

#citationsObject



171
172
173
174
# File 'lib/catalog/entry.rb', line 171

def citations
  @citations ||= all_citations
  @citations
end

#coordinate_entry_itemsObject



168
169
# File 'lib/catalog/entry.rb', line 168

def coordinate_entry_items
end

#date_rangeArray

Returns:

  • (Array)


130
131
132
# File 'lib/catalog/entry.rb', line 130

def date_range
  [dates.first, dates.last].compact
end

#first_item?(item) ⇒ Boolean

Named "firstto avoid conflice withcitation#is_original` Returns true if

  • it's the only item with this object
  • the citation is_original
  • there is no original citation in any item for this object, and it's the first in the list chronologically Inversely, returns false (in all other cases):
  • its not the only one item with this object
  • it doesn't have a citation that is_original
  • there is no indication of the original citaiton, and the item isn't first in the list chronologically

Returns:

  • (Boolean)

    Boolean



70
71
72
73
74
75
76
77
# File 'lib/catalog/entry.rb', line 70

def first_item?(item)
  o = items_by_object(item.object)
  return true if o.size == 1
  return true if item.citation&.is_original?
  return true if !original_citation_present? && o.index(item) == 0

  false
end

#index_itemsObject



52
53
54
55
56
57
58
# File 'lib/catalog/entry.rb', line 52

def index_items
  items.each do |i|
    i.is_first = first_item?(i)
    i.is_last = last_item?(i)
  end
  true
end

#is_subsequent_entry_item?(entry_item) ⇒ Boolean

Returns:

  • (Boolean)


165
166
# File 'lib/catalog/entry.rb', line 165

def is_subsequent_entry_item?(entry_item)
end

#items_by_object(object) ⇒ Object



99
100
101
# File 'lib/catalog/entry.rb', line 99

def items_by_object(object)
  ::Catalog.chronological_item_sort( items.select{|i| i.object == object } )
end

#last_item?(item) ⇒ Boolean

Returns true if

  • it's the only item with this object
  • it's the last citation chronologically Inversely, returns false in all other cases:

Returns:

  • (Boolean)

    Boolean



84
85
86
87
88
89
90
# File 'lib/catalog/entry.rb', line 84

def last_item?(item)
  o = items_by_object(item.object)
  return true if o.size == 1
  return true if o.last == item

  false
end

#ordered_by_nomenclature_dateArray of NomenclatureCatalog::EntryItem

Returns sorted by date, then taxon name name as rendered for this item.

Returns:



105
106
107
# File 'lib/catalog/entry.rb', line 105

def ordered_by_nomenclature_date
  ::Catalog.chronological_item_sort(items)
end

#original_citation_present?Boolean

Returns:

  • (Boolean)


92
93
94
95
96
97
# File 'lib/catalog/entry.rb', line 92

def original_citation_present?
  items.each do |i|
    return true if i.citation&.is_original
  end
  false
end

#to_jsonObject



159
160
161
162
163
# File 'lib/catalog/entry.rb', line 159

def to_json
  return {
    item_count: items.count,
  }
end

#topics_for_source(source) ⇒ Array of Topics

Returns an extraction of all Topics referenced in citations that were observed in this CatalogEntry for the source TODO: SET/BUILD?.

Parameters:

Returns:

  • (Array of Topics)

    an extraction of all Topics referenced in citations that were observed in this CatalogEntry for the source TODO: SET/BUILD?



114
115
116
117
118
119
120
121
# File 'lib/catalog/entry.rb', line 114

def topics_for_source(source)
  topics = []
  items.each do |i|
    # topics += i.object.topics if i.source == source
    topics += i.topics if i.source == source
  end
  topics.uniq
end

#year_hashHash

Returns:

  • (Hash)


147
148
149
150
151
152
153
154
155
156
157
# File 'lib/catalog/entry.rb', line 147

def year_hash
  h = {}
  dates.each do |d|
    if h[d.year]
      h[d.year] += 1
    else
      h[d.year] = 1
    end
  end
  h
end