Module: RDF::Repository::Implementation

Defined in:
lib/rdf/repository.rb

Overview

A default Repository implementation supporting atomic writes and serializable transactions.

See Also:

Constant Summary collapse

DEFAULT_GRAPH =
false
SerializedTransaction =
RDF::Transaction::SerializedTransaction

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extend_object(obj) ⇒ Object



255
256
257
258
259
260
261
262
# File 'lib/rdf/repository.rb', line 255

def self.extend_object(obj)
  obj.instance_variable_set(:@data, obj.options.delete(:data) || 
                                    Hash.new)
  obj.instance_variable_set(:@tx_class, 
                            obj.options.delete(:transaction_class) || 
                            RDF::Transaction::SerializedTransaction)
  super
end

Instance Method Details

#apply_changeset(changeset) ⇒ Object



371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/rdf/repository.rb', line 371

def apply_changeset(changeset)
  data = @data
  changeset.deletes.each do |del|
    if del.constant?
      data = delete_from(data, del)
    else
      # we need this condition to handle wildcard statements
      query_pattern(del) { |stmt| data = delete_from(data, stmt) }
    end
  end
  changeset.inserts.each { |ins| data = insert_to(data, ins) }
  @data = data
end

#countObject

See Also:



283
284
285
286
287
288
289
290
291
# File 'lib/rdf/repository.rb', line 283

def count
  count = 0
  @data.each do |_, ss|
    ss.each do |_, ps|
      ps.each { |_, os| count += os.size }
    end
  end
  count
end

#each_graph(&block) ⇒ Object



323
324
325
326
327
328
329
330
# File 'lib/rdf/repository.rb', line 323

def each_graph(&block)
  if block_given?
    @data.each_key do |gn|
      yield RDF::Graph.new(graph_name: (gn == DEFAULT_GRAPH ? nil : gn), data: self)
    end
  end
  enum_graph
end

#each_statement(&block) ⇒ Object Also known as: each



353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File 'lib/rdf/repository.rb', line 353

def each_statement(&block)
  if block_given?
    @data.each do |g, ss|
      ss.each do |s, ps|
        ps.each do |p, os|
          os.each do |o, object_options|
            yield RDF::Statement.new(s, p, o, object_options.merge(graph_name: g.equal?(DEFAULT_GRAPH) ? nil : g))
          end
        end
      end
    end
  end
  enum_statement
end

#graph?Boolean #graph?(name) ⇒ Boolean Also known as: has_graph?

Overloads:

  • #graph?Boolean

    Returns ‘false` to indicate that this is not a graph.

    Returns:

    • (Boolean)
  • #graph?(name) ⇒ Boolean

    Returns ‘true` if `self` contains the given RDF graph_name.

    Parameters:

    • graph_name (RDF::Resource, false)

      Use value ‘false` to query for the default graph_name

    Returns:

    • (Boolean)


304
305
306
307
308
309
310
# File 'lib/rdf/repository.rb', line 304

def graph?(*args)
  case args.length
  when 0 then false
  when 1 then @data.key?(args.first)
  else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
  end
end

#graph_names(options = nil, &block) ⇒ Object



316
317
318
# File 'lib/rdf/repository.rb', line 316

def graph_names(options = nil, &block)        
  @data.keys.reject { |g| g == DEFAULT_GRAPH }.to_a
end

#isolation_levelObject



387
388
389
# File 'lib/rdf/repository.rb', line 387

def isolation_level
  :snapshot
end

#snapshotDataset

A readable & queryable snapshot of the repository for isolated reads.

Returns:

  • (Dataset)

    an immutable Dataset containing a current snapshot of the Repository contents.

See Also:



398
399
400
# File 'lib/rdf/repository.rb', line 398

def snapshot
  self.class.new(data: @data).freeze
end

#statement?Boolean #statement?(statement) ⇒ Object Also known as: has_statement?

Overloads:

  • #statement?Boolean

    Returns ‘false` indicating this is not an RDF::Statemenet.

    Returns:

    • (Boolean)

    See Also:

  • #statement?(statement) ⇒ Object


341
342
343
344
345
346
347
# File 'lib/rdf/repository.rb', line 341

def statement?(*args)
  case args.length
  when 0 then false
  when 1 then args.first && statement_in?(@data, args.first)
  else raise ArgumentError("wrong number of arguments (given #{args.length}, expected 0 or 1)")
  end
end

#supports?(feature) ⇒ Boolean

Returns:

  • (Boolean)

See Also:



267
268
269
270
271
272
273
274
275
276
277
278
# File 'lib/rdf/repository.rb', line 267

def supports?(feature)
  case feature.to_sym
  when :graph_name       then @options[:with_graph_name]
  when :validity         then @options.fetch(:with_validity, true)
  when :literal_equality then true
  when :atomic_write     then true
  when :quoted_triples   then true
  when :base_direction   then true
  when :snapshots        then true
  else false
  end
end