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
Post a Comment