Module: Solrizer::XML::TerminologyBasedSolrizer

Defined in:
lib/solrizer/xml/terminology_based_solrizer.rb

Overview

This module is only suitable to mix into Classes that use the OM::XML::Document Module

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#field_mapperObject

Instance Methods



92
93
94
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 92

def field_mapper
  @field_mapper
end

Class Method Details

.default_field_mapperObject



4
5
6
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 4

def self.default_field_mapper
  @@default_field_mapper ||= Solrizer::FieldMapper::Default.new
end

.solrize(doc, solr_doc = Hash.new, field_mapper = nil) ⇒ Object

Build a solr document from doc based on its terminology

Parameters:

  • doc (OM::XML::Document)
  • (optional) (Hash)

    solr_doc (values hash) to populate



13
14
15
16
17
18
19
20
21
22
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 13

def self.solrize(doc, solr_doc=Hash.new, field_mapper = nil)
  unless doc.class.terminology.nil?
    doc.class.terminology.terms.each_pair do |term_name,term|
      doc.solrize_term(term, solr_doc, field_mapper)
      # self.solrize_by_term(accessor_name, accessor_info, :solr_doc=>solr_doc)
    end
  end

  return solr_doc
end

.solrize_node(node, doc, term_pointer, term, solr_doc = Hash.new, field_mapper = nil, opts = {}) ⇒ Object

Populate a solr document with solr fields corresponding to the given xml node Field names are generated using settings from the term in the doc‘s terminology corresponding to term_pointer

Parameters:

  • node (Nokogiri::XML::Node)

    to solrize

  • doc (OM::XML::Document)

    document the node came from

  • term_pointer (Array)

    Array pointing to the term that should be used for solrization settings

  • (optional) (Hash)

    solr_doc (values hash) to populate



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 60

def self.solrize_node(node, doc, term_pointer, term, solr_doc = Hash.new, field_mapper = nil, opts = {})
  field_mapper ||= self.default_field_mapper
  terminology = doc.class.terminology
  # term = terminology.retrieve_term(*term_pointer)
  
  if term.path.kind_of?(Hash) && term.path.has_key?(:attribute)
    node_value = node.value
  else
    node_value = node.text
  end
  
  generic_field_name_base = OM::XML::Terminology.term_generic_name(*term_pointer)
  
  field_mapper.solr_names_and_values(generic_field_name_base, node_value, term.data_type, term.index_as).each do |field_name, field_value|
    unless field_value.join("").strip.blank?
      ::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_name, field_value)
    end
  end
  
  if term_pointer.length > 1
    hierarchical_field_name_base = OM::XML::Terminology.term_hierarchical_name(*term_pointer)
    field_mapper.solr_names_and_values(hierarchical_field_name_base, node_value, term.data_type, term.index_as).each do |field_name, field_value|
      unless field_value.join("").strip.blank?
        ::Solrizer::Extractor.insert_solr_field_value(solr_doc, field_name, field_value)
      end
    end
  end
  solr_doc
end

.solrize_term(doc, term, solr_doc = Hash.new, field_mapper = nil, opts = {}) ⇒ Object

Populate a solr document with fields based on nodes in xml corresponding to the term identified by term_pointer within terminology

Parameters:

  • doc (OM::XML::Document)

    xml document to extract values from

  • term (OM::XML::Term)

    corresponding to desired xml values

  • (optional) (Hash)

    solr_doc (values hash) to populate



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 29

def self.solrize_term(doc, term, solr_doc = Hash.new, field_mapper = nil, opts={})
  terminology = doc.class.terminology
  parents = opts.fetch(:parents, [])

  term_pointer = parents+[term.name]

  # term = terminology.retrieve_term(term_pointer)

  # prep children hash
  # child_accessors = accessor_info.fetch(:children, {})
  # xpath = term.xpath_for(*term_pointer)
  nodeset = doc.find_by_terms(*term_pointer)
  
  nodeset.each do |node|
    # create solr fields
    
    self.solrize_node(node, doc, term_pointer, term, solr_doc, field_mapper)
    term.children.each_pair do |child_term_name, child_term|
      doc.solrize_term(child_term, solr_doc, field_mapper, opts={:parents=>parents+[{term.name=>nodeset.index(node)}]})
      # self.solrize_term(doc, child_term_name, child_term, opts={:solr_doc=>solr_doc, :parents=>parents+[{accessor_name=>nodeset.index(node)}] })
    end
  end
  solr_doc
end

Instance Method Details

#solrize_node(node, term_pointer, term, solr_doc = Hash.new, field_mapper = self.field_mapper, opts = {}) ⇒ Object



102
103
104
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 102

def solrize_node(node, term_pointer, term, solr_doc = Hash.new, field_mapper = self.field_mapper, opts={})
  Solrizer::XML::TerminologyBasedSolrizer.solrize_node(node, self, term_pointer, solr_doc, field_mapper, opts)
end

#solrize_term(term, solr_doc = Hash.new, field_mapper = self.field_mapper, opts = {}) ⇒ Object



98
99
100
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 98

def solrize_term(term, solr_doc = Hash.new, field_mapper = self.field_mapper, opts={})
  Solrizer::XML::TerminologyBasedSolrizer.solrize_term(self, term, solr_doc, field_mapper, opts)    
end

#to_solr(solr_doc = Hash.new, field_mapper = self.field_mapper) ⇒ Object

:nodoc:



94
95
96
# File 'lib/solrizer/xml/terminology_based_solrizer.rb', line 94

def to_solr(solr_doc = Hash.new, field_mapper = self.field_mapper) # :nodoc:
  Solrizer::XML::TerminologyBasedSolrizer.solrize(self, solr_doc, field_mapper)
end