package sizzle.io; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.Arrays; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.Writable; /** * A {@link Writable} that contains a datum and an optional metadatum to be * emitted to a Sizzle table. * * @author anthonyu * */ public class EmitValue implements Writable { private String[] data; private String metadata; /** * Construct an EmitValue. */ public EmitValue() { // default constructor for Writable } /** * Construct an EmitValue. * * @param data * An array of {@link String} containing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final String[] data, final String metadata) { this.data = data; this.metadata = metadata; } /** * Construct an EmitValue. * * @param data * An array of {@link String} containing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final Object[] data, final String metadata) { final String[] strings = new String[data.length]; for (int i = 0; i < data.length; i++) strings[i] = data[i].toString(); this.data = strings; this.metadata = metadata; } /** * Construct an EmitValue. * * @param data * An array of {@link String} containing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final Object[] data) { this(data, null); } /** * Construct an EmitValue. * * @param data * A {@link String} containing the data to be emitted */ public EmitValue(final String data) { this(data, null); } /** * Construct an EmitValue. * * @param data * A {@link String} containing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final String data, final String metadata) { this(new String[] { data }, metadata); } /** * Construct an EmitValue. * * @param data * A {@link String} containing the data to be emitted * @param metadata * A long representing the metadata to be emitted */ public EmitValue(final String data, final long metadata) { this(data, Long.toString(metadata)); } /** * Construct an EmitValue. * * @param data * A {@link String} containing the data to be emitted * @param metadata * A double representing the metadata to be emitted */ public EmitValue(final String data, final double metadata) { this(data, Double.toString(metadata)); } /** * Construct an EmitValue. * * @param data * A long representing the data to be emitted */ public EmitValue(final long data) { this(data, null); } /** * Construct an EmitValue. * * @param data * A long representing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final long data, final String metadata) { this(Long.toString(data), metadata); } /** * Construct an EmitValue. * * @param data * A long representing the data to be emitted * @param metadata * A long representing the metadata to be emitted */ public EmitValue(final long data, final long metadata) { this(data, Long.toString(metadata)); } /** * Construct an EmitValue. * * @param data * A long representing the data to be emitted * @param metadata * A double representing the metadata to be emitted */ public EmitValue(final long data, final double metadata) { this(data, Double.toString(metadata)); } /** * Construct an EmitValue. * * @param data * A double representing the data to be emitted */ public EmitValue(final double data) { this(data, null); } /** * Construct an EmitValue. * * @param data * A double representing the data to be emitted * @param metadata * A {@link String} containing the metadata to be emitted */ public EmitValue(final double data, final String metadata) { this(Double.toString(data), metadata); } /** * Construct an EmitValue. * * @param data * A double representing the data to be emitted * @param metadata * A long representing the metadata to be emitted */ public EmitValue(final double data, final long metadata) { this(data, Long.toString(metadata)); } /** * Construct an EmitValue. * * @param data * A double representing the data to be emitted * @param metadata * A double representing the metadata to be emitted */ public EmitValue(final double data, final double metadata) { this(data, Double.toString(metadata)); } /** {@inheritDoc} */ @Override public void readFields(final DataInput in) throws IOException { final int count = in.readInt(); this.data = new String[count]; for (int i = 0; i < count; i++) this.data[i] = Text.readString(in); final String metadata = Text.readString(in); if (metadata.equals("")) this.metadata = null; else this.metadata = metadata; } /** {@inheritDoc} */ @Override public void write(final DataOutput out) throws IOException { out.writeInt(this.data.length); for (final String d : this.data) Text.writeString(out, d); if (this.metadata == null) Text.writeString(out, ""); else Text.writeString(out, this.metadata); } /** * @return the data */ public String[] getData() { return this.data; } /** * @param data * the data to set */ public void setData(final String[] data) { this.data = data; } /** * @return the metadata */ public String getMetadata() { return this.metadata; } /** * @param metadata * the metadatum to set */ public void setMetadata(final String metadata) { this.metadata = metadata; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(this.data); result = prime * result + (this.metadata == null ? 0 : this.metadata.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) return true; if (obj == null) return false; if (this.getClass() != obj.getClass()) return false; final EmitValue other = (EmitValue) obj; if (!Arrays.equals(this.data, other.data)) return false; if (this.metadata == null) { if (other.metadata != null) return false; } else if (!this.metadata.equals(other.metadata)) return false; return true; } /** {@inheritDoc} */ @Override public String toString() { return Arrays.toString(this.data) + ":" + this.metadata; } }