Date range and match specification syntax

Ulf Wiger (AL/EAB) ulf.wiger@REDACTED
Tue Oct 7 16:51:45 CEST 2003


On October 7, 2003, Massimo Cesaro wrote:
>> Try to use Query = ets:fun2ms(fun(X) -> ... end) instead,
>> slightly simpler to use :-) 
>You kidding, don't you ?! :-)
>Seriously, I'd like to see a short tutorial or more examples about it.


Here's a short tutorial using ets, and trying to mimic your 
problem (the ms_transform manual is daunting, I agree):

Your match spec would look pretty much like this:

fun({_,_,D}) when StartDate =< D, D =< EndDate ->
   object()
end


1> ets:new(cdr,[set,public,named_table,{keypos,2}]).
cdr
2> [ets:insert(cdr,{cdr,D,{2003,12,D}}) || D <- lists:seq(1,31)].
[true,
 true|...]
3> ets:tab2list(cdr).
[{cdr,28,{2003,12,28}},
 {cdr,27,{2003,12,27}},
 {cdr,1,{2003,12,1}},
 {cdr,14,{2003,12|...}},
 {cdr,5,{2003|...}},
 {cdr,16,{...}},
 {cdr,7|...},
 {cdr|...},
 {...}|...]
4> StartDate = {2003,12,3}.
{2003,12,3}
5> EndDate = {2003,12,17}.
{2003,12,17}
6> P = ets:fun2ms(fun({_,_,D}) when StartDate =< D, D =< EndDate -> object() end).
[{{'_','_','$1'},
  [{'=<',{const,{2003,12,3}},'$1'},{'=<','$1',{const,{2003,12,17}}}],
  ['$_']}]
7> catch ets:select(cdr,P).
[{cdr,10,{2003,12,10}},
 {cdr,13,{2003,12,13}},
 {cdr,15,{2003,12,15}},
 {cdr,11,{2003,12,11}},
 {cdr,3,{2003,12,3}},
 {cdr,8,{2003,12,8}},
 {cdr,12,{2003,12,12}},
 {cdr,4,{2003,12,4}},
 {cdr,14,{2003,12,14}},
 {cdr,5,{2003,12,5}},
 {cdr,16,{2003,12,16}},
 {cdr,7,{2003,12,7}},
 {cdr,6,{2003,12,6}},
 {cdr,9,{2003,12,9}},
 {cdr,17,{2003,12,17}}]
8>  



More information about the erlang-questions mailing list