Class: RDF::Repository::Implementation::SerializedTransaction

Inherits:
Transaction show all
Defined in:
vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb

Overview

TODO:

refactor me!

A transaction for the Hamster-based RDF::Repository::Implementation with full serializability.

See Also:

Instance Attribute Summary

Attributes inherited from Transaction

#changes, #graph_name, #options, #repository

Attributes included from Enumerable

#existentials, #universals

Instance Method Summary collapse

Methods inherited from Transaction

begin, #each, #has_statement?, #inspect, #inspect!, #mutable?, #query_execute, #query_pattern, #readable?, #rollback, #writable?

Methods included from Queryable

#concise_bounded_description, #first, #first_literal, #first_object, #first_predicate, #first_subject, #first_value, #lint, #query, #query_execute, #query_pattern, #query_without_sparql

Methods included from Enumerable

add_entailment, #contain?, #dump, #each_graph, #each_object, #each_predicate, #each_quad, #each_statement, #each_subject, #each_term, #each_triple, #entail, #enum_graph, #enum_object, #enum_predicate, #enum_quad, #enum_statement, #enum_subject, #enum_term, #enum_triple, #graph_names, #has_graph?, #has_object?, #has_predicate?, #has_quad?, #has_statement?, #has_subject?, #has_term?, #has_triple?, #invalid?, #method_missing, #objects, #predicates, #project_graph, #quads, #respond_to_missing?, #statements, #subjects, #supports?, #terms, #to_a, #to_h, #to_set, #triples, #valid?, #validate!

Methods included from Util::Aliasing::LateBound

#alias_method

Methods included from Isomorphic

#bijection_to, #isomorphic_with?

Methods included from Countable

#count, #empty?

Methods included from Mutable

#<<, add_entailment, #apply_changeset, #clear, #delete, #delete_insert, #delete_statements, #entail, #entail!, #immutable?, #insert, #load, #method_missing, #mutable?, #respond_to_missing?, #snapshot, #update

Methods included from Util::Coercions

#coerce_statements

Methods included from Writable

#<<, #insert, #insert_graph, #insert_reader, #insert_statements, #writable?

Methods included from RDF::Readable

#readable?

Constructor Details

#initialize(*args, **options, &block) ⇒ SerializedTransaction

Returns a new instance of SerializedTransaction.



522
523
524
525
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 522

def initialize(*args, **options, &block)
  super(*args, **options, &block)
  @base_snapshot = @snapshot
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class RDF::Enumerable

Instance Method Details

#delete_statement(statement) ⇒ Object

Deletes the statement from the transaction's working snapshot.



542
543
544
545
546
547
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 542

def delete_statement(statement)
  @snapshot = @snapshot.class
    .new(data: @snapshot.send(:delete_from, 
                              @snapshot.send(:data), 
                              process_statement(statement)))
end

#executeObject

Note:

this transaction uses a pessimistic merge strategy which fails the transaction if any data has changed in the repository since transaction start time. However, the specific guarantee is softer: multiple concurrent conflicting transactions will not succeed. We may choose to implement a less pessimistic merge strategy as a non-breaking change.

Replaces repository data with the transaction's snapshot in a safely serializable fashion.

Raises:

See Also:



576
577
578
579
580
581
582
583
584
585
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 576

def execute
  raise TransactionError, 'Cannot execute a rolled back transaction. ' \
                          'Open a new one instead.' if @rolledback

  raise TransactionError, 'Error merging transaction. Repository' \
                          'has changed during transaction time.' unless 
    repository.send(:data).equal? @base_snapshot.send(:data)

  repository.send(:data=, @snapshot.send(:data))
end

#insert_statement(statement) ⇒ Object

Inserts the statement to the transaction's working snapshot.



531
532
533
534
535
536
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 531

def insert_statement(statement)
  @snapshot = @snapshot.class
    .new(data: @snapshot.send(:insert_to, 
                              @snapshot.send(:data), 
                              process_statement(statement)))
end

#isolation_levelObject



551
552
553
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 551

def isolation_level
  :serializable
end

#mutated?Boolean

Note:

this is a simple object equality check.

Returns:

  • (Boolean)

See Also:



559
560
561
# File 'vendor/bundler/ruby/2.7.0/bundler/gems/rdf-3c0fc67183db/lib/rdf/repository.rb', line 559

def mutated?
  !@snapshot.send(:data).equal?(repository.send(:data))
end