Skip to content

Commit

Permalink
Merge pull request #253 from inaka/cabol.248.mnesia_custom_data_type
Browse files Browse the repository at this point in the history
[Fix #248] Support for new `custom` data type to `mnesia`.
  • Loading branch information
Brujo Benavides authored Aug 5, 2016
2 parents 7c203e6 + 116f142 commit 242e7e1
Show file tree
Hide file tree
Showing 5 changed files with 114 additions and 146 deletions.
50 changes: 33 additions & 17 deletions src/adapter_test_helpers/sumo_basic_test_helper.erl
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ find_by(Config) ->
undefined = Module:height(First),
undefined = Module:description(First),
{Today, _} = Module:created_at(First),
true = Module:weird_field1(First),
undefined = Module:weird_field2(First),
undefined = Module:weird_field3(First),

% Check that it returns what we have inserted
[LastPerson | _NothingElse] = sumo:find_by(Name, [
{last_name, <<"LastName">>}
Expand All @@ -70,7 +74,12 @@ find_by(Config) ->
1.75 = Module:height(LastPerson),
<<"description">> = Module:description(LastPerson),
<<"profile_image">> = Module:profile_image(LastPerson),
<<"weird_field">> = Module:weird_field(LastPerson),
{mytuple, false, 1, "2", <<"3">>} = Module:weird_field1(LastPerson),
[1, true, <<"hi">>, 1.1] = Module:weird_field2(LastPerson),
#{a := 1,
b := [1, "2", <<"3">>],
<<"c">> := false
} = Module:weird_field3(LastPerson),
{Today, _} = Module:created_at(LastPerson),

%% Check find_by ID
Expand Down Expand Up @@ -143,27 +152,34 @@ init_store(Name) ->
Module = sumo_config:get_prop_value(Name, module),
sumo:delete_all(Name),

DT = {Date, _} = calendar:universal_time(),

sumo:persist(Name, Module:new(<<"A">>, <<"E">>, 6)),
sumo:persist(Name, Module:new(<<"B">>, <<"D">>, 3)),
sumo:persist(Name, Module:from_map(#{
name => <<"B">>,
last_name => <<"D">>,
age => 3,
birthdate => Date,
created_at => DT,
weird_field1 => true
})),
sumo:persist(Name, Module:new(<<"C">>, <<"C">>, 5)),
sumo:persist(Name, Module:new(<<"D">>, <<"D">>, 4)),
sumo:persist(Name, Module:new(<<"E">>, <<"A">>, 2)),
sumo:persist(Name, Module:new(<<"F">>, <<"E">>, 1)),
sumo:persist(Name, Module:new(<<"Model T-2000">>, <<"undefined">>, 7)),

{Date, _} = calendar:universal_time(),
sumo:persist(
Name,
Module:new(
<<"Name">>,
<<"LastName">>,
3,
undefined,
Date,
1.75,
<<"description">>,
<<"profile_image">>,
<<"weird_field">>
)
),
sumo:persist(Name, Module:from_map(#{
name => <<"Name">>,
last_name => <<"LastName">>,
age => 3,
birthdate => Date,
created_at => DT,
height => 1.75,
description => <<"description">>,
profile_image => <<"profile_image">>,
weird_field1 => {mytuple, false, 1, "2", <<"3">>},
weird_field2 => [1, true, <<"hi">>, 1.1],
weird_field3 => #{a => 1, b => [1, "2", <<"3">>], <<"c">> => false}
})),
ok.
155 changes: 51 additions & 104 deletions src/adapter_test_helpers/sumo_test_people.erl
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,8 @@
new/2,
new/3,
new/4,
new/5,
new/6,
new/7,
new/8,
new/9,
name/1,
from_map/1,
last_name/1,
id/1,
age/1,
Expand All @@ -27,20 +23,22 @@
height/1,
description/1,
profile_image/1,
weird_field/1
weird_field1/1,
weird_field2/1,
weird_field3/1
]).

-type id() :: integer() | binary() | undefined.
-type name() :: binary().
-type last_name() :: binary().
-type name() :: binary() | undefined.
-type last_name() :: binary() | undefined.
-type age() :: integer() | undefined.
-type address() :: binary() | undefined.
-type birthdate() :: calendar:date() | undefined.
-type created_at() :: calendar:datetime().
-type created_at() :: calendar:datetime() | undefined.
-type height() :: float() | undefined.
-type description() :: binary() | undefined.
-type profile_image() :: binary() | undefined.
-type weird_field() :: term().
-type weird_field() :: term() | undefined.

-record(person, {
id :: id(),
Expand All @@ -53,7 +51,9 @@
height :: height(),
description :: description(),
profile_image :: profile_image(),
weird_field :: weird_field()
weird_field1 :: weird_field(),
weird_field2 :: weird_field(),
weird_field3 :: weird_field()
}).

-type person() :: #person{}.
Expand All @@ -77,7 +77,9 @@ sumo_sleep(Person) ->
height => Person#person.height,
description => Person#person.description,
profile_image => Person#person.profile_image,
weird_field => Person#person.weird_field}.
weird_field1 => Person#person.weird_field1,
weird_field2 => Person#person.weird_field2,
weird_field3 => Person#person.weird_field3}.

-spec sumo_wakeup(Person :: sumo:model()) -> person().
sumo_wakeup(Person) ->
Expand All @@ -92,7 +94,9 @@ sumo_wakeup(Person) ->
height = maps:get(height, Person),
description = maps:get(description, Person),
profile_image = maps:get(profile_image, Person),
weird_field = maps:get(weird_field, Person)
weird_field1 = maps:get(weird_field1, Person),
weird_field2 = maps:get(weird_field2, Person),
weird_field3 = maps:get(weird_field3, Person)
}.

%%%=============================================================================
Expand Down Expand Up @@ -122,96 +126,31 @@ new(Name, LastName, Age) ->
Person :: person().
new(Name, LastName, Age, Address) ->
{BirthDate, _} = calendar:universal_time(),
new(Name, LastName, Age, Address, BirthDate).

-spec new(Name, LastName, Age, Address, BirthDate) -> Person when
Name :: name(),
LastName :: last_name(),
Age :: age(),
Address :: address(),
BirthDate :: birthdate(),
Person :: person().
new(Name, LastName, Age, Address, BirthDate) ->
new(Name, LastName, Age, Address, BirthDate, undefined).

-spec new(Name, LastName, Age, Address, BirthDate, Height) -> Person when
Name :: name(),
LastName :: last_name(),
Age :: age(),
Address :: address(),
BirthDate :: birthdate(),
Height :: height(),
Person :: person().
new(Name, LastName, Age, Address, BirthDate, Height) ->
new(Name, LastName, Age, Address, BirthDate, Height, undefined).

-spec new(
Name, LastName, Age, Address, BirthDate, Height, Description
) -> Person when
Name :: name(),
LastName :: last_name(),
Age :: age(),
Address :: address(),
BirthDate :: birthdate(),
Height :: height(),
Description :: description(),
Person :: person().
new(Name, LastName, Age, Address, BirthDate, Height, Description) ->
new(Name, LastName, Age, Address, BirthDate, Height, Description, undefined).

-spec new(
Name, LastName, Age, Address, BirthDate, Height, Description, ProfileImage
) -> Person when
Name :: name(),
LastName :: last_name(),
Age :: age(),
Address :: address(),
BirthDate :: birthdate(),
Height :: height(),
Description :: description(),
ProfileImage :: profile_image(),
Person :: person().
new(Name, LastName, Age, Address, BirthDate,
Height, Description, ProfileImage) ->
new(
Name, LastName, Age, Address, BirthDate, Height,
Description, ProfileImage, undefined).

-spec new(
Name, LastName, Age, Address, BirthDate, Height,
Description, ProfileImage, WeirdField
) -> Person when
Name :: name(),
LastName :: last_name(),
Age :: age(),
Address :: address(),
BirthDate :: birthdate(),
Height :: height(),
Description :: description(),
ProfileImage :: profile_image(),
WeirdField :: weird_field(),
Person :: person().
new(Name,
LastName,
Age,
Address,
BirthDate,
Height,
Description,
ProfileImage,
WeirdField) ->
Datetime = calendar:universal_time(),
from_map(#{
name => Name,
last_name => LastName,
age => Age,
address => Address,
birthdate => BirthDate,
created_at => Datetime
}).

-spec from_map(map()) -> person().
from_map(Map) ->
#person{
name = Name,
last_name = LastName,
age = Age,
address = Address,
birthdate = BirthDate,
created_at = Datetime,
height = Height,
description = Description,
profile_image = ProfileImage,
weird_field = WeirdField
name = maps:get(name, Map, undefined),
last_name = maps:get(last_name, Map, undefined),
age = maps:get(age, Map, undefined),
address = maps:get(address, Map, undefined),
birthdate = maps:get(birthdate, Map, undefined),
created_at = maps:get(created_at, Map, undefined),
height = maps:get(height, Map, undefined),
description = maps:get(description, Map, undefined),
profile_image = maps:get(profile_image, Map, undefined),
weird_field1 = maps:get(weird_field1, Map, undefined),
weird_field2 = maps:get(weird_field2, Map, undefined),
weird_field3 = maps:get(weird_field3, Map, undefined)
}.

-spec name(Person :: person()) -> name().
Expand Down Expand Up @@ -254,6 +193,14 @@ description(Person) ->
profile_image(Person) ->
Person#person.profile_image.

-spec weird_field(Person :: person()) -> weird_field().
weird_field(Person) ->
Person#person.weird_field.
-spec weird_field1(Person :: person()) -> weird_field().
weird_field1(Person) ->
Person#person.weird_field1.

-spec weird_field2(Person :: person()) -> weird_field().
weird_field2(Person) ->
Person#person.weird_field2.

-spec weird_field3(Person :: person()) -> weird_field().
weird_field3(Person) ->
Person#person.weird_field3.
22 changes: 11 additions & 11 deletions src/adapters/sumo_store_mnesia.erl
Original file line number Diff line number Diff line change
Expand Up @@ -347,29 +347,29 @@ validate_date({FieldType, _, FieldValue}) ->
{FieldValue, {0, 0, 0}}
end.

% @private
%% @private
sleep(Doc) ->
sumo_utils:doc_transform(fun sleep_fun/1, Doc).
sumo_utils:doc_transform(fun sleep_fun/4, Doc).

%% @private
sleep_fun({date, _, FieldValue}) ->
sleep_fun(_, _, undefined, _) ->
undefined;
sleep_fun(string, _, FieldValue, _) ->
sumo_utils:to_bin(FieldValue);
sleep_fun(date, _, FieldValue, _) ->
case sumo_utils:is_datetime(FieldValue) of
true -> {FieldValue, {0, 0, 0}};
_ -> FieldValue
end;
sleep_fun({_, _, FieldValue}) ->
sleep_fun(_, _, FieldValue, _) ->
FieldValue.

%% @private
wakeup(Doc) ->
sumo_utils:doc_transform(fun wakeup_fun/1, Doc).
sumo_utils:doc_transform(fun wakeup_fun/4, Doc).

%% @private
wakeup_fun({date, _, {Date, _} = _FieldValue}) ->
wakeup_fun(date, _, {Date, _} = _FieldValue, _) ->
Date;
wakeup_fun({_, _, undefined}) ->
undefined;
wakeup_fun({string, _, FieldValue}) ->
sumo_utils:to_bin(FieldValue);
wakeup_fun({_, _, FieldValue}) ->
wakeup_fun(_, _, FieldValue, _) ->
FieldValue.
15 changes: 10 additions & 5 deletions src/utils/sumo_utils.erl
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,14 @@
%%%=============================================================================

-spec doc_transform(Fun, Doc1) -> Doc2 when
Fun :: fun((DocSum) -> sumo:field_value()),
DocSum :: {sumo:field_type(), sumo:field_name(), sumo:field_value()},
Doc1 :: sumo_internal:doc(),
Doc2 :: sumo_internal:doc().
Fun :: fun((FieldType, FieldName, Value1, FieldAttrs) -> Value2),
FieldType :: sumo:field_type(),
FieldName :: sumo:field_name(),
Value1 :: sumo:field_value(),
FieldAttrs :: sumo:field_attrs(),
Value2 :: sumo:field_value(),
Doc1 :: sumo_internal:doc(),
Doc2 :: sumo_internal:doc().
doc_transform(Fun, Doc) ->
DocName = sumo_internal:doc_name(Doc),
Schema = sumo_internal:get_schema(DocName),
Expand All @@ -33,7 +37,8 @@ doc_transform(Fun, Doc) ->
FieldType = sumo_internal:field_type(Field),
FieldName = sumo_internal:field_name(Field),
FieldValue = sumo_internal:get_field(FieldName, Doc),
NewValue = Fun({FieldType, FieldName, FieldValue}),
FieldAttrs = sumo_internal:field_attrs(Field),
NewValue = Fun(FieldType, FieldName, FieldValue, FieldAttrs),
sumo_internal:set_field(FieldName, NewValue, Acc)
end, Doc, SchemaFields).

Expand Down
Loading

0 comments on commit 242e7e1

Please sign in to comment.