The MonetDB operator multiplex concept has been pivotal to easily apply any scalar function to elements
in a containers. Any operator cmd came with its multiplex variant [cmd]. Given the signature cmd(T1,..,Tn) : Tr,
it could be applied also as [CMD](bat[:any_1,:T1],...,bat[any_1,Tn]) :bat[any_1,Tr]
.
The semantics of the multiplex is to perform the positional join on all bat-valued parameters, and to execute the CMD for each combination of matching tuples. All results are collected in a result BAT. All but one argument may be replaced by a scalar value.
The generic solution to the multiplex operators is to translate them to a MAL loop. A snippet of its behaviour:
b:= bat.new(:int,:int);
bat.insert(b,1,1);
c:bat[:int,:int]:= mal.multiplex("calc.+",b,1);
optimizer.multiplex();
The current implementation requires the target type to be mentioned explicitly. The result of the optimizer is:
b := bat.new(:int,:int);
bat.insert(b,1,1);
x8 := bat.new(:int,:int);
barrier (x11,x12,x13):= bat.newIterator(b);
x15 := calc.+(x13,1);
bat.insert(x8,x12,x15);
redo (x11,x12,x13):= bat.hasMoreElements(b);
exit (x11,x12,x13);
c := _8;