class Redlander::Query::Results

@api private

Public Class Methods

new(q, options = {}) click to toggle source

(see Model#query)

# File lib/redlander/query/results.rb, line 17
def initialize(q, options = {})
  language = options[:language] || "sparql10"
  language_uri = options[:language_uri] && options[:language_uri].to_s
  base_uri = options[:base_uri] && options[:base_uri].to_s

  @rdf_query = Redland.librdf_new_query(Redlander.rdf_world, language, language_uri, q, base_uri)
  raise RedlandError, "Failed to create a #{language.upcase} query from '#{q}'" if @rdf_query.null?

  ObjectSpace.define_finalizer(self, self.class.send(:finalize_query, @rdf_query))
end

Private Class Methods

finalize_query(rdf_query_ptr) click to toggle source

@api private

# File lib/redlander/query/results.rb, line 11
def finalize_query(rdf_query_ptr)
  proc { Redland.librdf_free_query(rdf_query_ptr) }
end

Public Instance Methods

bindings?() click to toggle source
# File lib/redlander/query/results.rb, line 72
def bindings?
  !Redland.librdf_query_results_is_bindings(@rdf_results).zero?
end
boolean?() click to toggle source
# File lib/redlander/query/results.rb, line 76
def boolean?
  !Redland.librdf_query_results_is_boolean(@rdf_results).zero?
end
each() { |self| ... } click to toggle source
# File lib/redlander/query/results.rb, line 61
def each
  if block_given?
    while Redland.librdf_query_results_finished(@rdf_results).zero?
      yield self
      Redland.librdf_query_results_next(@rdf_results)
    end
  else
    enum_for(:each)
  end
end
graph?() click to toggle source
# File lib/redlander/query/results.rb, line 80
def graph?
  !Redland.librdf_query_results_is_graph(@rdf_results).zero?
end
process(model) { |process_bindings| ... } click to toggle source
# File lib/redlander/query/results.rb, line 28
def process(model)
  @rdf_results = Redland.librdf_model_query_execute(model.rdf_model, @rdf_query)

  begin
    case
    when bindings?
      if block_given?
        return nil if @rdf_results.null?
        each { yield process_bindings }
      else
        return [] if @rdf_results.null?
        map { process_bindings }
      end
    when boolean?
      return nil if @rdf_results.null?
      process_boolean
    when graph?
      return nil if @rdf_results.null?
      if block_given?
        process_graph { |statement| yield statement }
      else
        process_graph
      end
    when syntax?
      process_syntax
    else
      raise RedlandError, "Cannot determine the type of query results"
    end
  ensure
    Redland.librdf_free_query_results(@rdf_results)
  end
end
syntax?() click to toggle source
# File lib/redlander/query/results.rb, line 84
def syntax?
  !Redland.librdf_query_results_is_syntax(@rdf_results).zero?
end

Private Instance Methods

process_bindings() click to toggle source
# File lib/redlander/query/results.rb, line 91
def process_bindings
  {}.tap do |bindings|
    n = Redland.librdf_query_results_get_bindings_count(@rdf_results)
    while n > 0
      name = Redland.librdf_query_results_get_binding_name(@rdf_results, n-1)
      value = Redland.librdf_query_results_get_binding_value(@rdf_results, n-1)
      unless value.null?
        bindings[name] = Node.new(value)
        Redland.librdf_free_node(value)
      end
      n -= 1
    end
  end
end
process_boolean() click to toggle source
# File lib/redlander/query/results.rb, line 106
def process_boolean
  value = Redland.librdf_query_results_get_boolean(@rdf_results)
  return value >= 0 ? !value.zero? : nil
end
process_graph() { |statement| ... } click to toggle source
# File lib/redlander/query/results.rb, line 111
def process_graph
  rdf_stream = Redland.librdf_query_results_as_stream(@rdf_results)
  if block_given?
    while Redland.librdf_stream_end(rdf_stream).zero?
      statement = Statement.new(Redland.librdf_stream_get_object(rdf_stream))
      yield statement
      Redland.librdf_stream_next(rdf_stream)
    end
  else
    Model.new.tap do |model|
      Redland.librdf_model_add_statements(model.rdf_model, rdf_stream)
    end
  end
ensure
  Redland.librdf_free_stream(rdf_stream)
end
process_syntax() click to toggle source
# File lib/redlander/query/results.rb, line 128
def process_syntax
  raise NotImplementedError, "Don't know how to handle syntax type results"
end