2016-12-07 2 views
2

У меня есть ситуация с 3 вариантами использования для возврата данных из таблицы mnesia 1. верните все значения таблицы, чтобы я использовал foldl, 2. верните 1 строку так Я использую read 3. верните переменное количество записей на основе критериев, поэтому я использую select.Erlang Mnesia Выберите результат не такой, как read, foldl

Я хотел бы использовать тот же код для управления результатами, но выбор возвращает другую структуру данных. Я надеюсь, что кто-то может помочь мне перестроить мой выбор, чтобы вернуть то же самое, что и другие.

Ниже приведен пример кода проблемы и результатов. Проблема заключается в том, что select не возвращает имя записи для таблицы, так как читает и складывает.

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

Результат записи = нормально

Результат чтения = [{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}]

Выбор результата = [{{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 решит вашу проблему, вы захотите пометить ее «принятой» и/или повысить ее, чтобы помочь будущим пользователям определить хорошие ответы. –

Смежные вопросы