class ActiveFedora::Associations::RDF

:nodoc:

def class_ancestors(klass)

Returns:
  • (Array) -

Parameters:
  • klass (Class) --
def class_ancestors(klass)
  klass.ancestors.select {|k| k.instance_of?(Class) } - [Object, BasicObject]
end

def destroy

def destroy
  filtered_results.each do |candidate|
    owner.resource.delete([owner.rdf_subject, reflection.predicate, candidate])
  end
end

def filter_by_class(candidate_uris)

Returns:
  • (Array) -
def filter_by_class(candidate_uris)
  return [] if candidate_uris.empty?
  ids = candidate_uris.map {|uri| ActiveFedora::Base.uri_to_id(uri) }
  results = ActiveFedora::SolrService.query(ActiveFedora::SolrQueryBuilder.construct_query_for_ids(ids), rows: 10000)
  docs = results.select do |result|
    ActiveFedora::QueryResultBuilder.classes_from_solr_document(result).any? { |klass|
      class_ancestors(klass).include? reflection.klass
    }
  end
  docs.map {|doc| ::RDF::URI.new(ActiveFedora::Base.id_to_uri(doc['id']))}
end

def filtered_results

Returns:
  • (Array) - the rdf results filtered to objects that match the specified class_name consraint
def filtered_results
  if filtering_required?
    filter_by_class(rdf_uris)
  else
    rdf_uris
  end
end

def filtering_required?

TODO Detect when this is the only relationship for this predicate, then skip the filtering.
def filtering_required?
  reflection.klass != ActiveFedora::Base
end

def rdf_query

Returns:
  • (Array) -
def rdf_query
  owner.resource.query(subject: owner.rdf_subject, predicate: reflection.predicate).enum_statement
end

def rdf_uris

Returns:
  • (Array) -
def rdf_uris
  rdf_query.map(&:object)
end

def reader

def reader
  filtered_results.map { |val| ActiveFedora::Base.uri_to_id(val) }
end

def replace(values)

def replace(values)
  raise "can't modify frozen #{owner.class}" if owner.frozen?
  destroy
  values.each do |value|
    uri = ActiveFedora::Base.id_to_uri(value)
    owner.resource.insert [owner.rdf_subject, reflection.predicate, ::RDF::URI.new(uri)]
  end
  owner.send(:attribute_will_change!, reflection.name)
end