lib/dynamoid/adapter/local.rb in dynamoid-0.1.2 vs lib/dynamoid/adapter/local.rb in dynamoid-0.2.0

- old
+ new

@@ -15,58 +15,83 @@ # BatchGetItem def batch_get_item(options) Hash.new { |h, k| h[k] = Array.new }.tap do |hash| options.each do |table_name, keys| table = data[table_name] - Array(keys).each do |key| - hash[table_name] << table[:data][key] + if table[:range_key] + Array(keys).each do |hash_key, range_key| + hash[table_name] << get_item(table_name, hash_key, range_key) + end + else + Array(keys).each do |key| + hash[table_name] << get_item(table_name, key) + end end end end end # CreateTable - def create_table(table_name, key) - data[table_name] = {:id => key, :data => {}} + def create_table(table_name, key, options = {}) + data[table_name] = {:hash_key => key, :range_key => options[:range_key], :data => {}} end # DeleteItem - def delete_item(table_name, key) - data[table_name][:data].delete(key) + def delete_item(table_name, key, range_key = nil) + data[table_name][:data].delete("#{key}.#{range_key}") end # DeleteTable def delete_table(table_name) data.delete(table_name) end # DescribeTable # GetItem - def get_item(table_name, key) - data[table_name][:data][key] + def get_item(table_name, key, range_key = nil) + if data[table_name][:data] + data[table_name][:data]["#{key}.#{range_key}"] + else + nil + end end # ListTables def list_tables data.keys end # PutItem def put_item(table_name, object) table = data[table_name] - table[:data][object[table[:id]]] = object.delete_if{|k, v| v.nil? || (v.respond_to?(:empty?) && v.empty?)} + table[:data][object[table[:hash_key]]] + table[:data]["#{object[table[:hash_key]]}.#{object[table[:range_key]]}"] = object.delete_if{|k, v| v.nil? || (v.respond_to?(:empty?) && v.empty?)} end # Query - def query(table_name, id) - get_item(table_name, id) + def query(table_name, opts = {}) + id = opts[:hash_value] + range_key = data[table_name][:range_key] + if opts[:range_value] + data[table_name][:data].values.find_all{|v| v[:id] == id && !v[range_key].nil? && opts[:range_value].include?(v[range_key])} + elsif opts[:range_greater_than] + data[table_name][:data].values.find_all{|v| v[:id] == id && !v[range_key].nil? && v[range_key] > opts[:range_greater_than]} + elsif opts[:range_less_than] + data[table_name][:data].values.find_all{|v| v[:id] == id && !v[range_key].nil? && v[range_key] < opts[:range_less_than]} + elsif opts[:range_gte] + data[table_name][:data].values.find_all{|v| v[:id] == id && !v[range_key].nil? && v[range_key] >= opts[:range_gte]} + elsif opts[:range_lte] + data[table_name][:data].values.find_all{|v| v[:id] == id && !v[range_key].nil? && v[range_key] <= opts[:range_lte]} + else + get_item(table_name, id) + end end # Scan def scan(table_name, scan_hash) return [] if data[table_name].nil? - data[table_name][:data].values.select{|d| scan_hash.all?{|k, v| !d[k].nil? && d[k] == v}} + data[table_name][:data].values.flatten.select{|d| scan_hash.all?{|k, v| !d[k].nil? && d[k] == v}} end # UpdateItem # UpdateTable \ No newline at end of file