lib/trifle/stats/driver/postgres.rb in trifle-stats-1.1.2 vs lib/trifle/stats/driver/postgres.rb in trifle-stats-1.2.0
- old
+ new
@@ -18,57 +18,54 @@
def inc(keys:, **values)
keys.map do |key|
pkey = key.join(separator)
- self.class.pack(hash: values).each do |k, c|
- _inc_one(key: pkey, name: k, value: c)
- end
+ _inc_all(key: pkey, data: self.class.pack(hash: values))
end
end
- def _inc_one(key:, name:, value:)
- data = { name => value }
- query = "INSERT INTO trifle_stats(key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = jsonb_set(to_jsonb(trifle_stats.data), '{#{name}}', (COALESCE(trifle_stats.data->>'#{name}','0')::int + #{value})::text::jsonb)" # rubocop:disable Metric/LineLength
+ def _inc_all(key:, data:)
+ query = "INSERT INTO trifle_stats(key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = " + # rubocop:disable Layout/LineLength
+ data.inject('to_jsonb(trifle_stats.data)') { |o, (k, v)| "jsonb_set(#{o}, '{#{k}}', (COALESCE(trifle_stats.data->>'#{k}', '0')::int + #{v})::text::jsonb)" } # rubocop:disable Layout/LineLength
client.exec(query)
end
def set(keys:, **values)
keys.map do |key|
pkey = key.join(separator)
- _set_all(key: pkey, **values)
+ _set_all(key: pkey, data: self.class.pack(hash: values))
end
end
- def _set_all(key:, **values)
- data = self.class.pack(hash: values)
- query = "INSERT INTO trifle_stats(key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = '#{data.to_json}'" # rubocop:disable Metric/LineLength
+ def _set_all(key:, data:)
+ query = "INSERT INTO trifle_stats(key, data) VALUES ('#{key}', '#{data.to_json}') ON CONFLICT (key) DO UPDATE SET data = " + # rubocop:disable Layout/LineLength
+ data.inject('to_jsonb(trifle_stats.data)') { |o, (k, v)| "jsonb_set(#{o}, '{#{k}}', (#{v})::text::jsonb)" } # rubocop:disable Layout/LineLength
client.exec(query)
end
def get(keys:)
- keys.map do |key|
- pkey = key.join(separator)
+ pkeys = keys.map { |key| key.join(separator) }
+ data = _get_all(keys: pkeys)
+ map = data.inject({}) { |o, d| o.merge(d['key'] => d['data']) }
- data = _get(key: pkey)
- return {} if data.nil?
-
- self.class.unpack(hash: data)
- end
+ pkeys.map { |pkey| self.class.unpack(hash: map[pkey]) || {} }
end
- def _get(key:)
- result = client.exec_params(
- "SELECT * FROM #{table_name} WHERE key = $1 LIMIT 1;", [key]
- ).to_a.first
- return nil if result.nil?
+ def _get_all(keys:)
+ results = client.exec_params(
+ "SELECT * FROM #{table_name} WHERE key IN ('#{keys.join("', '")}');"
+ ).to_a
- JSON.parse(result['data'])
- rescue JSON::ParserError
- nil
+ results.map do |r|
+ r['data'] = JSON.parse(r['data'])
+ r
+ rescue JSON::ParserError
+ r
+ end
end
end
end
end
end