Class: PgGraph::Data::Database
- Inherits:
-
DatabaseObject
- Object
- Node
- DatabaseObject
- PgGraph::Data::Database
- Defined in:
- lib/pg_graph.rb,
lib/pg_graph/data/data.rb,
lib/pg_graph/data/read.rb
Instance Attribute Summary
Attributes inherited from Node
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#data ⇒ Object
(also: #to_h)
Return database as a hash from schema name to schema hash.
-
#database ⇒ Object
Redefine DatabaseObject#database to return self.
-
#dot(uid) ⇒ Object
Return object by the given UID.
- #dup ⇒ Object
-
#each(&block) ⇒ Object
Iterate schemas.
-
#initialize(type, data_source = nil) ⇒ Database
constructor
data_sourcecan be a PgConn object, a Hash, or nil. -
#is_a?(klass) ⇒ Boolean
Make Database pretend it is a PgGraph::Data object.
-
#lookup(path, id = nil) ⇒ Object
TODO: Maybe use this instead of #dot.
-
#read(arg) ⇒ Object
:call-seq: read(connection) read(hash) read(yaml).
-
#read_connection(conn) ⇒ Object
load data from connection.
-
#read_hash(hash) ⇒ Object
load data from hash.
-
#schemas ⇒ Object
List of Schema objects.
- #to_exec_sql(ids: {}, delete: :all) ⇒ Object
- #to_psql_sql(files = [], ids: {}, delete: :all) ⇒ Object
-
#to_sql(format: :sql, ids: {}, delete: :all, truncate: :none, files: []) ⇒ Object
Note that #to_sql in derived classes should be deleted FIXME.
-
#to_yaml ⇒ Object
The #to_yaml format is like #to_h but with records formatted as an array instead of as a map from ID to record.
-
#write(connection, ids: {}, delete: :all) ⇒ Object
Write data to database.
Methods inherited from DatabaseObject
Methods inherited from Node
#inspect, #object, #value, #value_type
Constructor Details
#initialize(type, data_source = nil) ⇒ Database
data_source can be a PgConn object, a Hash, or nil
85 86 87 88 89 90 91 92 93 |
# File 'lib/pg_graph/data/data.rb', line 85 def initialize(type, data_source = nil) constrain type, PgGraph::Type::Database constrain data_source, PgConn, Hash, NilClass @queued_objects = [] # has to go before super @objects = nil # Object cache. Maps from UID to object. Has to go before super super(type) initialize_impl read(data_source) if data_source end |
Instance Method Details
#==(other) ⇒ Object
118 |
# File 'lib/pg_graph/data/data.rb', line 118 def ==(other) to_h == other.to_h end |
#data ⇒ Object Also known as: to_h
Return database as a hash from schema name to schema hash
107 |
# File 'lib/pg_graph/data/data.rb', line 107 def data() @impl.map { |k,v| [k, v.data] }.to_h end |
#database ⇒ Object
Redefine DatabaseObject#database to return self
79 |
# File 'lib/pg_graph/data/data.rb', line 79 def database() self end |
#dot(uid) ⇒ Object
Return object by the given UID
110 |
# File 'lib/pg_graph/data/data.rb', line 110 def dot(uid) @objects ||= map_objects[uid] end |
#each(&block) ⇒ Object
Iterate schemas
104 |
# File 'lib/pg_graph/data/data.rb', line 104 def each(&block) schemas.each { |schema| yield schema } end |
#is_a?(klass) ⇒ Boolean
Make Database pretend it is a PgGraph::Data object
111 |
# File 'lib/pg_graph.rb', line 111 def is_a?(arg) arg == PgGraph::Data || super end |
#lookup(path, id = nil) ⇒ Object
TODO: Maybe use this instead of #dot
113 114 115 116 |
# File 'lib/pg_graph/data/data.rb', line 113 def lookup(path, id = nil) object = (@objects ||= map_objects)[path] id.nil? ? object : object[id] end |
#read(arg) ⇒ Object
:call-seq:
read(connection)
read(hash)
read(yaml)
Read data from a source. Returns self
147 148 149 150 151 152 153 154 |
# File 'lib/pg_graph/data/data.rb', line 147 def read(arg) constrain arg, PgConn, Hash case arg when PgConn; read_connection(arg) when Hash; read_hash(arg) end self end |
#read_connection(conn) ⇒ Object
load data from connection
7 8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/pg_graph/data/read.rb', line 7 def read_connection(conn) constrain conn, PgConn::Connection initialize_impl for schema in type.schemas for table in schema.tables for record in conn.records("select * from #{table.uid}") Record.new(self[schema.name][table.name], record) end end end self end |
#read_hash(hash) ⇒ Object
load data from hash. The hash can be produced by #to_h or #to_yaml
TODO: Check for unknown keys
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/pg_graph/data/read.rb', line 23 def read_hash(hash) constrain hash, Hash initialize_impl # Works on to #to_h and #to_yaml hashes because it is easier to handle # the two formats dynamically than detecting which format to use for schema in type.schemas next if !hash.key?(schema.name) hash_schema = hash[schema.name] for table in schema.tables next if !hash[schema.name].key?(table.name) hash_table = hash_schema[table.name] records = hash_table.is_a?(Hash) ? hash_table.values : hash_table for record in records Record.new(self[schema.name][table.name], record) end end end self end |
#schemas ⇒ Object
List of Schema objects
82 |
# File 'lib/pg_graph/data/data.rb', line 82 def schemas() @impl.values end |
#to_exec_sql(ids: {}, delete: :all) ⇒ Object
132 133 134 |
# File 'lib/pg_graph/data/data.rb', line 132 def to_exec_sql(ids: {}, delete: :all) to_sql(format: :exec, ids: ids, delete: delete) end |
#to_psql_sql(files = [], ids: {}, delete: :all) ⇒ Object
136 137 138 |
# File 'lib/pg_graph/data/data.rb', line 136 def to_psql_sql(files = [], ids: {}, delete: :all) to_sql(format: :psql, ids: ids, delete: delete, files: files) end |
#to_sql(format: :sql, ids: {}, delete: :all, truncate: :none, files: []) ⇒ Object
Note that #to_sql in derived classes should be deleted FIXME
127 128 129 130 |
# File 'lib/pg_graph/data/data.rb', line 127 def to_sql(format: :sql, ids: {}, delete: :all, truncate: :none, files: []) render = SqlRender.new(self, format, ids: ids, delete: delete, truncate: truncate, files: files) render.to_s end |
#to_yaml ⇒ Object
The #to_yaml format is like #to_h but with records formatted as an array instead of as a map from ID to record
124 |
# File 'lib/pg_graph/data/data.rb', line 124 def to_yaml() @impl.map { |k,v| [k, v.to_yaml] }.to_h end |
#write(connection, ids: {}, delete: :all) ⇒ Object
Write data to database. ids is a hash from table UID to id. If a record has an ID equal to or less than the corresponding ID in ids, the SQL will be rendered as an ‘update’ statement instead of an ‘insert’ statement. Returns self
160 161 162 163 164 165 |
# File 'lib/pg_graph/data/data.rb', line 160 def write(connection, ids: {}, delete: :all) constrain connection, PgConn constrain ids, { String => Integer } connection.exec(to_exec_sql(ids: ids, delete: delete)) self end |