Запрос к erlang ETS таблице, использующей ключ кортежа - PullRequest
1 голос
/ 27 апреля 2020

У меня есть таблица 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)).

Так что я застрял, пытаясь понять как я могу игнорировать совпадения, которые пользователь не поместил в запись запроса оболочки.

...