class Table<T> extends QueryBody {

    private final QualifiedName name;
    private final boolean excludePartitions;
    private final List<Assignment<T>> partitionProperties;

    public Table(QualifiedName name) {
        this(name, true);
    }

    public Table(QualifiedName name, boolean excludePartitions) {
        this.name = name;
        this.excludePartitions = excludePartitions;
        this.partitionProperties = List.of();
    }

    public Table(QualifiedName name, List<Assignment<T>> partitionProperties) {
        this.name = name;
        this.excludePartitions = false;
        this.partitionProperties = partitionProperties;
    }

    public QualifiedName getName() {
        return name;
    }

    public boolean excludePartitions() {
        return excludePartitions;
    }

    public List<Assignment<T>> partitionProperties() {
        return partitionProperties;
    }

    public <U> Table<U> map(Function<? super T, ? extends U> mapper) {
        if (partitionProperties.isEmpty()) {
            return new Table<>(name, excludePartitions);
        } else {
            return new Table<>(name, Lists.map(partitionProperties, x -> x.map(mapper)));
        }
    }

    @Override
    public <R, C> R accept(AstVisitor<R, C> visitor, C context) {
        return visitor.visitTable(this, context);
    }

    @Override
    public boolean equals(Object o) {<FILL_FUNCTION_BODY>}

    @Override
    public int hashCode() {
        return Objects.hash(name, partitionProperties);
    }

    @Override
    public String toString() {
        return "Table{" +
               "only=" + excludePartitions +
               ", " + name +
               ", partitionProperties=" + partitionProperties +
               '}';
    }
}

        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Table<?> table = (Table<?>) o;
        return Objects.equals(name, table.name) &&
               Objects.equals(partitionProperties, table.partitionProperties);
    
<methods>public non-sealed void <init>() ,public R accept(AstVisitor<R,C>, C) ,public abstract boolean equals(java.lang.Object) ,public abstract int hashCode() ,public abstract java.lang.String toString() <variables>