rfc: rdbms - new type system

Ulf Wiger (AL/EAB) <>
Mon Feb 27 18:05:53 CET 2006

Ulf Wiger wrote:

> I'm toying with the idea of allowing a match specification
> as a table-level 'type' specification:

> Ms = [{{1,2,'$1'}, [{is_integer,'$1'}], [{{1,2,{float,'$1'}}}]}].
> [{{1,2,'$1'},[{is_integer,'$1'}],[{{1,2,{float,'$1'}}}]}]
> 10> ets:match_spec_run([{1,2,3}],ets:match_spec_compile(Ms)).

> [{1,2,3.00000}]

> It sure is ugly, but it's there, and it's fast. It 
> is also able to do the type coercion you're asking for.

Ok, I added this to rdbms. It gives you your float

rdbms_write_filter(Config) when is_list(Config) ->
    ?line {atomic, ok} = rdbms:create_table(
			   [{attributes, [key, value]},
			      {{attr,value,type}, float}
     ?line {atomic, ok} = rdbms:create_table(
			   [{attributes, [key, value]},
			      {{attr,value,type}, float}
    ?line trans(fun() ->
			mnesia:write({rdbms_w_filter, 17, 1})
    ?line trans(fun() ->
			mnesia:write({rdbms_w_filter, 17, 1.0})
    ?line fail_trans(fun() ->
			mnesia:write({rdbms_no_w_filter, 17, 1})
    ?line trans(fun() ->
			mnesia:write({rdbms_no_w_filter, 17, 1.0})

(The type check on #rdbms_no_w_filter{value = 1} fails
since it's not a float, and there is no filter.)

Any type specifications are run on the output from the 
write_filter. If it doesn't produce a valid record, the
transaction is aborted.

There is also a read_filter, but I haven't added code 
for that yet. There is no overhead if the filters aren't
used (the code generator doesn't lay out code if the 
filters are undefined).

Applying the actual filter seems to take a few tens of
microseconds. I have to compile the match spec each
time. I don't think it can be avoided.


More information about the erlang-questions mailing list