mindreframer

mindreframer

I needed to store some structs/maps in ETS and wanted to use a query language that felt simple and approachable.

After looking at several alternatives, I noticed that all the wrappers around ETS match specifications were doing a bit too much for my taste. This is how EtsSelect came to life. :slightly_smiling_face:

You can dump your maps/structs into an ETS table and select them using the following query syntax:

# "OR" query
%{or: [[:=, :field1, "value1"], [:=, :field2, "value2"]]}

# "AND" query
%{and: [[:=, :field1, "value1"], [:=, :field2, "value2"]]}

# OR query with nested AND
%{or: [[:=, :status, :new], %{and: [[:=, :status, :old], [:=, :age, 50]]}]}

That’s basically it. Check out the ExUnit tests to see if this could be useful to you.

https://github.com/maxohq/ets_select

Cheers!

Showing Posts 1 to 6

axelson

axelson

Scenic Core Team

Oooh, another match spec library! I definitely welcome alternative DSLs in the space.

Are you interested in adding more support for keys that are tuples? For example in my data_tracer library I insert data that looks roughly like:

{{1723901292213, 0, "age"}, "100"}
{{1723901292214, 0, "age"}, "101"}
{{1723901292214, 0, "name"}, "bob"}

And I want to do a query to get all the values where the third element in the tuple key is "age", i.e. something like :ets.select(:my_table, match_spec) == ["100", "101"]. From what I can tell this isn’t currently possible to query via ets_select, is that right?

I also submitted a quick PR to remove the test files from the published package: Exclude test files from published package by axelson · Pull Request #1 · maxohq/ets_select · GitHub

mindreframer

mindreframer OP

@axelson Thanks for the encouragement!

While it could be possible, it would change the original goal of the package. It seems you are storing arbitrary values for debugging in data_tracer, yet my use case is selecting based on field values in maps / structs.

BTW, GitHub - axelson/data_tracer: Elixir library to facilitate debugging data flow, helps capture terms for later inspection · GitHub looks awesome, gonna try it out soon. If you want to have a query language for data_tracer, please give some example queries. IF your only query type is selecting on the 3rd element of the key tuple, there is probably no need for a 3rd-party library :slight_smile:

The spec to match all elements with “age” OR “name” would look like this:

match_spec = [
    {{{:_, :_, :"$3"}, :_}, [{:orelse, {:==, :"$3", "age"}, {:==, :"$3", "name"}}], [:"$_"]}
]

So, please share some examples, maybe I could contribute a query language just for data_tracer, that would be most simple and direct approach.

mindreframer

mindreframer OP

It seems the only place where you execute a query on ETS tables is this

Exactly this query should be covered by this spec:

match_spec = [
    {{{:_, :_, :"$3"}, :"$4"}, [{:==, :"$3", key}], [:"$4"]}
]

Example:

:ets.new(:my_table, [:set, :public, :named_table])

:ets.insert(:my_table, {{1723901292213, 0, "age"}, "100"})
:ets.insert(:my_table, {{1723901292214, 0, "age"}, "101"})
:ets.insert(:my_table, {{1723901292214, 0, "name"}, "bob"})

key = "age"
match_spec = [
    {{{:_, :_, :"$3"}, :"$4"}, [{:==, :"$3", key}], [:"$4"]}
]
result = :ets.select(:my_table, match_spec)
#=> ["101", "100"]

So… In theory you could drop your dependency on Matcha.

mindreframer

mindreframer OP

@axelson I went ahead and dropped matcha in this PR: Feat: drop `matcha` package by mindreframer · Pull Request #5 · axelson/data_tracer · GitHub

It should be 100% exact behaviour, just without all the non-trivial abstractions provided by GitHub - christhekeele/matcha: 🍵 First-class Elixir match specifications. · GitHub.

If you want a proper query language, this should be done separately.

Have a good Saturday!

axelson

axelson

Scenic Core Team

Fair enough! All libraries need to define the scope that they want to tackle :+1:

Thank you for the kind words! I don’t have a plan to add a query language for data_tracer, the use case is mainly getting stored values out ordered by insertion and only for specific keys. For my usage of it I probably don’t even need to worry about efficient ETS lookups and could instead dump the whole table and filter it, but I wanted to take it as an opportunity to work with ETS in a more efficient manner.

Thank you for the contribution! I’ve merged the PR and released it as version 0.1.2 :tada:

The reason matcha was even there was two fold: I wanted an excuse to try out Matcha, and I find match specs inscrutable to the point where I’m not super interested in learning them.

mindreframer

mindreframer OP

@axelson

Yeah, the specs are really painful to read / write / understand. But… Just after having implemented he EtsSelect package, it was bearable to come up this those 2 match-specs. And having less dependencies is always nice :slight_smile:

Thanks for merging the PR!

@dimitarvp Yeah, I’m quite familiar with the great, even outstanding quality of Elixir docs. I just dont need to lookup something, that is already working :slight_smile: Only when things dont behave as expected, I dig deeper. So 100% agree with you on this one.

Thanks for chiming in and good night (its about midnight in EU)!

— All posts loaded —

Where Next? Top

Trending in Announcing Top

type1fool
WebAuthnLiveComponent WebAuthnComponents See this post about renaming the package. Passwordless authentication for Phoenix LiveView app...
New
GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
woylie
I released Doggo, a collection of unstyled Phoenix components. https://github.com/woylie/doggo Features Unstyled Phoenix components....
New
ahamez
Hi everyone, I’ve been working on this protobuf library for 3 years. We use it in the company I work for, EasyMile, to communicate with ...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
kip
I’ll shortly be launching Text, a nascent text analysis library. Current functionality In this early version (not ready for prime time) ...
New
kip
Following on from my CLDR lbraries I started work on Unicode transforms. But like everything related to CLDR there is a lot of yak-shavin...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews