/**
 *
 * 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.
 */
/**
 * Autogenerated by Thrift Compiler (0.9.3)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.sharing.registry.models;


import java.util.Map;
import java.util.HashMap;
import org.apache.thrift.TEnum;

/**
 * <p>This list of fields that can be used to search entities</p>
 * <li>NAME : Name of the entity</li>
 * <li>DESCRIPTION : Description of the entity</li>
 * <li>FULL_TEXT : Full text field of the entity</li>
 * <li>PARENT_ENTITY_ID : Parent entity id of the entity</li>
 * <li>OWNER_ID : Owner of the entity</li>
 * <li>CREATED_TIME : Created time of the entity</li>
 * <li>UPDATED_TIME : Updated time of the entity</li>
 * <li>SHARED_COUNT : Number of directly shared users and groups</li>
 * 
 */
public enum EntitySearchField implements org.apache.thrift.TEnum {
  NAME(0),
  DESCRIPTION(1),
  FULL_TEXT(2),
  PARRENT_ENTITY_ID(3),
  OWNER_ID(4),
  PERMISSION_TYPE_ID(5),
  CREATED_TIME(6),
  UPDATED_TIME(7),
  ENTITY_TYPE_ID(8),
  SHARED_COUNT(9);

  private final int value;

  private EntitySearchField(int value) {
    this.value = value;
  }

  /**
   * Get the integer value of this enum value, as defined in the Thrift IDL.
   */
  public int getValue() {
    return value;
  }

  /**
   * Find a the enum type by its integer value, as defined in the Thrift IDL.
   * @return null if the value is not found.
   */
  public static EntitySearchField findByValue(int value) { 
    switch (value) {
      case 0:
        return NAME;
      case 1:
        return DESCRIPTION;
      case 2:
        return FULL_TEXT;
      case 3:
        return PARRENT_ENTITY_ID;
      case 4:
        return OWNER_ID;
      case 5:
        return PERMISSION_TYPE_ID;
      case 6:
        return CREATED_TIME;
      case 7:
        return UPDATED_TIME;
      case 8:
        return ENTITY_TYPE_ID;
      case 9:
        return SHARED_COUNT;
      default:
        return null;
    }
  }
}
