/*
 * 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.eagle.log.entity;

import org.apache.eagle.log.entity.meta.Column;
import org.apache.eagle.log.entity.meta.ColumnFamily;
import org.apache.eagle.log.entity.meta.Indexes;
import org.apache.eagle.log.entity.meta.Service;
import org.apache.eagle.log.entity.meta.Index;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import org.apache.eagle.log.base.taggedlog.TaggedLogAPIEntity;
import org.apache.eagle.log.entity.meta.Prefix;
import org.apache.eagle.log.entity.meta.Table;
import org.apache.eagle.log.entity.meta.TimeSeries;

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
@Table("eagle_metric")
@ColumnFamily("f")
@Prefix("dmeta")
@Service("MetricMetadataService")
@TimeSeries(false)
@Indexes({
          @Index(name = "Index_1_name", columns = {
                                                   "name"
          }, unique = true)
    })
public class MetricMetadataEntity extends TaggedLogAPIEntity {

    @Column("a")
    private String storeType;
    @Column("b")
    private String displayName;
    @Column("c")
    private String defaultDownSamplingFunction;
    @Column("d")
    private String defaultAggregateFunction;
    @Column("e")
    private String aggFunctions;
    @Column("f")
    private String downSamplingFunctions;
    @Column("g")
    private String resolutions;
    @Column("h")
    private String drillDownPaths;

    public String getStoreType() {
        return storeType;
    }

    public void setStoreType(String storeType) {
        this.storeType = storeType;
        pcs.firePropertyChange("storeType", null, null);
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
        pcs.firePropertyChange("displayName", null, null);
    }

    public String getDefaultDownSamplingFunction() {
        return defaultDownSamplingFunction;
    }

    public void setDefaultDownSamplingFunction(String defaultDownSamplingFunction) {
        this.defaultDownSamplingFunction = defaultDownSamplingFunction;
        pcs.firePropertyChange("defaultDownSamplingFunction", null, null);
    }

    public String getDefaultAggregateFunction() {
        return defaultAggregateFunction;
    }

    public void setDefaultAggregateFunction(String defaultAggregateFunction) {
        this.defaultAggregateFunction = defaultAggregateFunction;
        pcs.firePropertyChange("defaultAggregateFunction", null, null);
    }

    public String getAggFunctions() {
        return aggFunctions;
    }

    public void setAggFunctions(String aggFunctions) {
        this.aggFunctions = aggFunctions;
        pcs.firePropertyChange("aggFunctions", null, null);
    }

    public String getDownSamplingFunctions() {
        return downSamplingFunctions;
    }

    public void setDownSamplingFunctions(String downSamplingFunctions) {
        this.downSamplingFunctions = downSamplingFunctions;
        pcs.firePropertyChange("downSamplingFunctions", null, null);
    }

    public String getResolutions() {
        return resolutions;
    }

    public void setResolutions(String resolutions) {
        this.resolutions = resolutions;
        pcs.firePropertyChange("resolutions", null, null);
    }

    public String getDrillDownPaths() {
        return drillDownPaths;
    }

    public void setDrillDownPaths(String drillDownPaths) {
        this.drillDownPaths = drillDownPaths;
        pcs.firePropertyChange("drillDownPaths", null, null);
    }

}
