/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.kylin.metadata.cube.planner.algorithm;

import java.math.BigInteger;

public class CuboidBenefitModel {
    private CuboidModel cuboidModel;
    private BenefitModel benefitModel;

    public CuboidBenefitModel(CuboidModel cuboidModel, BenefitModel benefitModel) {
        this.cuboidModel = cuboidModel;
        this.benefitModel = benefitModel;
    }

    public void reset(CuboidModel cuboidModel, BenefitModel benefitModel) {
        this.cuboidModel = cuboidModel;
        this.benefitModel = benefitModel;
    }

    public BigInteger getCuboidId() {
        return cuboidModel == null ? null : cuboidModel.cuboidId;
    }

    public Double getBenefit() {
        return benefitModel == null ? null : benefitModel.benefit;
    }

    @Override
    public String toString() {
        return "CuboidBenefitModel [cuboidModel=" + cuboidModel + ", benefitModel=" + benefitModel + "]";
    }

    public static class CuboidModel {
        public final BigInteger cuboidId;

        public final long recordCount;
        public final double spaceSize;

        public final double hitProbability;
        public final long scanCount;

        public CuboidModel(BigInteger cuboId, long recordCount, double spaceSize, double hitProbability,
                long scanCount) {
            this.cuboidId = cuboId;
            this.recordCount = recordCount;
            this.spaceSize = spaceSize;
            this.hitProbability = hitProbability;
            this.scanCount = scanCount;
        }

        @Override
        public String toString() {
            return "CuboidModel [cuboidId=" + cuboidId + ", recordCount=" + recordCount + ", spaceSize=" + spaceSize
                    + ", hitProbability=" + hitProbability + ", scanCount=" + scanCount + "]";
        }
    }

    public static class BenefitModel {
        public final double benefit;
        public final int benefitCount;

        public BenefitModel(double benefit, int benefitCount) {
            this.benefit = benefit;
            this.benefitCount = benefitCount;
        }

        @Override
        public String toString() {
            return "BenefitModel [benefit=" + benefit + ", benefitCount=" + benefitCount + "]";
        }
    }
}
