/*
 * Copyright (c) 2020 Huawei Technologies Co.,Ltd.
 *
 * openGauss is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * ---------------------------------------------------------------------------------------
 * 
 * vecplainagg.h
 *     plain agg class and class member declare.
 * 
 * IDENTIFICATION
 *        src/include/vecexecutor/vecplainagg.h
 *
 * ---------------------------------------------------------------------------------------
 */

#ifndef VECPLAINAGG_H
#define VECPLAINAGG_H

#include "vecexecutor/vecagg.h"

class PlainAggRunner : public BaseAggRunner {
public:
    VectorBatch* Run();

    PlainAggRunner(VecAggState* runtime);
    ~PlainAggRunner(){};

    void Build()
    {}

    VectorBatch* Probe()
    {
        return NULL;
    }

    bool ResetNecessary(VecAggState* node);

    void endPlainAgg();

private:
    /* Plain aggregation without group by.*/
    template <bool hasDistinct>
    VectorBatch* RunPlain();

    void BindingFp();

    VectorBatch* (PlainAggRunner::*plainAggregation)();

    template <bool hasDistinct>
    void buildPlaintAgg(VectorBatch* outerBatch, bool first_batch);
};

#endif /* VECPLAINAGG_H */