Class: JetSet::Session
- Inherits:
-
Object
- Object
- JetSet::Session
- Defined in:
- lib/jet_set/session.rb
Instance Method Summary collapse
-
#attach(*objects) ⇒ Object
Makes an object to be tracked by the session.
-
#fetch(type, expression, params = {}, &block) ⇒ Object
Fetches root entity using a result of
executemethod. -
#finalize ⇒ Object
Saves all changes of attached objects to the database.
-
#initialize(sequel, mapper, query_parser, entity_builder, dependency_graph) ⇒ Session
constructor
Initializes
Sessionobject. -
#preload(target, relation, query, params = {}, &block) ⇒ Object
Loads nested references and collections using sub-query for previously loaded aggregation root, see
mapmethod.
Constructor Details
#initialize(sequel, mapper, query_parser, entity_builder, dependency_graph) ⇒ Session
Initializes Session object. Parameters:
sequel-
Sequel sequel object.
mapper-
Sequel rows to Ruby objects mapper.
query_parser-
a parser which evaluates JetSet extensions in SQL-expressions.
10 11 12 13 14 15 16 17 18 |
# File 'lib/jet_set/session.rb', line 10 def initialize(sequel, mapper, query_parser, entity_builder, dependency_graph) @sequel = sequel @mapper = mapper @objects = [] @query_parser = query_parser @entity_builder = entity_builder @dependency_graph = dependency_graph @mutex = Mutex.new end |
Instance Method Details
#attach(*objects) ⇒ Object
Makes an object to be tracked by the session. Since this moment all related to object changes will be saved on session finalization. Use this method for newly created aggregation roots. No need to use it for new objects that were bound to a root which is already attached. All objects loaded from the database are already under the session tracking. Parameters:
objects-
any Ruby objects defined in the mapping.
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/jet_set/session.rb', line 81 def attach(*objects) to_attach = [] objects.each do |object| if object.is_a? Array object.each{|o| to_attach << o} else to_attach << object end end @mutex.synchronize do to_attach.each do |object| if object.kind_of?(Entity) obj = object else obj = @entity_builder.create(object) obj.validate! if obj.respond_to? :validate! end @objects << obj end end end |
#fetch(type, expression, params = {}, &block) ⇒ Object
Fetches root entity using a result of execute method. Parameters:
type-
Ruby class of an object to map.
expression-
SQL-like query
params-
queryparams - &block
-
further handling of the result.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/jet_set/session.rb', line 26 def fetch(type, expression, params = {}, &block) unless type.is_a? Class raise MapperError, 'Parameter "type" should be a Class.' end query = @query_parser.parse(expression) unless query.refers_to?(type) raise MapperError, "The query doesn't contain \"AS ENTITY #{type.name.underscore}\" statement." end rows = @sequel.fetch(query.sql, params).to_a if rows.length == 0 result = nil elsif rows.length == 1 && query.returns_single_item? result = @mapper.map(type, rows[0], self) else if query.returns_single_item? raise MapperError, "A single row was expected to map but the query returned #{rows.length} rows." end result = [] rows.each do |row| result << @mapper.map(type, row, self) end end if block_given? instance_exec(result, &block) end result end |
#finalize ⇒ Object
Saves all changes of attached objects to the database.
-
Compatible with
Hypo::Scopefinalizeinterface,
see Hypo docs at github.com/cylon-v/hypo.
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/jet_set/session.rb', line 108 def finalize dirty_objects = @objects.select {|object| object.dirty?} ordered_objects = @dependency_graph.order(dirty_objects) begin if ordered_objects.length > 0 @sequel.transaction do ordered_objects.each{|obj| obj.flush(@sequel)} end end ensure @mutex.synchronize do @objects = [] end end end |
#preload(target, relation, query, params = {}, &block) ⇒ Object
Loads nested references and collections using sub-query for previously loaded aggregation root, see map method. Parameters:
target-
single or multiple entities that are a Ruby objects constructed by
maporpreloadmethod. relation-
an object reference or collection name defined in JetSet mapping for the
target.
64 65 66 67 68 69 70 71 72 |
# File 'lib/jet_set/session.rb', line 64 def preload(target, relation, query, params = {}, &block) query = @query_parser.parse(query) rows = @sequel.fetch(query.sql, params).to_a result = @mapper.map_association(target, relation, rows, self) if block_given? instance_exec(result[:result], result[:ids], &block) end end |