Module: ActiveFedora::Model::ClassMethods
- Defined in:
- lib/active_fedora/model.rb
Overview
Class Methods
These methods are mixed into the inheriting class.
Accessor and mutator methods are dynamically generated based on the contents of the @@field_spec hash, which stores the field specifications recorded during invocation of has_metadata.
Each metadata field will generate 3 methods:
fieldname_values
*returns the current values array for this field
fieldname_values=(val)
*store val as the values array. val
may be a single string, or an array of strings
(single items become single element arrays).
fieldname_append(val)
*appends val to the values array.
Instance Method Summary collapse
-
#attribute_get(name) ⇒ Object
wrapper around instance_variable_get, returns current value of @name.
-
#attribute_set(name, value) ⇒ Object
wrapper around instance_variable_set, sets @name to value.
- #class_fields ⇒ Object
-
#count(args = {}) ⇒ Object
Get a count of the number of objects from solr Takes :conditions as an argument.
-
#find(args, opts = {}) ⇒ Object
Takes :all or a pid as arguments Returns an Array of objects of the Class that
find
is being called on. -
#find_by_fields_by_solr(query_fields, opts = {}) ⇒ Object
Find all ActiveFedora objects for this model that match arguments passed in by querying Solr.
-
#find_by_solr(query, args = {}) ⇒ Object
If query is :all, this method will query Solr for all instances of self.type (based on active_fedora_model_s as indexed by Solr).
-
#load_instance(pid) ⇒ Object
Retrieve the Fedora object with the given pid and deserialize it as an instance of the current model Note that you can actually pass a pid into this method, regardless of Fedora model type, and ActiveFedora will try to parse the results into the current type of self, which may or may not be what you want.
-
#solr_search(query, args = {}) ⇒ Object
Sends a query directly to SolrService.
-
#to_class_uri(attrs = {}) ⇒ Object
Returns a suitable uri object for :has_model Should reverse Model#from_class_uri.
Instance Method Details
#attribute_get(name) ⇒ Object
wrapper around instance_variable_get, returns current value of @name
264 265 266 |
# File 'lib/active_fedora/model.rb', line 264 def attribute_get(name) instance_variable_get("@#{name}") end |
#attribute_set(name, value) ⇒ Object
wrapper around instance_variable_set, sets @name to value
259 260 261 |
# File 'lib/active_fedora/model.rb', line 259 def attribute_set(name, value) instance_variable_set("@#{name}", value) end |
#class_fields ⇒ Object
249 250 251 252 253 254 255 256 |
# File 'lib/active_fedora/model.rb', line 249 def class_fields #create dummy object that is empty by passing in fake pid object = self.new()#{:pid=>'FAKE'}) fields = object.fields #reset id to nothing fields[:id][:values] = [] return fields end |
#count(args = {}) ⇒ Object
Get a count of the number of objects from solr Takes :conditions as an argument
131 132 133 134 135 136 |
# File 'lib/active_fedora/model.rb', line 131 def count(args = {}) escaped_class_uri = SolrService.escape_uri_for_query(self.to_class_uri) q = "#{ActiveFedora::SolrService.solr_name(:has_model, :symbol)}:#{escaped_class_uri}" q << " AND #{args[:conditions]}" if args[:conditions] SolrService.instance.conn.query(q, :rows=>0).total_hits end |
#find(args, opts = {}) ⇒ Object
Takes :all or a pid as arguments Returns an Array of objects of the Class that find
is being called on
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/active_fedora/model.rb', line 104 def find(args, opts={}) opts = {:rows=>25}.merge(opts) return_multiple = false if args == :all return_multiple = true escaped_class_uri = SolrService.escape_uri_for_query(self.to_class_uri) q = "#{ActiveFedora::SolrService.solr_name(:has_model, :symbol)}:#{escaped_class_uri}" elsif args.class == String escaped_id = args.gsub(/(:)/, '\\:') q = "#{SOLR_DOCUMENT_ID}:#{escaped_id}" end if return_multiple == true hits = SolrService.instance.conn.query(q, :rows=>opts[:rows]).hits else hits = SolrService.instance.conn.query(q).hits end if return_multiple return hits.map do |hit| RubydoraConnection.instance.find_model(hit[SOLR_DOCUMENT_ID], self) end else return RubydoraConnection.instance.find_model(hits.first[SOLR_DOCUMENT_ID], self) if hits.first end end |
#find_by_fields_by_solr(query_fields, opts = {}) ⇒ Object
Find all ActiveFedora objects for this model that match arguments passed in by querying Solr. Like find_by_solr this returns a solr result.
query_fields a hash of object field names and values to filter on (query_fields must be the solr_field_name for non-MetadataDatastream derived datastreams) opts specifies options for the solr query
options may include:
:sort => array of hash with one hash per sort by field... defaults to [{system_create=>:descending}]
:default_field, :rows, :filter_queries, :debug_query,
:explain_other, :facets, :highlighting, :mlt,
:operator => :or / :and
:start => defaults to 0
:field_list => array, defaults to ["*", "score"]
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 |
# File 'lib/active_fedora/model.rb', line 179 def find_by_fields_by_solr(query_fields,opts={}) #create solr_args from fields passed in, needs to be comma separated list of form field1=value1,field2=value2,... escaped_class_name = self.name.gsub(/(:)/, '\\:') query = "#{ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol)}:#{escaped_class_name}" query_fields.each_pair do |key,value| unless value.nil? solr_key = key #convert to symbol if need be key = key.to_sym if !class_fields.has_key?(key)&&class_fields.has_key?(key.to_sym) #do necessary mapping with suffix in most cases, otherwise ignore as a solr field key that activefedora does not know about if class_fields.has_key?(key) && class_fields[key].has_key?(:type) type = class_fields[key][:type] type = :string unless type.kind_of?(Symbol) solr_key = ActiveFedora::SolrService.solr_name(key,type) end escaped_value = value.gsub(/(:)/, '\\:') #escaped_value = escaped_value.gsub(/ /, '\\ ') key = SOLR_DOCUMENT_ID if (key === :id || key === :pid) query = key.to_s.eql?(SOLR_DOCUMENT_ID) ? "#{query} AND #{key}:#{escaped_value}" : "#{query} AND #{solr_key}:#{escaped_value}" end end query_opts = {} opts.each do |key,value| key = key.to_sym query_opts[key] = value end #set default sort to created date ascending unless query_opts.include?(:sort) query_opts.merge!({:sort=>[ActiveFedora::SolrService.solr_name(:system_create,:date)=>:ascending]}) else #need to convert to solr names for all fields sort_array =[] opts[:sort].collect do |sort| sort_direction = :ascending if sort.respond_to?(:keys) key = sort.keys[0] sort_direction = sort[key] sort_direction =~ /^desc/ ? sort_direction = :descending : :ascending else key = sort.to_s end field_name = key if key.to_s =~ /^system_create/ field_name = :system_create_date key = :system_create elsif key.to_s =~ /^system_mod/ field_name = :system_modified_date key = :system_modified end solr_name = field_name if class_fields.include?(field_name.to_sym) solr_name = ActiveFedora::SolrService.solr_name(key,class_fields[field_name.to_sym][:type]) end sort_array.push({solr_name=>sort_direction}) end query_opts[:sort] = sort_array end logger.debug "Querying solr for #{self.name} objects with query: '#{query}'" results = ActiveFedora::SolrService.instance.conn.query(query,query_opts) end |
#find_by_solr(query, args = {}) ⇒ Object
If query is :all, this method will query Solr for all instances
of self.type (based on active_fedora_model_s as indexed
by Solr). If the query is any other string, this method simply does
a pid based search (id:query).
Note that this method does _not_ return ActiveFedora::Model
objects, but rather an array of SolrResults.
Args is an options hash, which is passed into the SolrService
connection instance.
154 155 156 157 158 159 160 161 162 |
# File 'lib/active_fedora/model.rb', line 154 def find_by_solr(query, args={}) if query == :all escaped_class_name = self.name.gsub(/(:)/, '\\:') SolrService.instance.conn.query("#{ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol)}:#{escaped_class_name}", args) elsif query.class == String escaped_id = query.gsub(/(:)/, '\\:') SolrService.instance.conn.query("#{SOLR_DOCUMENT_ID}:#{escaped_id}", args) end end |
#load_instance(pid) ⇒ Object
Retrieve the Fedora object with the given pid and deserialize it as an instance of the current model Note that you can actually pass a pid into this method, regardless of Fedora model type, and ActiveFedora will try to parse the results into the current type of self, which may or may not be what you want.
81 82 83 |
# File 'lib/active_fedora/model.rb', line 81 def load_instance(pid) RubydoraConnection.instance.find_model(pid, self) end |
#solr_search(query, args = {}) ⇒ Object
Sends a query directly to SolrService
139 140 141 |
# File 'lib/active_fedora/model.rb', line 139 def solr_search(query, args={}) SolrService.instance.conn.query(query, args) end |
#to_class_uri(attrs = {}) ⇒ Object
Returns a suitable uri object for :has_model Should reverse Model#from_class_uri
87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/active_fedora/model.rb', line 87 def to_class_uri(attrs = {}) unless self.respond_to? :pid_suffix pid_suffix = attrs.has_key?(:pid_suffix) ? attrs[:pid_suffix] : ContentModel::CMODEL_PID_SUFFIX else pid_suffix = self.pid_suffix end unless self.respond_to? :pid_namespace namespace = attrs.has_key?(:namespace) ? attrs[:namespace] : ContentModel::CMODEL_NAMESPACE else namespace = self.pid_namespace end "info:fedora/#{namespace}:#{ContentModel.sanitized_class_name(self)}#{pid_suffix}" end |