erlang - Fetching and updating data in mnesia -


i have multiple mnesia tuples (groupid primary key)

{groupid, groupname, grouptype, groupdescription, grouptag, creatorid, adminid, memberlist, counter}.  memberlist = "memberone@xyz,membertwo@xyz,memberthree@xyz". groupname = "any string value". % e.g.: "basketball" grouptag = "comma separated values". % e.g.: "sports,cricket,fifa,ronaldo" 

i pass character or word function. function search character in groupname , grouptag.

if successful return comma separated tuples of groupid, groupname, groupdescription; , counter should incremented corresponding row.

suppose in mnesia database tuples are

{"a", "cricket", "0", "a group cricket fans", "sports, cricket, sachin tendulkar", "xyz", "xyz", "xyz", 1}, {"b", "sports", "0", "a group sport fans", "sports,cricket,fifa,ronaldo,sachin tendulkar", "xyz", "xyz", "xyz", 0}. 

so if search "sac", should give output

[{"a", "cricket", "a group cricket fans"},  {"b", "sports", "a group sport fans"}]  

counter value group should 2 (it 1, check last element of tuple) , group b should 1 (it 0, check last element of tuple).

any pointers?

as far know, cannot build guard call substring string, instead of using erlang match specification have iterate on records , filter ones need.

-module(tuples). -compile(export_all).  -record(group, {group_id,         group_name,         group_type,         group_description,         group_tag,         creator_id,         admin_id,         member_list,         counter}).  start() ->     mnesia:create_schema([node()]),     mnesia:start().  stop() ->     mnesia:stop(),     mnesia:delete_schema([node()]).  load_data() ->     mnesia:create_table(group,             [{attributes, record_info(fields, group)}]),     record1 = #group{group_id = "a",               group_name = "cricket",              group_type = "0",              group_description = "a group cricket fans",              group_tag = "spots,cricket,sachin tendulkar",              creator_id = "xyz",              admin_id = "xyz",              member_list = "xyz",              counter = 1},     record2 = #group{group_id = "b",              group_name = "sports",              group_type = "0",              group_description = "a group sport fans",              group_tag = "sports,cricket,fifa,ronaldo,sachin tendulkar",              creator_id = "xyz",              admin_id = "xyz",              member_list = "xyz",              counter = 0},     insert = fun() -> lists:map(fun(x) -> mnesia:write(x) end, [record1, record2]) end,     mnesia:transaction(insert).  show_data() ->     catchall = [{'_', [], ['$_']}],     mnesia:dirty_select(group, catchall).  query(substring) ->     update = fun(record) ->              newrecord = record#group{counter = record#group.counter + 1},              mnesia:write(newrecord),              newrecord          end,      requiredfields = fun(record) -> {record#group.group_id, record#group.group_name, record#group.group_description} end,      constraint =      fun(group, acc) ->         case string:str(string:to_lower(group#group.group_name),                  string:to_lower(substring)) of             0 ->                 case string:str(string:to_lower(group#group.group_tag),                     string:to_lower(substring)) of                 0 ->                     acc;                 _ ->                     newrecord = update(group),                     [requiredfields(group) | newrecord]                 end;             _->                 newrecord = update(group),                 [requiredfields(group) | newrecord]         end     end,     find = fun() -> mnesia:foldl(constraint, [], group) end,     {_, data} = mnesia:transaction(find),     data. 

and try code:

eshell v6.4  (abort ^g) 1> c("tuples.erl"). {ok,tuples} 2> tuples:start(). ok 3> tuples:load_data(). {atomic,[ok,ok]} 4> tuples:show_data(). [{group,"a","cricket","0","a group cricket fans",         "spots,cricket,sachin tendulkar","xyz","xyz","xyz",1},  {group,"b","sports","0","a group sport fans",         "sports,cricket,fifa,ronaldo,sachin tendulkar","xyz","xyz",         "xyz",0}] 5> tuples:query("sac"). [{group,"a","cricket","0","a group cricket fans",   "spots,cricket,sachin tendulkar","xyz","xyz","xyz",1}|  {group,"a","cricket","0","a group cricket fans",   "spots,cricket,sachin tendulkar","xyz","xyz","xyz",2}] 6> tuples:stop().  =info report==== 14-jun-2015::22:14:42 ===     application: mnesia     exited: stopped     type: temporary ok 7> q(). ok 8> 

Comments