2015-06-03 23 views
5

Ich habe mehrere Mnesia Tupeln wie (GroupID ist der Primärschlüssel)Fetching und Aktualisieren von Daten 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" 

I wird ein Zeichen oder Wort an eine Funktion. Diese Funktion sucht das Zeichen in GroupName und GroupTag.

Wenn erfolgreich, gibt es Komma getrennte Tupel von GroupID, GroupName, GroupDescription; Und Counter sollte für die entsprechende Zeile erhöht werden.

Es wäre in meiner Mnesia Datenbank Tupel

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

Also, wenn ich für „Sack“ zu suchen, sollte es dem Ausgang

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

Zählerwert für die Gruppe A sollte 2 geben (es war 1, überprüfe das letzte Element des Tupels) und für Gruppe B sollte 1 sein (es war 0, überprüfe das letzte Element des Tupels).

Irgendwelche Zeiger?

+0

Was Sie bisher bekommen haben? Zeig mir den Code. –

Antwort

1

Soweit ich weiß, können Sie keinen Wächter mit einem Aufruf erstellen, um den Teilstring von einem String zu erhalten, also müssten Sie anstelle einer Erlang Match Specification alle Datensätze durchlaufen und diejenigen filtern, die Sie benötigen .

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

und den Code zu versuchen:

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

: Es gibt ganze Tupel als output.But nach meiner Anforderung sollte Ausgabe als -> [{"A", "Cricket", "Eine Gruppe für Cricket-Fans"}, {"B", "Sport", "Eine Gruppe für Sportfans"}] – Geek

+0

Ich dachte, der Code wäre selbsterklärend, das Herausnehmen von Feldern aus einem Record in ein Tuple ist ein ziemlich einfacher Schritt. Ich habe den Code nur mit Ihren Anforderungen aktualisiert. – rorra