<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><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">https://github.com/Feuerlabs/kvdb</a></div><br><div><div>On 27 Oct 2014, at 10:02, Lukas Larsson <<a href="mailto:lukas@erlang.org">lukas@erlang.org</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><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>
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>http://erlang.org/mailman/listinfo/erlang-questions<br></blockquote></div><br><div apple-content-edited="true">
<span class="Apple-style-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">http://feuerlabs.com</a></div></div><div><br></div></span><br class="Apple-interchange-newline">

</div>
<br></body></html>