Получение и обновление данных в mnesia

У меня есть несколько мнений-кортежей, например (GroupID является первичным ключом)

{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"

Я передам символ или слово функции. Эта функция будет искать символ в GroupName и GroupTag.

В случае успеха он вернет разделенные запятыми кортежи GroupID, GroupName, GroupDescription; И счетчик должен быть увеличен для соответствующей строки.

Предположим, что в моей базе данных mnesia кортежи

{"A", "Cricket", "0", "A group for cricket fans", "Sports, Cricket, Sachin tendulkar", "Xyz", "XYZ", "XYZ", 1},
{"B", "Sports", "0", "A group for Sport fans", "Sports,Cricket,Fifa,Ronaldo,Sachin tendulkar", "Xyz", "XYZ", "XYZ", 0}.

Поэтому, если я ищу «sac», он должен дать результат

[{"A", "Cricket", "A group for cricket fans"},
 {"B", "Sports", "A group for Sport fans"}] 

Значение счетчика для группы A должно быть 2 (было 1, проверьте последний элемент кортежа) и для группы B должно быть 1 (было 0, проверьте последний элемент кортежа).

Любые указатели?


person Geek    schedule 03.06.2015    source источник
comment
Что у вас есть до сих пор? Покажи мне код.   -  person Hynek -Pichi- Vychodil    schedule 12.06.2015


Ответы (1)


Насколько я знаю, вы не можете построить защиту с вызовом для получения подстроки из строки, поэтому вместо использования Erlang Match Specification вам придется перебирать все записи и фильтровать те, которые вам нужны.

-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 for 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 for 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.

и попробовать код:

Eshell V6.4  (abort with ^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 for cricket fans",
        "Spots,Cricket,Sachin tendulkar","Xyz","XYZ","XYZ",1},
 {group,"B","Sports","0","A group for Sport fans",
        "Sports,Cricket,Fifa,Ronaldo,Sachin tendulkar","Xyz","XYZ",
        "XYZ",0}]
5> tuples:query("sac").
[{group,"A","Cricket","0","A group for cricket fans",
  "Spots,Cricket,Sachin tendulkar","Xyz","XYZ","XYZ",1}|
 {group,"A","Cricket","0","A group for 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>
person rorra    schedule 15.06.2015
comment
: Он выдает целый кортеж в качестве вывода. Но согласно моему требованию вывод должен быть следующим: [{A, крикет, группа A для любителей крикета}, {B, спорт, группа A для любителей спорта}] - person Geek; 15.06.2015
comment
Я думал, что код говорит сам за себя, перенос полей из записи в кортеж — довольно простой шаг. Я только что обновил код с учетом ваших требований. - person rorra; 15.06.2015