Class AvgAggregator

  • All Implemented Interfaces:
    java.io.Externalizable, java.io.Serializable, Formatable, TypedFormat, ExecAggregator

    public final class AvgAggregator
    extends SumAggregator
    Aggregator for AVG(). Extends the SumAggregator and implements a count. Result is then sum()/count(). To handle overflow we catch the exception for value out of range, then we swap the holder for the current sum to one that can handle a larger range. Eventually a sum may end up in a SQLDecimal which can handle an infinite range. Once this type promotion has happened, it will not revert back to the original type, even if the sum would fit in a lesser type.
    See Also:
    Serialized Form
    • Field Detail

      • count

        private long count
      • scale

        private int scale
    • Constructor Detail

      • AvgAggregator

        public AvgAggregator()
    • Method Detail

      • merge

        public void merge​(ExecAggregator addend)
                   throws StandardException
        Description copied from interface: ExecAggregator
        Merges one aggregator into a another aggregator. Merges two partial aggregates results into a single result. Needed for:
        • parallel aggregation
        • vector aggregation (GROUP BY)
        • distinct aggregates (e.g. MAX(DISTINCT Col))

        An example of a merge would be: given two COUNT() aggregators, C1 and C2, a merge of C1 into C2 would set C1.count += C2.count. So, given a CountAggregator with a getCount() method that returns its counts, its merge method might look like this:

        
                        public void merge(ExecAggregator inputAggregator) throws StandardException
                        {
                           count += ((CountAccgregator)inputAggregator).getCount();
                        } 
        Specified by:
        merge in interface ExecAggregator
        Overrides:
        merge in class OrderableAggregator
        Parameters:
        addend - the other Aggregator (input partial aggregate)
        Throws:
        StandardException - on error
        See Also:
        ExecAggregator.merge(org.apache.derby.iapi.sql.execute.ExecAggregator)
      • newAggregator

        public ExecAggregator newAggregator()
        Description copied from interface: ExecAggregator
        Return a new initialized copy of this aggregator, any state set by the setup() method of the original Aggregator must be copied into the new aggregator.
        Specified by:
        newAggregator in interface ExecAggregator
        Overrides:
        newAggregator in class SumAggregator
        Returns:
        ExecAggregator the new aggregator
      • writeExternal

        public void writeExternal​(java.io.ObjectOutput out)
                           throws java.io.IOException
        Description copied from class: OrderableAggregator
        Although we are not expected to be persistent per se, we may be written out by the sorter temporarily. So we need to be able to write ourselves out and read ourselves back in. We rely on formatable to handle situations where value is null.

        Why would we be called to write ourselves out if we are null? For scalar aggregates, we don't bother setting up the aggregator since we only need a single row. So for a scalar aggregate that needs to go to disk, the aggregator might be null.

        Specified by:
        writeExternal in interface java.io.Externalizable
        Overrides:
        writeExternal in class OrderableAggregator
        Throws:
        java.io.IOException - on error
        See Also:
        Externalizable.writeExternal(java.io.ObjectOutput)
      • readExternal

        public void readExternal​(java.io.ObjectInput in)
                          throws java.io.IOException,
                                 java.lang.ClassNotFoundException
        Specified by:
        readExternal in interface java.io.Externalizable
        Overrides:
        readExternal in class OrderableAggregator
        Throws:
        java.io.IOException - on error
        java.lang.ClassNotFoundException - on error
        See Also:
        Externalizable.readExternal(java.io.ObjectInput)