2016-12-07 25 views
2

我有3個用例從mnesia表返回數據的情況 1.返回表的所有值,以便使用foldl, 2. return 1 row so我使用讀取 3.根據標準返回可變數量的記錄,所以我使用select。Erlang Mnesia選擇結果與讀取不同,foldl

我想使用相同的代碼來管理結果,但select會返回不同的數據結構。我希望有人能夠幫助我重組我的選擇以便像其他人一樣返回。

下面是問題和結果的示例代碼。問題是select不像read和foldl那樣返回表的記錄名稱。

-module(testselect2). 

-export([runtest/0]). 

-record(record_a, {b, c, d}). 
-record(record_b, {record_a, e}). 
-record(record_c, {record_b, f, intval}). 
runtest() -> 
mnesia:create_schema([node()]), 
mnesia:start(), 
mnesia:create_table(record_c, [{attributes, record_info(fields, record_c)}]), 

A1 = #record_a{b = "R1", c = "T1", d = "C1"}, 
B1 = #record_b{record_a = A1, e = "E1"}, 
C1 = #record_c{record_b = B1, f = "F1", intval = 100},  

A2 = #record_a{b = "R2", c = "T2", d = "C2"}, 
B2 = #record_b{record_a = A2, e = "E2"}, 
C2 = #record_c{record_b = B2, f = "F2", intval = 200},  

A3 = #record_a{b = "R3", c = "T3", d = "C3"}, 
B3 = #record_b{record_a = A3, e = "E3"}, 
C3 = #record_c{record_b = B3, f = "F3", intval = 300},  

{atomic, Rw} = mnesia:transaction(
       fun() -> 
       mnesia:write(C1), 
       mnesia:write(C2), 
       mnesia:write(C3)      
       end), 


io:fwrite("Result write = ~w~n", [Rw]), 

{atomic, Rr} = mnesia:transaction(
       fun() -> 
         mnesia:read({record_c, B1}) 

       end), 
io:fwrite("Result read = ~w~n", [Rr]), 

{atomic, Rf} = 
      mnesia:transaction(fun() -> 
             mnesia:foldl(fun (Rec, Acc) -> [Rec | Acc] end, 
                [], 
                record_c) 
           end), 
io:fwrite("Result foldl = ~w~n", [Rf]),           

MatchHead = #record_c{record_b='$1', f='$2', intval='$3'}, 
Guard = {'>', '$3', 100}, 
Result = {{'$1', '$2', '$3'}}, 
{atomic, Rs} = mnesia:transaction(
       fun() -> 
        mnesia:select(record_c, [{MatchHead, [Guard], [Result]}]) 
       end), 
io:fwrite("Result select = ~w~n", [Rs]). 

===== 成績

44> testselect2:的runTest()。

結果寫入= OK

結果讀取= [{record_c,{record_b,{record_a,[82,49],[84,49],[67,49]},[69,49]} ,[70,49],100}]

結果foldl = [{record_c,{record_b,{record_a,[82,49],[84,49],[67,49]},[69,49 ]},[70,49],100},{record_c,{record_b,{record_a,[82,51],[84,51],[67,51]},[69,51]},[70, 51],300},{record_c,{record_b,{record_a,[82,50],[84,50],[67,50]},[69,50]},[70,50],200}]結果select = [{{record_b,{record_a,[82,51],[84,51],[67,51]},[69,51]},[70,51],300},..., {{record_b,{record_a,[82,50],[84,50],[67,50]},[69,50]},[70,50],200}]

確定

正如你可以看到上面閱讀和與foldl記錄開始{record_c,{...其中選擇缺少record_c,只是有{{...

我已經無法找到一種方法讓選擇返回相同的結構,以便我的處理代碼可以適用於所有3種用例。任何建議將不勝感激。

回答

1

我不是mnesia專家,但我知道當您使用ETS匹配表達式時,您可以確定結果的樣子。您可以使用Result = {{'$1', '$2', '$3'}}創建結果條件,這使得它們以一元組形式出現爲三元組,如我們在輸出中看到的那樣。每ets:select/1,你要使用的特殊變量'$_'返回整個匹配的對象,所以這應該在地方工作,你的Result = ...線:

Result = '$_', 
+0

感謝那些做到了!我真的很欣賞這種快速反應。 – Gregg

+0

@Gregg np。如果SO上的答案解決了您的問題,那麼您需要將其標記爲「已接受」並/或將其提升爲幫助未來用戶找到好答案。 –