2015-06-03 16 views
5

ho più tuple mnesia come (GroupID è la chiave primaria)prendendo e aggiornamento dati in mnesia

{GroupID, GroupName, GroupType, GroupDescription, GroupTag, CreatorID, AdminID, MemberList, Counter}. 

MemberList = "[email protected],[email protected],[email protected]". 
GroupName = "Any String Value". % e.g.: "basketball" 
GroupTag = "comma separated values". % e.g.: "Sports,Cricket,Fifa,Ronaldo" 

mi passerà un carattere o una parola a una funzione. Questa funzione cercherà il personaggio in GroupName e GroupTag.

In caso di esito positivo, restituirà tuple separate da virgola di GroupID, GroupName, GroupDescription; E il contatore dovrebbe essere incrementato per la riga corrispondente.

Supponiamo che nei miei mnesia tuple di database sono

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

Quindi, se la ricerca di "sac", dovrebbe dare l'uscita

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

valore del contatore per il gruppo A dovrebbe essere 2 (era 1, controlla l'ultimo elemento della tupla) e per il gruppo B dovrebbe essere 1 (era 0, controlla l'ultimo elemento della tupla).

Eventuali suggerimenti?

+0

Cos'hai finora? Fammi vedere il codice. –

risposta

1

Per quanto ne so, non è possibile creare una guardia con una chiamata per ottenere la sottostringa da una stringa, quindi invece di utilizzare una specifica di corrispondenza di Erlang si dovrebbe iterare su tutti i record e filtrare quelli di cui si ha bisogno .

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

e per cercare il codice:

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> 
+0

: Sta dando un'intera tupla come output.Ma secondo il mio requisito l'output dovrebbe essere come -> [{"A", "Cricket", "Un gruppo per fan del cricket"}, {"B", "Sport", "Un gruppo per i fan dello sport"}] – Geek

+0

Ho pensato che il codice fosse auto-esplicativo, prendere i campi da un record in una tupla è un passo abbastanza facile. Ho appena aggiornato il codice con i tuoi requisiti. – rorra