class StatementType {

  enum Type {
    INSERT(1), DELETE(2), READ(3), UPDATE(4), SCAN(5);

    private final int internalType;

    Type(int type) {
      internalType = type;
    }

    int getHashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + internalType;
      return result;
    }
  }

  private Type type;
  private String tableName;
  private Set<String> fields;

  public StatementType(Type type, String tableName, Set<String> fields) {
    this.type = type;
    this.tableName = tableName;
    this.fields = fields;
  }

  public String getTableName() {
    return tableName;
  }

  public Set<String> getFields() {
    return fields;
  }

  @Override
  public int hashCode() {<FILL_FUNCTION_BODY>}

  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      return true;
    }
    if (obj == null) {
      return false;
    }

    if (getClass() != obj.getClass()) {
      return false;
    }

    StatementType other = (StatementType) obj;
    if (type != other.type) {
      return false;
    }

    if (tableName == null) {
      if (other.tableName != null) {
        return false;
      }
    } else if (!tableName.equals(other.tableName)) {
      return false;
    }

    if (fields == null) {
      if (other.fields != null) {
        return false;
      }
    }else if (!fields.equals(other.fields)) {
      return false;
    }
    return true;
  }
}

    final int prime = 31;
    int result = 1;
    result = prime * result + ((type == null) ? 0 : type.getHashCode());
    result = prime * result + ((tableName == null) ? 0 : tableName.hashCode());
    result = prime * result + ((fields == null) ? 0 : fields.hashCode());
    return result;
  
<no_super_class>