<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Ivan, Patrik:<br>
      <br>
      Thank you both for the swift replies! Both provided functions that
      yield the desired results. The functions are: <br>
      <br>
      <tt><big><span style="font-size: 10pt;" lang="EN-US"> (I)
            ets:match(table, {"Peter", [{"children", '$1'},'_'] }).    
                                (Ivan's)</span></big></tt><tt><br>
      </tt><tt><big> </big></tt><big><tt>(II)
          ets:select(xxx,ets:fun2ms(fun({"Peter",[{"children",Data}|_]})
          -> Data end)).   (Patrick's)</tt></big><br>
      <br>
      (II) is effectively rendered to<br>
      <br>
      <big><tt>ets:select(xxx,[{{"Peter",{"children",'$1'}},[],['$1']}])</tt></big><br>
      <br>
      which is pretty similar to Ivan's suggestion. My final question
      (and I so promise) is: it appears to me that (I) performs better
      than (II) because of the lack of need of a transformation function
      such as ets:fun2ms(). However, I don't known for sure whether
      ets:match() outperforms ets:select() or not. I'm about to run a
      series of tests on big datasets to check this, but I imagine that
      there is already an answer to this question. <br>
      <br>
      Once again, thank you very much. <br>
      <br>
      Diego<br>
      <br>
      <br>
      El 05/03/13 11:34, Patrik Nyblom escribió:<br>
    </div>
    <blockquote cite="mid:5136028A.6010004@erlang.org" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">Hi!<br>
        On 03/04/2013 08:58 PM, Diego Llarrull wrote:<br>
      </div>
      <blockquote cite="mid:5134FCDF.30607@tecso.coop" type="cite">
        <meta http-equiv="Content-Type" content="text/html;
          charset=ISO-8859-1">
        Hello everyone, <br>
        <br>
        I would like to insert in an ETS table a tuple with the
        following type signature: <br>
        <br>
        <i><big><tt>{string(), [{string(), [string()]}]}</tt></big></i><br>
        <br>
        As an example: <br>
        <i><br>
        </i><i><big><tt>{"Peter", [{"children", ["Bob", "Paul"]},
              {"father", ["Mike"]}]}</tt></big></i><i><br>
          <br>
        </i><br>
        My question is the following: is it possible to solve, using
        match specifications, nested queries like "Retrieve the name of
        Peter's children" ?<br>
        <br>
        That is, a query where I would need to <br>
        <br>
        a) Fetch all ("the", since its a set) tuples of size 3 where
        "Peter" is located in the first position (doable with MS)<br>
        b) Let '$2' be the value in the second position of the tuple
        fetched in a). Then, fetch the value corresponding to the key
        "children" in '$2', if interpreted as a key-value list (i.e.
        lists:keyfind() should work on '$2'). <br>
        <br>
        If I understood correctly, lists:keyfind can't be used inside a
        match specification because they only allow the BIFs described
        in <a moz-do-not-send="true"
          href="http://www.erlang.org/doc/apps/erts/match_spec.html">http://www.erlang.org/doc/apps/erts/match_spec.html</a>.
        My question is: is there any low-level mechanism to operate on
        lists inside match specifications, or am I trying to push the
        boundaries of match specifications?<br>
        <br>
      </blockquote>
      Yes, you're trying to push the boundaries of match specifications
      :)<br>
      <br>
      You'll have to do a lists:keysearch/keyfind on the results of the
      ets:select (when you're back in proper Erlang code), only constant
      time BIF's can be added to the ms language, so it's unfortunately
      not even an option to add this particular function... Without a
      huge rewrite that is... <br>
      <br>
      So...<br>
        [lists:keyfind("children",1,P) || P <-
      ets:select(xxx,ets:fun2ms(fun({"Peter",Data}) -> Data end))].<br>
      would be the solution. Except of course if the list has a
      particular order, or you instead use some record'ish data
      structure, so that you can match directly:<br>
        ets:select(xxx,ets:fun2ms(fun({"Peter",[{"children",Data}|_]})
      -> Data end)).<br>
      But looping over the list inside the ms is not possible.<br>
      <blockquote cite="mid:5134FCDF.30607@tecso.coop" type="cite"> In
        case anyone wonders "Why not use Query Lists Comprehensions?"
        the answer is: "Because of performance issues: in our platform,
        we need to dynamically build QLCs based on the number of
        arguments that arrive, which forces us to build them as strings
        and then use qlc:string_to_handle() which is SLOW". <br>
        <br>
        Any help of insight will be greatly appreciated. Thank you very
        much in advance. <br>
        <br>
        Diego Llarrull<br>
        <br>
          <br>
      </blockquote>
      Cheers,<br>
      /Patrik<br>
      <blockquote cite="mid:5134FCDF.30607@tecso.coop" type="cite"> <br>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
erlang-questions mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
erlang-questions mailing list
<a class="moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a>
<a class="moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions">http://erlang.org/mailman/listinfo/erlang-questions</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>