I miss an ability to increment more than one counter for a given key. Would be very useful for statistical aggregate data.<div>Second thing I miss is a non-dirty update_counter. It doesn't look very useful, but would allow to use non-dirty update_counter in, for example, mnesia_frag context.<br><br>среда, 7 августа 2013 г., 15:39:11 UTC+4 пользователь Ulf Wiger написал:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
<br>There was some discussion recently on teaching update_counter some new tricks.
<br>
<br>Here is a suggestion:
<br>
<br>Right now, the function takes (Tab, Key, UpOp | [UpOp]), where
<br>  UpOp ::== {Pos, Incr} | {Pos, Incr, Threshold, WrapTo}
<br>
<br>I'd like to save the result of an operation in a temporary variable.
<br>
<br>An atomic reset, for example. (let's say counter c1 has the value 17):
<br>
<br>ets:update_counter(counters, c1, [{2, 0, '$1'}, {2, {'-', '$1'}}]) ->
<br>  [17, 0]
<br>
<br>(Increment by 0 means we read the existing value, just like today).
<br>
<br>Why use this instead of simply ets:insert/2? Well, for one thing, we get the old value back, so it's an atomic read-reset.
<br>
<br>Sum counter:
<br>
<br>ets:update_counter(counters, c2, [{2,0,'$1'}, {3,0,'$2'}, {4, {'+', '$1', '$2'}}])
<br>
<br>Wrap with parameterized threshold and reset value:
<br>
<br>ets:update_counter(counters, c3, [{3,0,'$1'}, {4,0,'$2'}, {2, Incr, '$1', '$2'}])
<br>
<br>This assumes the following changes:
<br>
<br>- A number of temp variables, like in match specs.
<br>- A 3-tuple  {Pos, Incr, SaveTo}, where SaveTo is a variable name (e.g. '$1')
<br>- A 5-tuple  {Pos, Incr, Threshold, WrapTo, SaveTo}
<br>- The possibility to use, wherever an integer() is expected
<br>  VariableName | {UnaryOp, VariableName} | {BinaryOp, Var1, Var2}
<br>
<br>We could also use this to e.g. store a value together with an increment operation. A reset with timestamp:
<br>
<br>TS = timestamp(),  % in milliseconds
<br>ets:update_counter(counters, c4, [{2, 0, '$1'}, {2, {'-', '$1'}, {3, 0, '$2'}, {3, {'-', TS, '$2'}}])
<br>
<br>…a bit bizarre perhaps, but still.
<br>
<br>Comments?
<br>
<br>BR,
<br>Ulf W
<br>
<br>
<br>Ulf Wiger, Co-founder & Developer Advocate, Feuerlabs Inc.
<br><a href="http://feuerlabs.com" target="_blank">http://feuerlabs.com</a>
<br>
<br>
<br>
<br>______________________________<wbr>_________________
<br>erlang-questions mailing list
<br><a href="javascript:" target="_blank" gdf-obfuscated-mailto="G9b7nCVirp4J">erlang-q...@erlang.org</a>
<br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a>
<br></blockquote></div>