<div dir="ltr">Thank you, Lukas and Ulf. I'll check out both proposed solutions.<div><br></div><div>I needed this prefix matching on gproc, so I don't think kvdb will be a possible solution for me in this case .I will probably need to see if I can use a simple string instead of a binary to tag my processes.</div><div><br></div><div>Regards,</div><div><br></div><div>--</div><div><br></div><div>Eduardo</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 27 October 2014 23:06, Ulf Wiger <span dir="ltr"><<a href="mailto:ulf@feuerlabs.com" target="_blank">ulf@feuerlabs.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><br></div><div>FWIW, the kvdb database [1] allows for select operations on e.g. ets-based tables, including prefix match on binary keys.</div><div><br></div><div>It does this through a little trickery. Since the match syntax doesn’t support prefix notation for binaries, and kvdb keys are always some form of binary encoding, specifying a list prefix, e.g. “aa” ++ ‘_’ in the head pattern will indicate to kvdb that you want to match on prefix, and the match spec will be modified. More specifically, kvdb will derive a proper prefix and do a prefix_match using ‘next’ iteration, and then matching the objects using ets:match_spec_run/2.</div><div><br></div><div>Example:</div><div><br></div><div><div style="margin:0px;font-size:11px;font-family:Menlo">Eshell V5.10.3  (abort with ^G)</div><div style="margin:0px;font-size:11px;font-family:Menlo">1> kvdb:start().</div><div style="margin:0px;font-size:11px;font-family:Menlo">starting kvdb</div><div style="margin:0px;font-size:11px;font-family:Menlo">KVDB Dbs = []</div><div style="margin:0px;font-size:11px;font-family:Menlo">ok</div><div style="margin:0px;font-size:11px;font-family:Menlo">2> kvdb:open(db,[{backend,ets}]).</div><div style="margin:0px;font-size:11px;font-family:Menlo">File = "db.db"</div><div style="margin:0px;font-size:11px;font-family:Menlo">{ok,<0.53.0>}</div><div style="margin:0px;font-size:11px;font-family:Menlo">3> kvdb:add_table(db,t,[]).</div><div style="margin:0px;font-size:11px;font-family:Menlo">ok</div><div style="margin:0px;font-size:11px;font-family:Menlo">4> kvdb:put(db,t,{<<"aaaaa">>,1}).</div><div style="margin:0px;font-size:11px;font-family:Menlo">ok</div><div style="margin:0px;font-size:11px;font-family:Menlo">5> kvdb:put(db,t,{<<"aabbb">>,2}).</div><div style="margin:0px;font-size:11px;font-family:Menlo">ok</div><div style="margin:0px;font-size:11px;font-family:Menlo">6> kvdb:put(db,t,{<<"aabcc">>,3}).</div><div style="margin:0px;font-size:11px;font-family:Menlo">ok</div><div style="margin:0px;font-size:11px;font-family:Menlo">7> kvdb:select(db,t,[{{<<"aa">>,'_'},[],['$_']}]).       </div><div style="margin:0px;font-size:11px;font-family:Menlo">{[],#Fun<kvdb_direct.34.51139377>}</div><div style="margin:0px;font-size:11px;font-family:Menlo">8> kvdb:select(db,t,[{{"aa" ++ '_','_'},[],['$_']}]).</div><div style="margin:0px;font-size:11px;font-family:Menlo">{[{<<"aaaaa">>,1},{<<"aabbb">>,2},{<<"aabcc">>,3}],</div><div style="margin:0px;font-size:11px;font-family:Menlo"> #Fun<kvdb_direct.34.51139377>}</div><div style="margin:0px;font-size:11px;font-family:Menlo">9> kvdb:select(db,t,[{{"aab" ++ '_','_'},[],['$_']}]).</div><div style="margin:0px;font-size:11px;font-family:Menlo">{[{<<"aabbb">>,2},{<<"aabcc">>,3}],</div><div style="margin:0px;font-size:11px;font-family:Menlo"> #Fun<kvdb_direct.34.51139377>}</div></div><div><br></div><div>This is obviously (significantly) slower than doing a normal ets:select() or mnesia:[dirty_]select(), but it’s mainly a question of constant-factor overheads. Kvdb clearly puts semantics before performance. ;-)</div><div><br></div><div>BR,</div><div>Ulf W</div><div><br></div><div>[1] <a href="https://github.com/Feuerlabs/kvdb" target="_blank">https://github.com/Feuerlabs/kvdb</a></div><br><div><div><div class="h5"><div>On 27 Oct 2014, at 10:02, Lukas Larsson <<a href="mailto:lukas@erlang.org" target="_blank">lukas@erlang.org</a>> wrote:</div><br></div></div><blockquote type="cite"><div><div class="h5"><div dir="ltr">Hello,<br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 23, 2014 at 11:35 AM, Eduardo Gurgel <span dir="ltr"><<a href="mailto:edgurgel@gmail.com" target="_blank">edgurgel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Is it possible to match the prefix of a binary using ETS match spec?</div></blockquote><div><br></div><div>It is not possible.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">And if it's not, is it a limitation or just a missing implementation?<br></div></blockquote><div><br></div><div>At the moment it is both :)</div><div><br></div><div>I've never tried to do something like that, but I would guess you work around this limitation by extracting what you have to match from the binary into a surrounding tuple before doing the insert. Right now there is afaik no plan to add the possibility to do this.</div><div><br></div><div>Lukas</div></div></div></div></div></div>
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br><div>
<span style="border-collapse:separate;border-spacing:0px"><div><div>Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.</div><div><a href="http://feuerlabs.com" target="_blank">http://feuerlabs.com</a></div></div><div><br></div></span><br>

</div>
<br></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Eduardo<br></div>
</div>