/*
 * 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.skywalking.oap.server.core.storage.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import lombok.Getter;

/**
 * ElasticSearch annotation is a holder including all annotations for ElasticSearch storage
 *
 * @since 9.1.0
 */
public @interface ElasticSearch {
    /**
     * Match query is designed for ElasticSearch match query with specific analyzer. It is a fuzzy query implementation
     * powered by analyzer.
     *
     * @since 9.1.0 This used to be {@link Column}'s matchQuery and analyzer attributes.
     */
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface MatchQuery {
        /**
         * The storage analyzer mode.
         *
         * @since 9.1.0 created as a new annotation.
         * @since 8.4.0 added in {@link Column}
         */
        AnalyzerType analyzer() default AnalyzerType.OAP_ANALYZER;

        /**
         * The analyzer declares the text analysis mode.
         */
        enum AnalyzerType {
            /**
             * The default analyzer.
             */
            OAP_ANALYZER("oap_analyzer"),
            /**
             * The log analyzer.
             */
            OAP_LOG_ANALYZER("oap_log_analyzer");

            @Getter
            private final String name;

            AnalyzerType(final String name) {
                this.name = name;
            }
        }
    }

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface Column {

        /**
         * Warning: this is only used to solve the conflict among the existing columns since we need support to merge all metrics
         * in one physical index template. When creating a new column, we should avoid the compatibility issue
         * between these 2 storage modes rather than use this alias.
         */
        @Deprecated
        String columnAlias();

    }
}
