content: /*
   * 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.carbondata.core.metadata.schema.indextable;
  
  import java.io.Serializable;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.util.List;
  import java.util.Map;
  
  import org.apache.carbondata.core.constants.CarbonCommonConstants;
  import org.apache.carbondata.core.index.status.IndexStatus;
  
  import com.google.gson.Gson;
  
  public class IndexTableInfo implements Serializable {
  
    private static final long serialVersionUID = 1106104914918491724L;
  
    private String databaseName;
    private String tableName;
    private List<String> indexCols;
    private Map<String, String> indexProperties;
  
    public IndexTableInfo(String databaseName, String tableName,
        Map<String, String> indexProperties) {
      this.databaseName = databaseName;
      this.tableName = tableName;
      this.indexProperties = indexProperties;
      this.indexCols =
          Arrays.asList(indexProperties.get(CarbonCommonConstants.INDEX_COLUMNS).split(","));
    }
  
    /**
     * returns db name
     *
     * @return
     */
    public String getDatabaseName() {
      return databaseName;
    }
  
    /**
     * returns table name
     *
     * @return
     */
    public String getTableName() {
      return tableName;
    }
  
    /**
     * returns all the index columns
     *
     * @return
     */
    public List<String> getIndexCols() {
      return indexCols;
    }
  
    public void setIndexCols(List<String> indexCols) {
      this.indexCols = indexCols;
    }
  
    /**
     * compares both the objects
     *
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
      if (obj == null) {
        return false;
  
      }
      if (!(obj instanceof IndexTableInfo)) {
        return false;
      }
      IndexTableInfo other = (IndexTableInfo) obj;
      if (indexCols == null) {
        if (other.indexCols != null) {
          return false;
        }
      } else if (!indexCols.equals(other.indexCols)) {
        return false;
      }
      return true;
    }
  
    /**
     * convert string to index table info object
     *
     * @param gsonData
     * @return
     */
    public static IndexTableInfo[] fromGson(String gsonData) {
      Gson gson = new Gson();
      return gson.fromJson(gsonData, IndexTableInfo[].class);
    }
  
    /**
     * converts index table info object to string
     *
     * @param gsonData
     * @return
     */
    public static String toGson(IndexTableInfo[] gsonData) {
      Gson gson = new Gson();
      return gson.toJson(gsonData);
    }
  
    @Override
    public int hashCode() {
      int hashCode = 0;
      for (String s : indexCols) {
        hashCode += s.hashCode();
      }
      return hashCode;
    }
  
    public static String updateIndexColumns(String oldGsonData, String columnToBeUpdated,
        String newColumnName) {
      IndexTableInfo[] indexTableInfos = fromGson(oldGsonData);
      if (null == indexTableInfos) {
        indexTableInfos = new IndexTableInfo[0];
      }
      for (IndexTableInfo indexTableInfo : indexTableInfos) {
        List<String> newColumnList = new ArrayList<>();
        for (String indexColumn : indexTableInfo.getIndexCols()) {
          if (indexColumn.equalsIgnoreCase(columnToBeUpdated)) {
            newColumnList.add(newColumnName);
          } else {
            newColumnList.add(indexColumn);
          }
        }
        indexTableInfo.setIndexCols(newColumnList);
        Map<String, String> indexProperties = indexTableInfo.getIndexProperties();
        indexProperties.put(CarbonCommonConstants.INDEX_COLUMNS, String.join(",", newColumnList));
        indexTableInfo.setIndexProperties(indexProperties);
      }
      return toGson(indexTableInfos);
    }
  
    public static void setIndexStatus(IndexTableInfo[] indexTableInfos, String indexName,
        IndexStatus status) {
      for (IndexTableInfo indexTableInfo : indexTableInfos) {
        if (indexTableInfo.tableName.equalsIgnoreCase(indexName)) {
          indexTableInfo.indexProperties.put(CarbonCommonConstants.INDEX_STATUS, status.name());
        }
      }
    }
  
    public static String setIndexStatus(String oldIndexInfo, String indexName, IndexStatus status) {
      IndexTableInfo[] indexTableInfos = fromGson(oldIndexInfo);
      setIndexStatus(indexTableInfos, indexName, status);
      return toGson(indexTableInfos);
    }
  
    public Map<String, String> getIndexProperties() {
      return indexProperties;
    }
  
    public void setIndexProperties(Map<String, String> indexProperties) {
      this.indexProperties = indexProperties;
    }
  }
  