Sha256: 6d0bbf5f880f94d1153ced6384c25ae1da3852c4923dd14c031c329685f1ddd7

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

# frozen_string_literal: true

require 'mongo'
require_relative '../mixins/packer'

module Trifle
  module Stats
    module Driver
      class Mongo
        include Mixins::Packer
        attr_accessor :client, :collection_name, :separator

        def initialize(client, collection_name: 'trifle_stats')
          @client = client
          @collection_name = collection_name
          @separator = '::'
        end

        def inc(key:, **values)
          pkey = key.join(separator)

          collection.bulk_write(
            [upsert_operation('$inc', pkey: pkey, values: values)]
          )
        end

        def set(key:, **values)
          pkey = key.join(separator)

          collection.bulk_write(
            [upsert_operation('$set', pkey: pkey, values: values)]
          )
        end

        def upsert_operation(operation, pkey:, values:)
          data = self.class.pack(hash: { data: values })
          {
            update_many: {
              filter: { key: pkey },
              update: { operation => data },
              upsert: true
            }
          }
        end

        def get(keys:)
          pkeys = keys.map { |key| key.join(separator) }
          data = collection.find(key: { '$in' => pkeys })
          map = data.inject({}) { |o, d| o.merge(d['key'] => d['data']) }

          pkeys.map { |pkey| map[pkey] || {} }
        end

        private

        def collection
          client[collection_name]
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
trifle-stats-1.0.0 lib/trifle/stats/driver/mongo.rb