У меня есть таблица ETS, ключ которой состоит из записи, такой как {shell, TIME, NAME, ID}, и я хочу, чтобы пользователь мог искать записи, используя комбинацию любого из них. IE: где
- ВРЕМЯ HIGH_VALUE или
- ВРЕМЯ <40 и ИМЯ == "SAM" или </li>
- ID == 123
Я понимаю, как использовать fun2ms, но недостаточно хорошо, чтобы знать, есть ли какой-нибудь чистый способ сделать это одним способом. Мое текущее решение состоит в том, чтобы сопоставить поисковый запрос с 6 возможными комбинациями типов поиска, и он просто кажется грязным по сравнению со всем моим другим кодом erlang, который широко использует сопоставление с образцом.
Не могли бы вы, ребята, помочь мне более разумно использовать таблицы fun2ms или ETS? Я очень уверен, что этот запрос можно сделать одной строкой. Вот пример одной из 6 функций, которые я использую, чтобы показать вам, что у меня есть:
getShells_by_Time(Tstart, Tend) ->
Results = ets:select(schedule_row1,ets:fun2ms(
fun(A = #activity{shell = ActivityShell,activity_data = S1Data})
when (ActivityShell#activity_shell.tsched < Tend)
andalso (ActivityShell#activity_shell.tsched > Tstart) ->
ActivityShell
end)),
РЕДАКТИРОВАТЬ:
Так вот, что я пытаюсь сделать так far:
У меня есть запись, которую я хочу использовать по умолчанию: -record (s1shell_query, {tsched = {_ScLow, _ScHigh}, id = _ID, type = _Type}).
, которая означает, что пользователь может изменить любой из условий записи для вещей, которые он хочет сопоставить. Проблема в том, что вы не можете иметь несвязанные переменные по умолчанию в записи.
Моя функция соответствия c Функция выглядит следующим образом:
{ScLow,ScHigh} = ShellQuery#s3shell_query.tsched,
ets:select(Table, ets:fun2ms(
fun(#stage3Activity{shell = #activity_shell{tsched = Tsched, id = ID, type = Type}})
when Tsched < ScLow, Tsched>ScHigh,ID == ID, Type == Type ->
#activity_shell{tsched = Tsched,id = ID,type = Type}
end)).
Так что я застрял, пытаясь понять как я могу игнорировать совпадения, которые пользователь не поместил в запись запроса оболочки.