class Redlander::Statement

RDF statement

Public Class Methods

new(source = {}) click to toggle source

Create an RDF statement.

@param [Hash] source @option source [Node, String, URI, nil] :subject @option source [Node, String, URI, nil] :predicate @option source [Node, String, URI, nil] :object @raise [NotImplementedError] if cannot create a Statement from the given source. @raise [RedlandError] if it fails to create a Statement.

# File lib/redlander/statement.rb, line 42
def initialize(source = {})
  # If FFI::Pointer is passed, wrap it instantly,
  # because it can be freed outside before it is used here.
  @source = source.is_a?(FFI::Pointer) ? wrap(source) : source
end

Private Class Methods

finalize_statement(rdf_statement_ptr) click to toggle source

@api private

# File lib/redlander/statement.rb, line 8
def finalize_statement(rdf_statement_ptr)
  proc { Redland.librdf_free_statement(rdf_statement_ptr) }
end

Public Instance Methods

==(other_statement)
Alias for: eql?
eql?(other_statement) click to toggle source
# File lib/redlander/statement.rb, line 111
def eql?(other_statement)
  subject == other_statement.subject &&
    predicate == other_statement.predicate &&
    object == other_statement.object
end
Also aliased as: ==
hash() click to toggle source
# File lib/redlander/statement.rb, line 118
def hash
  self.class.hash + to_s.hash
end
object() click to toggle source

Object of the statement.

@return [Node, nil]

# File lib/redlander/statement.rb, line 75
def object
  if instance_variable_defined?(:@object)
    @object
  else
    rdf_node = Redland.librdf_statement_get_object(rdf_statement)
    @object = rdf_node.null? ? nil : Node.new(rdf_node)
  end
end
object=(node) click to toggle source

Set the object of the statement

@param [Node, nil] node @return [void]

# File lib/redlander/statement.rb, line 106
def object=(node)
  Redland.librdf_statement_set_object(rdf_statement, rdf_node_from(node))
  @object = node
end
predicate() click to toggle source

Predicate of the statement.

@return [Node, nil]

# File lib/redlander/statement.rb, line 63
def predicate
  if instance_variable_defined?(:@predicate)
    @predicate
  else
    rdf_node = Redland.librdf_statement_get_predicate(rdf_statement)
    @predicate = rdf_node.null? ? nil : Node.new(rdf_node)
  end
end
predicate=(node) click to toggle source

Set the predicate of the statement

@param [Node, nil] node @return [void]

# File lib/redlander/statement.rb, line 97
def predicate=(node)
  Redland.librdf_statement_set_predicate(rdf_statement, rdf_node_from(node))
  @predicate = node
end
rdf_statement() click to toggle source

@api private

# File lib/redlander/statement.rb, line 14
def rdf_statement
  unless instance_variable_defined?(:@rdf_statement)
    @rdf_statement = case @source
                     when FFI::Pointer
                       @source
                     when Hash
                       # Create a new statement from nodes
                       s = rdf_node_from(@source[:subject])
                       p = rdf_node_from(@source[:predicate])
                       o = rdf_node_from(@source[:object])
                       Redland.librdf_new_statement_from_nodes(Redlander.rdf_world, s, p, o)
                     else
                       raise NotImplementedError, "Cannot create Statement from '#{@source.inspect}'"
                     end
    raise RedlandError, "Failed to create a new statement" if @rdf_statement.null?
    ObjectSpace.define_finalizer(self, self.class.send(:finalize_statement, @rdf_statement))
  end
  @rdf_statement
end
subject() click to toggle source

Subject of the statment.

@return [Node, nil]

# File lib/redlander/statement.rb, line 51
def subject
  if instance_variable_defined?(:@subject)
    @subject
  else
    rdf_node = Redland.librdf_statement_get_subject(rdf_statement)
    @subject = rdf_node.null? ? nil : Node.new(rdf_node)
  end
end
subject=(node) click to toggle source

Set the subject of the statement

@param [Node, nil] node @return [void]

# File lib/redlander/statement.rb, line 88
def subject=(node)
  Redland.librdf_statement_set_subject(rdf_statement, rdf_node_from(node))
  @subject = node
end
to_s() click to toggle source
# File lib/redlander/statement.rb, line 122
def to_s
  Redland.librdf_statement_to_string(rdf_statement)
end

Private Instance Methods

rdf_node_from(source) click to toggle source

Create a Node from the source and get its rdf_node, or return nil @api private

# File lib/redlander/statement.rb, line 141
def rdf_node_from(source)
  case source
  when NilClass
    nil
  when Node
    Redland.librdf_new_node_from_node(source.rdf_node)
  else
    Redland.librdf_new_node_from_node(Node.new(source).rdf_node)
  end
end
wrap(s) click to toggle source

@api private

# File lib/redlander/statement.rb, line 130
def wrap(s)
  if s.null?
    raise RedlandError, "Failed to create a new statement"
  else
    Redland.librdf_new_statement_from_statement(s)
  end
end