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.
- #exists?(pid) ⇒ Boolean
-
#find(args, opts = {}) ⇒ Object
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).
- #find_model(pid) ⇒ Object
-
#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
269 270 271 |
# File 'lib/active_fedora/model.rb', line 269 def attribute_get(name) instance_variable_get("@#{name}") end |
#attribute_set(name, value) ⇒ Object
wrapper around instance_variable_set, sets @name to value
264 265 266 |
# File 'lib/active_fedora/model.rb', line 264 def attribute_set(name, value) instance_variable_set("@#{name}", value) end |
#class_fields ⇒ Object
254 255 256 257 258 259 260 261 |
# File 'lib/active_fedora/model.rb', line 254 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
135 136 137 138 139 140 |
# File 'lib/active_fedora/model.rb', line 135 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.query(q, :raw=>true, :rows=>0)['response']['numFound'] end |
#exists?(pid) ⇒ Boolean
122 123 124 125 |
# File 'lib/active_fedora/model.rb', line 122 def exists?(pid) inner = DigitalObject.find(self, pid) !inner.new? end |
#find(args, opts = {}) ⇒ Object
Returns an Array of objects of the Class that find
is being called on
@param either a pid or :all
104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/active_fedora/model.rb', line 104 def find(args, opts={}) opts = {:rows=>25}.merge(opts) if args == :all escaped_class_uri = SolrService.escape_uri_for_query(self.to_class_uri) q = "#{ActiveFedora::SolrService.solr_name(:has_model, :symbol)}:#{escaped_class_uri}" hits = SolrService.query(q, :rows=>opts[:rows]) return hits.map do |hit| pid = hit[SOLR_DOCUMENT_ID] find_one(pid, opts[:cast]) end elsif args.class == String return find_one(args, opts[:cast]) 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"]
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 248 249 250 251 252 |
# File 'lib/active_fedora/model.rb', line 183 def find_by_fields_by_solr(query_fields,opts={}) ActiveSupport::Deprecation.warn("find_by_fields_by_solr is deprecated and will be removed in the next release") #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)+' asc']}) 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] else key = sort.to_s end sort_direction = sort_direction =~ /^desc/ ? 'desc' : 'asc' 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.join(",") end logger.debug "Querying solr for #{self.name} objects with query: '#{query}'" SolrService.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.
158 159 160 161 162 163 164 165 166 |
# File 'lib/active_fedora/model.rb', line 158 def find_by_solr(query, args={}) if query == :all escaped_class_name = self.name.gsub(/(:)/, '\\:') SolrService.query("#{ActiveFedora::SolrService.solr_name(:active_fedora_model, :symbol)}:#{escaped_class_name}", args) elsif query.class == String escaped_id = query.gsub(/(:)/, '\\:') SolrService.query("#{SOLR_DOCUMENT_ID}:#{escaped_id}", args) end end |
#find_model(pid) ⇒ Object
127 128 129 130 |
# File 'lib/active_fedora/model.rb', line 127 def find_model(pid) ActiveSupport::Deprecation.warn("find_model is deprecated. Use find instead") find(pid) 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.
74 75 76 77 |
# File 'lib/active_fedora/model.rb', line 74 def load_instance(pid) ActiveSupport::Deprecation.warn("load_instance is deprecated. Use find instead") find(pid) end |
#solr_search(query, args = {}) ⇒ Object
Sends a query directly to SolrService
143 144 145 |
# File 'lib/active_fedora/model.rb', line 143 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
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/active_fedora/model.rb', line 83 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 |