Refactor aggregate context to be carried with the scope. #98
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Each aggregate function instance in the AST carries a unique
ID. This allows the function to store its own state in the
aggregate context without interference from other instances of
the same function (e.g. having two count() instaces is OK)
The scope may contain a reference to an AggregatorCtx
object. This object manages access to the aggregate
context. The main method that should be used is Modify() which
mofidies the context under lock.
When the scope spawns a child scope, the child scope does not
have its own AggregatorCtx, instead chasing its parent to find
one. This allows aggregate functions within the scope to see
the wider AggregatorCtx which controls the entire query clause.
When the query runs in an isolated context, the AggregatorCtx
is recreated at the calling scope. This allows isolated scopes
to reset the AggregatorCtx. For example, when calling a LET
defined function, a new context is created.
If a GROUP BY query, the Grouper will create a new
AggregatorCtx for each bin. This allows aggregate functions to
apply on each group separately.