boss_db_adapter_mongodb.erl change

15 views
Skip to first unread message

can2nac

unread,
May 15, 2014, 6:52:26 PM5/15/14
to chica...@googlegroups.com
Hi,

found a strange behaviour in boss_db_adapter_mongodb.erl . Relates to ChicagoBoss-0.8.7

if we have
-module(
rec,
[Id
,MemId
,FromId
,ToId]).

-belongs_to(mem).
-belongs_to_mem(from).
-belongs_to_mem(to).

and then we try to

20> M2 = boss_db:find("rec-537015e2b3769c1e2b000012").
{rec,"rec-537015e2b3769c1e2b000012",
         "mem-536fa579b3769c1e2b000001",
         "from-5362580bb3769c433400001d", %it was Mem:id() at 'new' call, expect 'mem-5362580bb3769c433400001d' here
         "to-536242e9b3769c4334000002"} %it was Mem:id() at 'new' call, expect 'mem-536242e9b3769c4334000002' here
21> M2:from_id().                                         
"from-5362580bb3769c433400001d"
23> M2:from().
undefined

it is clear that belongs_to_MODEL_NAME doesn't work as it supposed to. Made changes in boss_db_adapter_mongodb.erl (attached)

% Convert a tuple return by the MongoDB driver to a Boss record
mongo_tuple_to_record(Type, Row) ->
    MongoDoc = tuple_to_proplist(Row),
    AttributeTypes = boss_record_lib:attribute_types(Type),
    BelongsToTypes = boss_record_lib:belongs_to_types(Type), %added by can2nac, 14-05-14
    Args = lists:map(fun
            (id) ->
                MongoValue = attr_value(id, MongoDoc),
                unpack_id(Type, MongoValue);
            (AttrName) ->
                MongoValue = attr_value(AttrName, MongoDoc),
                ValueType = proplists:get_value(AttrName, AttributeTypes),
                unpack_value(AttrName, MongoValue, ValueType, BelongsToTypes) %added by can2nac, 14-05-14
                %unpack_value(AttrName, MongoValue, ValueType) %original, removed by can2nac, 14-05-14
        end, boss_record_lib:attribute_names(Type)),
    apply(Type, new, Args).



unpack_value(_AttrName, [H|T], _ValueType, _) when is_integer(H) -> {integers, [H|T]};
unpack_value(AttrName, Value, ValueType, BelongsToTypes) ->
  case is_id_attr(AttrName) and (Value =/= "") of
    true ->
      unpack_id(proplists:get_value(list_to_atom(id_type_from_foreign_key(AttrName)),BelongsToTypes),Value);
    false ->
      boss_record_lib:convert_value_to_type(Value, ValueType)
  end.

%original, removed by can2nac, 14-05-14
%unpack_value(_AttrName, [H|T], _ValueType) when is_integer(H) ->
%    {integers, [H|T]};
%unpack_value(AttrName, Value, ValueType) ->
%    case is_id_attr(AttrName) and (Value =/= "") of 
%        true -> 
%            IdType = id_type_from_foreign_key(AttrName),
%            unpack_id(IdType, Value);
%        false -> 
%            boss_record_lib:convert_value_to_type(Value, ValueType)
%    end.


after changes and /ChicagoBoss-0.8.7$ ./rebar compile

15> M1 = boss_db:find("rec-537015e2b3769c1e2b000012").
{rec,"rec-537015e2b3769c1e2b000012",
         "mem-536fa579b3769c1e2b000001",
         "mem-5362580bb3769c433400001d",
         "mem-536242e9b3769c4334000002"}
16> M1:from_id().
"mem-5362580bb3769c433400001d"
18> M1:from().   
{mem,"mem-5362580bb3769c433400001d"}

I have not made any heavy tests. Just want to post it here or i'll forget about this))
boss_db_adapter_mongodb.erl
Reply all
Reply to author
Forward
0 new messages