Class: Magentwo::Dataset
- Inherits:
-
Object
- Object
- Magentwo::Dataset
- Defined in:
- lib/dataset.rb
Instance Attribute Summary collapse
-
#model ⇒ Object
Returns the value of attribute model.
-
#opts ⇒ Object
Returns the value of attribute opts.
Instance Method Summary collapse
- #all(meta_data: false) ⇒ Object
- #count ⇒ Object
- #each(&block) ⇒ Object
- #each_page(page_size = Magentwo.default_page_size, &block) ⇒ Object
- #exclude(args) ⇒ Object
- #fields ⇒ Object
-
#filter(hash_or_other, invert: false) ⇒ Object
Filters.
- #first ⇒ Object
- #from(args) ⇒ Object
- #gt(args) ⇒ Object
- #gteq(args) ⇒ Object
-
#info ⇒ Object
Fetching.
-
#initialize(model, opts = nil) ⇒ Dataset
constructor
A new instance of Dataset.
- #like(args) ⇒ Object
- #lt(args) ⇒ Object
- #lteq(args) ⇒ Object
-
#map(&block) ⇒ Object
Functors.
-
#order_by(field, direction = "ASC") ⇒ Object
Ordering.
-
#page(page, page_size = Magentwo.default_page_size) ⇒ Object
Pagination.
-
#print_readable ⇒ Object
Transformation.
- #select(*fields) ⇒ Object
- #to(args) ⇒ Object
- #to_query ⇒ Object
-
#validate ⇒ Object
Validation.
Constructor Details
#initialize(model, opts = nil) ⇒ Dataset
Returns a new instance of Dataset.
4 5 6 7 8 9 10 11 12 13 14 15 |
# File 'lib/dataset.rb', line 4 def initialize model, opts=nil self.model = model self.opts = opts || { :filters => [], :pagination => { :current_page => Filter::CurrentPage.new(1), :page_size => Filter::PageSize.new(0) }, :ordering => [], :fields => nil } end |
Instance Attribute Details
#model ⇒ Object
Returns the value of attribute model.
3 4 5 |
# File 'lib/dataset.rb', line 3 def model @model end |
#opts ⇒ Object
Returns the value of attribute opts.
3 4 5 |
# File 'lib/dataset.rb', line 3 def opts @opts end |
Instance Method Details
#all(meta_data: false) ⇒ Object
112 113 114 |
# File 'lib/dataset.rb', line 112 def all meta_data:false self.model.all self, :meta_data => end |
#count ⇒ Object
100 101 102 |
# File 'lib/dataset.rb', line 100 def count self.info[:total_count] end |
#each(&block) ⇒ Object
180 181 182 183 |
# File 'lib/dataset.rb', line 180 def each(&block) raise ArgumentError, "no block given" unless block_given? self.model.all.each(&block) end |
#each_page(page_size = Magentwo.default_page_size, &block) ⇒ Object
185 186 187 188 189 190 191 192 193 194 195 196 197 |
# File 'lib/dataset.rb', line 185 def each_page page_size=Magentwo.default_page_size, &block raise ArgumentError, "no block given" unless block_given? received_element_count = page_size current_page = 1 total_count = nil until(total_count && current_page*page_size > (total_count + page_size)) do page = self.page(current_page, page_size).all meta_data:true total_count = page[:total_count] unless total_count block.call(page[:items]) current_page += 1 end end |
#exclude(args) ⇒ Object
39 40 41 |
# File 'lib/dataset.rb', line 39 def exclude args filter args, invert:true end |
#fields ⇒ Object
104 105 106 |
# File 'lib/dataset.rb', line 104 def fields self.info[:fields] end |
#filter(hash_or_other, invert: false) ⇒ Object
Filters
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/dataset.rb', line 20 def filter hash_or_other, invert:false filters = case hash_or_other when Hash raise ArgumentError, "empty hash supplied" if hash_or_other.empty? hash_or_other.map do |key, value| klass = case value when Array invert ? Filter::Nin : Filter::In else invert ? Filter::Neq : Filter::Eq end klass.new(key, value) end else raise ArgumentError, "filter function expects Hash as input" end Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + filters) end |
#first ⇒ Object
108 109 110 |
# File 'lib/dataset.rb', line 108 def first self.model.first self end |
#from(args) ⇒ Object
67 68 69 |
# File 'lib/dataset.rb', line 67 def from args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::From.new(args.keys.first, args.values.first)]) end |
#gt(args) ⇒ Object
43 44 45 |
# File 'lib/dataset.rb', line 43 def gt args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Gt.new(args.keys.first, args.values.first)]) end |
#gteq(args) ⇒ Object
51 52 53 |
# File 'lib/dataset.rb', line 51 def gteq args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Gteq.new(args.keys.first, args.values.first)]) end |
#info ⇒ Object
Fetching
92 93 94 95 96 97 98 |
# File 'lib/dataset.rb', line 92 def info result = self.model.get self.page(1, 1).to_query, :meta_data => true { :fields => result[:items]&.first&.keys, :total_count => result[:total_count] } end |
#like(args) ⇒ Object
63 64 65 |
# File 'lib/dataset.rb', line 63 def like args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Like.new(args.keys.first, args.values.first)]) end |
#lt(args) ⇒ Object
47 48 49 |
# File 'lib/dataset.rb', line 47 def lt args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Lt.new(args.keys.first, args.values.first)]) end |
#lteq(args) ⇒ Object
55 56 57 |
# File 'lib/dataset.rb', line 55 def lteq args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::Lteq.new(args.keys.first, args.values.first)]) end |
#map(&block) ⇒ Object
Functors
175 176 177 178 |
# File 'lib/dataset.rb', line 175 def map(&block) raise ArgumentError, "no block given" unless block_given? self.model.all.map(&block) end |
#order_by(field, direction = "ASC") ⇒ Object
Ordering
85 86 87 |
# File 'lib/dataset.rb', line 85 def order_by field, direction="ASC" Dataset.new self.model, self.opts.merge(:ordering => self.opts[:ordering] + [Filter::OrderBy.new(field, direction)]) end |
#page(page, page_size = Magentwo.default_page_size) ⇒ Object
Pagination
78 79 80 |
# File 'lib/dataset.rb', line 78 def page page, page_size=Magentwo.default_page_size Dataset.new self.model, self.opts.merge(:pagination => {:current_page => Filter::CurrentPage.new(page), :page_size => Filter::PageSize.new(page_size)}) end |
#print_readable ⇒ Object
Transformation
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/dataset.rb', line 119 def print_readable ds = self puts "*** Pagination ***" puts ds.opts[:pagination][:current_page].to_s puts ds.opts[:pagination][:page_size].to_s puts "*** Filters ***" ds.opts[:filters].each do |filter| puts filter.to_s end puts "*** Ordering ***" order_filters = ds.opts[:ordering] if order_filters.size > 0 order_filters.each do |filter| puts filter.to_s end else puts "non specified" end puts "*** Fields ***" if fields = ds.opts[:fields]&.fields puts "Fetch only: #{fields}" else puts "Fetch everything" end end |
#select(*fields) ⇒ Object
59 60 61 |
# File 'lib/dataset.rb', line 59 def select *fields Dataset.new self.model, self.opts.merge(:fields => Filter::Fields.new(fields)) end |
#to(args) ⇒ Object
71 72 73 |
# File 'lib/dataset.rb', line 71 def to args Dataset.new self.model, self.opts.merge(:filters => self.opts[:filters] + [Filter::To.new(args.keys.first, args.values.first)]) end |
#to_query ⇒ Object
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/dataset.rb', line 149 def to_query self.validate ds = self [ ds.opts[:filters] .each_with_index .map { |opt, idx| opt.to_query(idx) } .join("&"), ds.opts[:pagination] .map { |k, v| v.to_query} .join("&"), ds.opts[:ordering] .map { |opt, idx| opt.to_query(idx) } .join("&"), ds.opts[:fields]? ds.opts[:fields].to_query() : "" ].reject(&:empty?) .join("&") end |
#validate ⇒ Object
Validation
202 203 204 |
# File 'lib/dataset.rb', line 202 def validate true end |