content: /*
   * Copyright (C) 2016-2023 ActionTech.
   * License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher.
   */
  
  package com.actiontech.dble.config.model.sharding.table;
  
  import org.jetbrains.annotations.NotNull;
  
  import java.util.Comparator;
  
  public class ERTable implements Comparable<ERTable> {
      private final String table;
      private final String column;
      private final String schema;
      private int hashCode = 0;
  
      public ERTable(String schema, String table, String column) {
          if (schema == null)
              throw new IllegalArgumentException("ERTable's schema can't be null");
          this.schema = schema;
          if (table == null)
              throw new IllegalArgumentException("ERTable's tableName can't be null");
          this.table = table;
          if (column == null)
              throw new IllegalArgumentException("ERTable's column can't be null");
          this.column = column;
      }
  
      public String getTable() {
          return table;
      }
  
      public String getColumn() {
          return column;
      }
  
      public String getSchema() {
          return schema;
      }
  
      @Override
      public int hashCode() {
          if (hashCode == 0) {
              final int constant = 37;
              int hash = 17;
              hash += constant * schema.hashCode();
              hash += constant * table.hashCode();
              hash += constant * column.toLowerCase().hashCode();
              hashCode = hash;
          }
          return hashCode;
      }
  
  
      public ERTable changeToLowerCase() {
          return new ERTable(schema.toLowerCase(), table.toLowerCase(), column);
      }
  
      @Override
      public boolean equals(Object obj) {
          if (this == obj)
              return true;
          if (obj instanceof ERTable) {
              ERTable erTable = (ERTable) obj;
              return this.schema.equals(erTable.getSchema()) &&
                      this.table.equals(erTable.getTable()) &&
                      this.column.equalsIgnoreCase(erTable.getColumn());
          }
          return false;
      }
  
      @Override
      public int compareTo(@NotNull ERTable o) {
          return Comparator.comparing(ERTable::getSchema)
                  .thenComparing(ERTable::getTable)
                  .compare(this, o);
      }
  }
  