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
- #class_fields ⇒ Object deprecated Deprecated.
-
#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 deprecated Deprecated.
-
#find_by_solr(query, args = {}) ⇒ Object
@deprecated 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_each(conditions = {}, opts = {}) ⇒ Object
Yields the found ActiveFedora::Base object to the passed block.
-
#find_in_batches(conditions, opts = {}) ⇒ Object
Yields each batch of solr records that was found by the find
options
as an array. - #find_model(pid) ⇒ Object deprecated Deprecated.
-
#find_with_conditions(conditions, opts = {}) ⇒ Object
Returns a solr result matching the supplied conditions @param conditions can either be specified as a string, or hash representing the query part of an solr statement.
-
#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.
- #quote_for_solr(value) ⇒ Object
- #solr_search(query, args = {}) ⇒ Object deprecated Deprecated.
-
#to_class_uri(attrs = {}) ⇒ Object
Returns a suitable uri object for :has_model Should reverse Model#from_class_uri.
Instance Method Details
#class_fields ⇒ Object
321 322 323 324 325 326 327 328 |
# File 'lib/active_fedora/model.rb', line 321 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
178 179 180 181 182 |
# File 'lib/active_fedora/model.rb', line 178 def count(args = {}) q = search_model_clause q << " AND #{args[:conditions]}" if args[:conditions] SolrService.query(q, :raw=>true, :rows=>0)['response']['numFound'] end |
#exists?(pid) ⇒ Boolean
164 165 166 167 |
# File 'lib/active_fedora/model.rb', line 164 def exists?(pid) inner = DigitalObject.find_or_initialize(self, pid) !inner.new? end |
#find(args, opts = {}) ⇒ Object
Returns an Array of objects of the Class that find
is being called on
@param args either a pid or :all or a hash of conditions
102 103 104 105 106 107 108 109 110 |
# File 'lib/active_fedora/model.rb', line 102 def find(args, opts={}) return find_one(args, opts[:cast]) if args.class == String args = {} if args == :all results = [] find_each(args, opts) do |obj| results << obj end results 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"]
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
# File 'lib/active_fedora/model.rb', line 229 def find_by_fields_by_solr(query_fields,opts={}) ActiveSupport::Deprecation.warn("find_by_fields_by_solr is deprecated and will be removed in 5.0") #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
@deprecated
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.
202 203 204 205 206 207 208 209 210 211 |
# File 'lib/active_fedora/model.rb', line 202 def find_by_solr(query, args={}) ActiveSupport::Deprecation.warn("find_by_fields_by_solr is deprecated and will be removed in 5.0. Use find_with_conditions instead.") 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_each(conditions = {}, opts = {}) ⇒ Object
Yields the found ActiveFedora::Base object to the passed block
152 153 154 155 156 157 158 |
# File 'lib/active_fedora/model.rb', line 152 def find_each( conditions={}, opts={}) find_in_batches(conditions, opts.merge({:fl=>SOLR_DOCUMENT_ID})) do |group| group.each do |hit| yield(find_one(hit[SOLR_DOCUMENT_ID], opts[:cast])) end end end |
#find_in_batches(conditions, opts = {}) ⇒ Object
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/active_fedora/model.rb', line 128 def find_in_batches conditions, opts={} opts[:q] = create_query(conditions) opts[:qt] = 'standard' #set default sort to created date ascending unless opts.include?(:sort) opts[:sort]=[ActiveFedora::SolrService.solr_name(:system_create,:date)+' asc'] end batch_size = opts.delete(:batch_size) || 1000 counter = 0 begin counter += 1 response = ActiveFedora::SolrService.instance.conn.paginate counter, batch_size, "select", :params => opts docs = response["response"]["docs"] yield docs end while docs.has_next? end |
#find_model(pid) ⇒ Object
170 171 172 173 |
# File 'lib/active_fedora/model.rb', line 170 def find_model(pid) ActiveSupport::Deprecation.warn("find_model is deprecated. Use find instead") find(pid) end |
#find_with_conditions(conditions, opts = {}) ⇒ Object
Returns a solr result matching the supplied conditions @param conditions can either be specified as a string, or hash representing the query part of an solr statement. If a hash is provided, this method will generate conditions based simple equality combined using the boolean AND operator. @param options
308 309 310 311 312 313 314 |
# File 'lib/active_fedora/model.rb', line 308 def find_with_conditions(conditions, opts={}) #set default sort to created date ascending unless opts.include?(:sort) opts[:sort]=[ActiveFedora::SolrService.solr_name(:system_create,:date)+' asc'] end SolrService.query(create_query(conditions), opts) 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.
72 73 74 75 |
# File 'lib/active_fedora/model.rb', line 72 def load_instance(pid) ActiveSupport::Deprecation.warn("load_instance is deprecated. Use find instead") find(pid) end |
#quote_for_solr(value) ⇒ Object
316 317 318 |
# File 'lib/active_fedora/model.rb', line 316 def quote_for_solr(value) '"' + value.gsub(/(:)/, '\\:').gsub(/"/, '\\"') + '"' end |
#solr_search(query, args = {}) ⇒ Object
Sends a query directly to SolrService
186 187 188 189 |
# File 'lib/active_fedora/model.rb', line 186 def solr_search(query, args={}) ActiveSupport::Deprecation.warn("solr_search is deprecated and will be removed in the next release. Use SolrService.query instead") 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
81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/active_fedora/model.rb', line 81 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 |