Извлечение нескольких строк, соответствующих значению в мнезии

Ситуация такова: - у меня есть кортежи mnesia, такие как {"Groupid (первичный ключ)", "groupname", "grouptype", "creatorid", "adminid", "Member_list"}.

Member_list="memberone@xyz,membertwo@xyz,memberthree@xyz".Теперь я хочу извлечь все те строки, в которых существует membertwo@xyz.Как применить защиту при выборе из mnesisa для этого??Любые указатели

Теперь после прохождения подхода, данного шерифом, появляется следующая ошибка

     in function  checktable1:getRecords/1 (checktable1.erl, line 201)

37> checktable1:getRecords("a"). ** ошибка исключения: нет совпадения правого значения {прервано, {undef, [{strings,tokens,["a,b,c",","],[]}, {checktable1,exists,2, [ {файл,"checktable1.erl"},{строка,203}]}, {checktable1,'-getRecords/1-fun-1-',7, [{файл,"checktable1.erl"},{строка,197 }]}, {qlc,collect,1,[{файл,"qlc.erl"},{строка,1330}]}, {qlc,eval,2,[{файл,"qlc.erl"},{строка ,296}]}, {mnesia_tm,apply_fun,3, [{файл,"mnesia_tm.erl"},{строка,833}]}, {mnesia_tm,execute_transaction,5, [{файл,"mnesia_tm.erl"}, {line,813}]}, {checktable1,getRecords,1, [{file,"checktable1.erl"},{line,201}]}]}} в функции n checktable1:getRecords/1 (checktable1.erl, строка 201)


person Geek    schedule 27.02.2015    source источник
comment
Более типично структурировать данные по-разному, используя таблицу групп, таблицу пользователей и таблицу членства — таблицу членства, содержащую кортежи {Group, User}, чтобы сделать поиск по любому критерию простой (и очень быстрой) операцией.   -  person zxq9    schedule 27.02.2015
comment
спасибо zxq9, но это не ответ на мой вопрос   -  person Geek    schedule 27.02.2015
comment
Вот почему это комментарий. :-)   -  person zxq9    schedule 27.02.2015


Ответы (1)


вам придется использовать мнемозину

getRecords(ListMember)->  
    F = fun() ->
            Q = qlc:q(
                    [
                            Record
                            || Record <- mnesia:table(table_name_here),
                               exists(Record#table_name_here.member_list, ListMember)
                    ]),
            qlc:e(Q)
    end,
    {atomic, L}=mnesia:transaction(F),
    L.

затем вам нужно реализовать функцию exists(Member_list, Member), которая сканирует Member_list для члена и возвращает true, если найдено, и false в противном случае. не забудьте

-include_lib("stdlib/include/qlc.hrl"). 

Это не было выполнено, это только для демонстрации. Могу ли я также предложить вам изменить дизайн вашей базы данных, чтобы избежать плоских списков (списков в форме строк) или любого списка в этом отношении в качестве значения. если возможно конечно, я не знаю, что вы делаете. По крайней мере, вы должны иметь возможность поместить туда список участников, а не строку. Это мнения, вы можете поместить что угодно в любую таблицу. Хотя это не значит, что вы должны.

редактировать:

exists(ML, M)->lookUp(string:tokens(ML, ","), M).
lookUp([], M)->false;
lookUp([M|R], M)->true;
lookUp([_|R], M)->lookUp(R,M).

если вы хотите, вы также можете использовать следующее вместо exists(Record#table_name_here.member_list, ListMember).

lists:member(ListMember, string:tokens(Record#table_name_here.member_list, ","))
person Sherif Eweis    schedule 27.02.2015
comment
Ха... Это просто отладка. Его строка: токены/2, а не строки: токены/2. Я гарантирую, что есть и другие ошибки, которые я никогда не компилировал. - person Sherif Eweis; 27.02.2015