class FixedMaximumAggregation extends MaximumAggregation {

        private final int size;

        public FixedMaximumAggregation(Signature signature, BoundSignature boundSignature) {
            super(signature, boundSignature);
            size = ((FixedWidthType) partialType()).fixedSize();
        }

        @Nullable
        @Override
        public DocValueAggregator<?> getDocValueAggregator(LuceneReferenceResolver referenceResolver,
                                                           List<Reference> aggregationReferences,
                                                           DocTableInfo table,
                                                           List<Literal<?>> optionalParams) {
            Reference reference = aggregationReferences.get(0);
            if (!reference.hasDocValues()) {
                return null;
            }
            DataType<?> arg = reference.valueType();
            switch (arg.id()) {
                case ByteType.ID:
                case ShortType.ID:
                case IntegerType.ID:
                case LongType.ID:
                case TimestampType.ID_WITH_TZ:
                case TimestampType.ID_WITHOUT_TZ:
                    return new LongMax(reference.storageIdent(), arg);

                case FloatType.ID:
                    return new FloatMax(reference.storageIdent());
                case DoubleType.ID:
                    return new DoubleMax(reference.storageIdent());

                default:
                    return null;
            }
        }

        @Nullable
        @Override
        public Object newState(RamAccounting ramAccounting,
                               Version indexVersionCreated,
                               Version minNodeInCluster,
                               MemoryManager memoryManager) {
            ramAccounting.addBytes(size);
            return null;
        }

        @Override
        public Object reduce(RamAccounting ramAccounting, Object state1, Object state2) {<FILL_FUNCTION_BODY>}
    }

            if (state1 == null) {
                return state2;
            }
            if (state2 == null) {
                return state1;
            }
            int cmp = type.compare(state1, state2);
            if (cmp < 0) {
                return state2;
            }
            return state1;
        
<methods>public non-sealed void <init>() ,public DocValueAggregator<?> getDocValueAggregator(io.crate.expression.reference.doc.lucene.LuceneReferenceResolver, List<io.crate.metadata.Reference>, io.crate.metadata.doc.DocTableInfo, List<Literal<?>>) ,public boolean isRemovableCumulative() ,public transient abstract java.lang.Object iterate(io.crate.data.breaker.RamAccounting, io.crate.memory.MemoryManager, java.lang.Object, Input<?>[]) throws org.elasticsearch.common.breaker.CircuitBreakingException,public abstract java.lang.Object newState(io.crate.data.breaker.RamAccounting, org.elasticsearch.Version, org.elasticsearch.Version, io.crate.memory.MemoryManager) ,public AggregationFunction<?,java.lang.Object> optimizeForExecutionAsWindowFunction() ,public abstract DataType<?> partialType() ,public abstract java.lang.Object reduce(io.crate.data.breaker.RamAccounting, java.lang.Object, java.lang.Object) ,public java.lang.Object removeFromAggregatedState(io.crate.data.breaker.RamAccounting, java.lang.Object, Input<?>[]) ,public abstract java.lang.Object terminatePartial(io.crate.data.breaker.RamAccounting, java.lang.Object) <variables>