/*
 * 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.geode.cache.query;

/**
 * @deprecated As of 6.6.1. Check {@link QueryService} for changes.
 *
 *             Enumerated type for types of {@linkplain Index indexes}
 *
 * @since GemFire 4.0
 */
public enum IndexType {
  /**
   * The index type of a functional index. A functional index is used for the comparison of some
   * function of a region value with a constant, using a relational operator. The indexedExpression
   * yields a value that is a Comparable. The "constant" that it is to be compared to is any
   * expression that is not dependent on a value in the region. A simple example is an index on the
   * indexedExpression "age". This would be used for a query that has the where clause "age < 55".
   * <p>
   * The indexedExpression for a functional index can be any Comparable or any of the following
   * primitive types:<br>
   * <code>long int short byte char float double</code>
   *
   * @see QueryService#createIndex(String, IndexType, String, String)
   */
  FUNCTIONAL("RANGE"),

  /**
   * The index type of a hash index. A hash index is used for the comparison of some function of a
   * region value with a constant, using a relational operator. The indexedExpression yields a value
   * that is a Comparable. The "constant" that it is to be compared to is any expression that is not
   * dependent on a value in the region. A simple example is an index on the indexedExpression
   * "age". This would be used for a query that has the where clause "age = 55".
   * <p>
   * The indexedExpression for a hash index can be any Comparable or any of the following primitive
   * types:<br>
   * <code>long int short byte char float double</code>
   *
   * @see QueryService#createIndex(String, IndexType, String, String)
   * @deprecated Due to the overhead caused by rehashing while expanding the backing array, hash
   *             index has been deprecated since Apache Geode 1.4.0. Use
   *             {@link IndexType#FUNCTIONAL} instead.
   */
  @Deprecated
  HASH("HASH"),


  /**
   * The index type of a primary key index. A primary key index uses the keys in the region itself.
   * By creating a primary key index, you make the query service aware of the relationship between
   * the values in the region and the keys in the region and enable the relationship to be used to
   * optimize the execution of queries. For example, if the values in a region are employee objects
   * and the keys in the region is the attribute empId on those employees, then you can create a
   * primary key index on that region with the indexedExpression "empId".
   * <p>
   * The type of the indexedExpression for a primary key index can be any object type. Just as in a
   * Region, the lookup is based on the implementation of the <code>equals</code> and
   * <code>hashCode</code> methods in the object.
   *
   * @see QueryService#createIndex(String, IndexType, String, String)
   */
  PRIMARY_KEY("KEY");

  private String name;

  IndexType(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public static IndexType valueOfSynonym(String name) {
    name = name.toUpperCase();

    switch (name) {
      case "KEY":
        return valueOf("PRIMARY_KEY");
      case "RANGE":
        return valueOf("FUNCTIONAL");
    }

    return valueOf(name);
  }
}
