Packages
dynamo_datamapper
0.1.0
Library for manipulating data from dynamo db, this library its similar to odm from mongo, but to manipulate data easiest, based in Aws Dynamo library.
Current section
Files
Jump to
Current section
Files
lib/actions/query.ex
defmodule DataMapper.Actions.Query do
alias ExAws.Dynamo
alias DataMapper.Actions.{Data}
@attr_expr "_expression"
@table_prefix "wwd_dev_"
def add_key_condition(pid, field, value, pk \\ false) do
with_expr = field <> @attr_expr
Data.add(pid, :key_condition_expression, "#" <> field <> " = :" <> with_expr)
Data.add(pid, :expression_attribute_values, ["#{with_expr}": value])
Data.add(pid, :expression_attribute_names, %{"#" <> field => field})
end
def has_key_condition(pid) do
Data.has_key(pid, :key_condition_expression)
end
def add_index(pid, index) do
Data.add(pid, :index_name, index)
end
def add_filter(pid, field, value, comparison \\ "=", operator \\ "and") do
with_expr = field <> @attr_expr
if !Data.has_key(pid, :filter_expression) do
Data.add(pid, :filter_expression, "#" <> field <> " #{comparison} :" <> field <> @attr_expr)
else
old_filter = Data.get(pid, :filter_expression)
new_filter = old_filter <> " #{operator} " <> "#" <> field <> " = :" <> field <> @attr_expr
Data.update(pid, :filter_expression, new_filter)
end
if Data.has_key(pid, :expression_attribute_values) == false do
Data.add(pid, :expression_attribute_values, ["#{with_expr}": value])
else
old_list = Data.get(pid, :expression_attribute_values)
new_list = old_list ++ ["#{with_expr}": value]
Data.update(pid, :expression_attribute_values, new_list)
end
if Data.has_key(pid, :expression_attribute_names) == false do
Data.add(pid, :expression_attribute_names, %{"#" <> field => field})
else
old_map = Data.get(pid, :expression_attribute_names)
new_map = Map.merge(old_map, %{"#" <> field => field})
Data.update(pid, :expression_attribute_names, new_map)
end
end
def count(pid) do
Data.add(pid, :select, :count)
end
def sort(pid, sort) do
accending =
case sort do
true -> 1
1 -> 1
_ -> 0
end
Data.add(pid, :scan_index_forward, accending)
end
def get_struct(pid) do
Map.to_list(Data.get_all(pid))
end
def add_limit(pid, limit) do
Data.add(pid, :limit, limit)
end
def get(pid, table_name) do
struct = get_struct(pid)
if Data.get(pid, :select) == :count do
data = Dynamo.query(
@table_prefix <> table_name,
struct
) |> ExAws.request!
if is_map(data) do
Map.get(data, "Count")
else
false
end
else
data = Dynamo.query(
@table_prefix <> table_name,
struct
) |> ExAws.request!
if is_map(data) do
Map.get(data, "Items")
else
false
end
end
end
end