/*
 * 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.ambari.metrics.adservice.db

object PhoenixQueryConstants {

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /* Table Name constants */
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  val METRIC_PROFILE_TABLE_NAME = "METRIC_PROFILE"
  val METHOD_PARAMETERS_TABLE_NAME = "METHOD_PARAMETERS"
  val PIT_ANOMALY_METRICS_TABLE_NAME = "PIT_METRIC_ANOMALIES"
  val TREND_ANOMALY_METRICS_TABLE_NAME = "TREND_METRIC_ANOMALIES"
  val MODEL_SNAPSHOT = "MODEL_SNAPSHOT"

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /* CREATE statement constants */
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  val CREATE_METHOD_PARAMETERS_TABLE: String = "CREATE TABLE IF NOT EXISTS %s (" +
    "METHOD_NAME VARCHAR, " +
    "METHOD_TYPE VARCHAR, " +
    "PARAMETERS VARCHAR " +
    "CONSTRAINT pk PRIMARY KEY (METHOD_NAME)) " +
    "DATA_BLOCK_ENCODING='FAST_DIFF', IMMUTABLE_ROWS=true, COMPRESSION='SNAPPY'"

  val CREATE_PIT_ANOMALY_METRICS_TABLE_SQL: String = "CREATE TABLE IF NOT EXISTS %s (" +
    "METRIC_UUID BINARY(20) NOT NULL, " +
    "METHOD_NAME VARCHAR, " +
    "ANOMALY_TIMESTAMP UNSIGNED_LONG NOT NULL, " +
    "METRIC_VALUE DOUBLE, " +
    "SEASONAL_INFO VARCHAR, " +
    "ANOMALY_SCORE DOUBLE, " +
    "MODEL_PARAMETERS VARCHAR, " +
    "DETECTION_TIME UNSIGNED_LONG " +
    "CONSTRAINT pk PRIMARY KEY (METRIC_UUID, METHOD_NAME, ANOMALY_TIMESTAMP)) " +
    "DATA_BLOCK_ENCODING='FAST_DIFF', IMMUTABLE_ROWS=true, TTL=%s, COMPRESSION='SNAPPY'"

  val CREATE_TREND_ANOMALY_METRICS_TABLE_SQL: String = "CREATE TABLE IF NOT EXISTS %s (" +
    "METRIC_UUID BINARY(20) NOT NULL, " +
    "ANOMALY_PERIOD_START UNSIGNED_LONG NOT NULL, " +
    "ANOMALY_PERIOD_END UNSIGNED_LONG NOT NULL, " +
    "TEST_PERIOD_START UNSIGNED_LONG NOT NULL, " +
    "TEST_PERIOD_END UNSIGNED_LONG NOT NULL, " +
    "METHOD_NAME VARCHAR, " +
    "SEASONAL_INFO VARCHAR, " +
    "ANOMALY_SCORE DOUBLE, " +
    "MODEL_PARAMETERS VARCHAR, " +
    "DETECTION_TIME UNSIGNED_LONG " +
    "CONSTRAINT pk PRIMARY KEY (METRIC_UUID, METHOD_NAME, ANOMALY_PERIOD_START, ANOMALY_PERIOD_END, TEST_PERIOD_START, TEST_PERIOD_END)) " +
    "DATA_BLOCK_ENCODING='FAST_DIFF' IMMUTABLE_ROWS=true, TTL=%s, COMPRESSION='SNAPPY'"

  val CREATE_MODEL_SNAPSHOT_TABLE: String = "CREATE TABLE IF NOT EXISTS %s (" +
    "METRIC_UUID BINARY(20), " +
    "METHOD_NAME VARCHAR, " +
    "METHOD_TYPE VARCHAR, " +
    "PARAMETERS VARCHAR " +
    "SNAPSHOT_TIME UNSIGNED LONG NOT NULL " +
    "CONSTRAINT pk PRIMARY KEY (METRIC_UUID, METHOD_NAME)) " +
    "DATA_BLOCK_ENCODING='FAST_DIFF', IMMUTABLE_ROWS=true, COMPRESSION='SNAPPY'"

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /* UPSERT statement constants */
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  val UPSERT_METHOD_PARAMETERS_SQL: String = "UPSERT INTO %s (METHOD_NAME, METHOD_TYPE, PARAMETERS) VALUES (?,?,?)"

  val UPSERT_PIT_ANOMALY_METRICS_SQL: String = "UPSERT INTO %s (METRIC_UUID, ANOMALY_TIMESTAMP, METRIC_VALUE, METHOD_NAME, " +
    "SEASONAL_INFO, ANOMALY_SCORE, MODEL_PARAMETERS, DETECTION_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"

  val UPSERT_TREND_ANOMALY_METRICS_SQL: String = "UPSERT INTO %s (METRIC_UUID, ANOMALY_PERIOD_START, ANOMALY_PERIOD_END, " +
    "TEST_PERIOD_START, TEST_PERIOD_END, METHOD_NAME, ANOMALY_SCORE, MODEL_PARAMETERS, DETECTION_TIME) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"

  val UPSERT_MODEL_SNAPSHOT_SQL: String = "UPSERT INTO %s (METRIC_UUID, METHOD_NAME, METHOD_TYPE, PARAMETERS) VALUES (?, ?, ?, ?)"

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  /* GET statement constants */
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  val GET_METHOD_PARAMETERS_SQL: String = "SELECT METHOD_NAME, METHOD_TYPE, PARAMETERS FROM %s WHERE METHOD_NAME = %s"

  val GET_PIT_ANOMALY_METRIC_SQL: String = "SELECT METRIC_UUID, ANOMALY_TIMESTAMP, METRIC_VALUE, METHOD_NAME, SEASONAL_INFO, " +
    "ANOMALY_SCORE, MODEL_PARAMETERS, DETECTION_TIME FROM %s WHERE ANOMALY_TIMESTAMP > ? AND ANOMALY_TIMESTAMP <= ? " +
    "ORDER BY ANOMALY_SCORE DESC"

  val GET_TREND_ANOMALY_METRIC_SQL: String = "SELECT METRIC_UUID, ANOMALY_PERIOD_START, ANOMALY_PERIOD_END, TEST_PERIOD_START, " +
    "TEST_PERIOD_END, METHOD_NAME, SEASONAL_INFO, ANOMALY_SCORE, MODEL_PARAMETERS, DETECTION_TIME FROM %s WHERE ANOMALY_PERIOD_END > ? " +
    "AND ANOMALY_PERIOD_END <= ? ORDER BY ANOMALY_SCORE DESC"

  val GET_MODEL_SNAPSHOT_SQL: String = "SELECT METRIC_UUID, METHOD_NAME, METHOD_TYPE, PARAMETERS FROM %s WHERE UUID = %s AND METHOD_NAME = %s"

}
