001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.reef.io.data.loading.impl;
020
021import org.apache.commons.lang.builder.EqualsBuilder;
022import org.apache.commons.lang3.builder.HashCodeBuilder;
023import org.apache.reef.annotations.Unstable;
024
025/**
026 * POJO that represents a distributed data set partition. Basically, it contains the path where
027 * the data files are located for this partition, and the location where we want
028 * this data to be loaded into.
029 *
030 */
031@Unstable
032public final class DistributedDataSetPartition {
033
034  /**
035   * The path of the distributed data set partition. If we use HDFS, it will be the
036   * hdfs path.
037   */
038  private final String path;
039
040  /**
041   * The location (either a rackName or a nodeName) where we want the data in
042   * this distributed partition to be loaded into. It can contain a wildcard at
043   * the end, for example /datacenter1/*.
044   */
045  private final String location;
046
047  /**
048   * Number of desired splits for this partition.
049   */
050  private final int desiredSplits;
051
052  DistributedDataSetPartition(final String path, final String location, final int desiredSplits) {
053    this.path = path;
054    this.location = location;
055    this.desiredSplits = desiredSplits;
056  }
057
058  /**
059   * Returns the path to the distributed data partition.
060   *
061   * @return the path of the distributed data partition
062   */
063  String getPath() {
064    return path;
065  }
066
067  /**
068   * Returns the location where we want the data in this partition to be loaded
069   * into.
070   *
071   * @return the location where to load this data into.
072   */
073  String getLocation() {
074    return location;
075  }
076
077  /**
078   * Returns the number of desired splits for this data partition.
079   *
080   * @return the number of desired splits
081   */
082  int getDesiredSplits() {
083    return desiredSplits;
084  }
085
086  /**
087   * @return a new DistributedDataSetPartition Builder.
088   */
089  public static Builder newBuilder() {
090    return new Builder();
091  }
092
093  @Override
094  public boolean equals(final Object obj) {
095    if (obj == this) {
096      return true;
097    }
098    if (!(obj instanceof DistributedDataSetPartition)) {
099      return false;
100    }
101    final DistributedDataSetPartition that = (DistributedDataSetPartition) obj;
102    return new EqualsBuilder().append(this.path, that.path).append(this.location, that.location)
103        .append(this.desiredSplits, that.desiredSplits).isEquals();
104  }
105
106  @Override
107  public int hashCode() {
108    return new HashCodeBuilder(17, 37).append(this.path).append(this.location).append(this.desiredSplits).toHashCode();
109  }
110
111  @Override
112  public String toString() {
113    return "{" + this.path + "," + this.location + "," + this.desiredSplits + "}";
114  }
115
116  /**
117   * {@link DistributedDataSetPartition}s are build using this Builder.
118   */
119  public static final class Builder implements org.apache.reef.util.Builder<DistributedDataSetPartition> {
120
121    private String path;
122    private String location;
123    private int desiredSplits;
124
125    private Builder() {
126    }
127
128    /**
129     * Sets the path of the distributed data set partition.
130     *
131     * @param path
132     *          the path to set
133     * @return this
134     */
135    public Builder setPath(final String path) {
136      this.path = path;
137      return this;
138    }
139
140
141    /**
142     * Sets the location where we want the data in this partition to be loaded
143     * into.
144     *
145     * @param location
146     *          the location to set
147     * @return this
148     */
149    public Builder setLocation(final String location) {
150      this.location = location;
151      return this;
152    }
153
154    /**
155     * Sets the desired number of splits for this partition.
156     * @param desiredSplits
157     *          the number of desired splits
158     * @return this
159     */
160    public Builder setDesiredSplits(final int desiredSplits) {
161      this.desiredSplits = desiredSplits;
162      return this;
163    }
164
165    /**
166     * Builds the {@link DistributedDataSetPartition}.
167     */
168    @Override
169    public DistributedDataSetPartition build() {
170      return new DistributedDataSetPartition(this.path, this.location, this.desiredSplits);
171    }
172  }
173}