Class: Trifle::Stats::Driver::Postgres
- Inherits:
-
Object
- Object
- Trifle::Stats::Driver::Postgres
- Includes:
- Mixins::Packer
- Defined in:
- lib/trifle/stats/driver/postgres.rb
Instance Attribute Summary collapse
-
#client ⇒ Object
Returns the value of attribute client.
-
#separator ⇒ Object
Returns the value of attribute separator.
-
#table_name ⇒ Object
Returns the value of attribute table_name.
Class Method Summary collapse
Instance Method Summary collapse
- #description ⇒ Object
- #get(keys:) ⇒ Object
- #get_all(keys:) ⇒ Object
- #get_query(keys:) ⇒ Object
- #inc(keys:, **values) ⇒ Object
- #inc_query(key:, data:) ⇒ Object
-
#initialize(client = PG::Connection.new, table_name: 'trifle_stats') ⇒ Postgres
constructor
A new instance of Postgres.
- #ping ⇒ Object
- #scan ⇒ Object
- #set(keys:, **values) ⇒ Object
- #set_query(key:, data:) ⇒ Object
Methods included from Mixins::Packer
Constructor Details
#initialize(client = PG::Connection.new, table_name: 'trifle_stats') ⇒ Postgres
Returns a new instance of Postgres.
12 13 14 15 16 |
# File 'lib/trifle/stats/driver/postgres.rb', line 12 def initialize(client = PG::Connection.new, table_name: 'trifle_stats') @client = client @table_name = table_name @separator = '::' end |
Instance Attribute Details
#client ⇒ Object
Returns the value of attribute client.
10 11 12 |
# File 'lib/trifle/stats/driver/postgres.rb', line 10 def client @client end |
#separator ⇒ Object
Returns the value of attribute separator.
10 11 12 |
# File 'lib/trifle/stats/driver/postgres.rb', line 10 def separator @separator end |
#table_name ⇒ Object
Returns the value of attribute table_name.
10 11 12 |
# File 'lib/trifle/stats/driver/postgres.rb', line 10 def table_name @table_name end |
Class Method Details
.setup!(client = PG::Connection.new, table_name: 'trifle_stats') ⇒ Object
18 19 20 |
# File 'lib/trifle/stats/driver/postgres.rb', line 18 def self.setup!(client = PG::Connection.new, table_name: 'trifle_stats') client.exec("CREATE TABLE #{table_name} (key VARCHAR(255) PRIMARY KEY, data JSONB NOT NULL DEFAULT '{}'::jsonb)") # rubocop:disable Layout/LineLength end |
Instance Method Details
#description ⇒ Object
22 23 24 |
# File 'lib/trifle/stats/driver/postgres.rb', line 22 def description "#{self.class.name}(J)" end |
#get(keys:) ⇒ Object
62 63 64 65 66 67 68 |
# File 'lib/trifle/stats/driver/postgres.rb', line 62 def get(keys:) pkeys = keys.map { |key| key.join(separator) } data = get_all(keys: pkeys) map = data.inject({}) { |o, d| o.merge(d[:key] => d[:data]) } pkeys.map { |pkey| self.class.unpack(hash: map.fetch(pkey, {})) } end |
#get_all(keys:) ⇒ Object
70 71 72 73 74 75 76 77 78 |
# File 'lib/trifle/stats/driver/postgres.rb', line 70 def get_all(keys:) results = client.exec_params(get_query(keys: keys)).to_a results.map do |r| { key: r['key'], data: JSON.parse(r['data']) } rescue JSON::ParserError { key: r['key'], data: {} } end end |
#get_query(keys:) ⇒ Object
80 81 82 83 84 |
# File 'lib/trifle/stats/driver/postgres.rb', line 80 def get_query(keys:) <<-SQL SELECT * FROM #{table_name} WHERE key IN ('#{keys.join("', '")}'); SQL end |
#inc(keys:, **values) ⇒ Object
26 27 28 29 30 31 32 33 34 |
# File 'lib/trifle/stats/driver/postgres.rb', line 26 def inc(keys:, **values) data = self.class.pack(hash: values) client.transaction do |c| keys.map do |key| pkey = key.join(separator) c.exec(inc_query(key: pkey, data: data)) end end end |
#inc_query(key:, data:) ⇒ Object
36 37 38 39 40 41 42 |
# File 'lib/trifle/stats/driver/postgres.rb', line 36 def inc_query(key:, data:) <<-SQL INSERT INTO #{table_name} (key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = #{data.inject("to_jsonb(#{table_name}.data)") { |o, (k, v)| "jsonb_set(#{o}, '{#{k}}', (COALESCE(#{table_name}.data->>'#{k}', '0')::int + #{v})::text::jsonb)" }}; SQL end |
#ping ⇒ Object
86 87 88 |
# File 'lib/trifle/stats/driver/postgres.rb', line 86 def ping(*) [] end |
#scan ⇒ Object
90 91 92 |
# File 'lib/trifle/stats/driver/postgres.rb', line 90 def scan(*) [] end |
#set(keys:, **values) ⇒ Object
44 45 46 47 48 49 50 51 52 |
# File 'lib/trifle/stats/driver/postgres.rb', line 44 def set(keys:, **values) data = self.class.pack(hash: values) client.transaction do |c| keys.map do |key| pkey = key.join(separator) c.exec(set_query(key: pkey, data: data)) end end end |
#set_query(key:, data:) ⇒ Object
54 55 56 57 58 59 60 |
# File 'lib/trifle/stats/driver/postgres.rb', line 54 def set_query(key:, data:) <<-SQL INSERT INTO #{table_name} (key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = #{data.inject("to_jsonb(#{table_name}.data)") { |o, (k, v)| "jsonb_set(#{o}, '{#{k}}', '#{v.to_json}'::jsonb)" }} SQL end |