Sha256: 11146d119f4f9106692eb1071ed56830817cedcd9b118bf6ab9a347795e920de

Contents?: true

Size: 1.5 KB

Versions: 7

Compression:

Stored size: 1.5 KB

Contents

require 'rom/support/array_dataset'

module ROM
  module Memory
    # In-memory dataset
    #
    # @api public
    class Dataset
      include ArrayDataset

      # Join two datasets
      #
      # @api public
      def join(*args)
        left, right = args.size > 1 ? args : [self, args.first]

        join_map = left.each_with_object({}) { |tuple, h|
          others = right.to_a.find_all { |t| (tuple.to_a & t.to_a).any? }
          (h[tuple] ||= []).concat(others)
        }

        tuples = left.flat_map { |tuple|
          join_map[tuple].map { |other| tuple.merge(other) }
        }

        self.class.new(tuples, row_proc)
      end

      # Restrict a dataset
      #
      # @api public
      def restrict(criteria = nil)
        if criteria
          find_all { |tuple| criteria.all? { |k, v| tuple[k].eql?(v) } }
        else
          find_all { |tuple| yield(tuple) }
        end
      end

      # Project a dataset
      #
      # @api public
      def project(*names)
        map { |tuple| tuple.reject { |key| !names.include?(key) } }
      end

      # Sort a dataset
      #
      # @api public
      def order(*names)
        sort_by { |tuple| tuple.values_at(*names) }
      end

      # Insert tuple into a dataset
      #
      # @api public
      def insert(tuple)
        data << tuple
        self
      end
      alias_method :<<, :insert

      # Delete tuples from a dataset
      #
      # @api public
      def delete(tuple)
        data.delete(tuple)
        self
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
rom-0.6.2 lib/rom/memory/dataset.rb
rom-0.6.1 lib/rom/memory/dataset.rb
rom-0.6.0 lib/rom/memory/dataset.rb
rom-0.6.0.rc1 lib/rom/memory/dataset.rb
rom-0.6.0.beta3 lib/rom/memory/dataset.rb
rom-0.6.0.beta2 lib/rom/memory/dataset.rb
rom-0.6.0.beta1 lib/rom/memory/dataset.rb