/**
 * Autogenerated by Thrift Compiler (0.9.2)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package backtype.storm.generated;

import org.apache.thrift.scheme.IScheme;
import org.apache.thrift.scheme.SchemeFactory;
import org.apache.thrift.scheme.StandardScheme;

import org.apache.thrift.scheme.TupleScheme;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.EncodingUtils;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.apache.thrift.server.AbstractNonblockingServer.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import javax.annotation.Generated;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2015-10-20")
public class MetricSnapshot implements org.apache.thrift.TBase<MetricSnapshot, MetricSnapshot._Fields>, java.io.Serializable, Cloneable, Comparable<MetricSnapshot> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("MetricSnapshot");

  private static final org.apache.thrift.protocol.TField METRIC_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("metricId", org.apache.thrift.protocol.TType.I64, (short)1);
  private static final org.apache.thrift.protocol.TField TS_FIELD_DESC = new org.apache.thrift.protocol.TField("ts", org.apache.thrift.protocol.TType.I64, (short)2);
  private static final org.apache.thrift.protocol.TField METRIC_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("metricType", org.apache.thrift.protocol.TType.I32, (short)3);
  private static final org.apache.thrift.protocol.TField LONG_VALUE_FIELD_DESC = new org.apache.thrift.protocol.TField("longValue", org.apache.thrift.protocol.TType.I64, (short)4);
  private static final org.apache.thrift.protocol.TField DOUBLE_VALUE_FIELD_DESC = new org.apache.thrift.protocol.TField("doubleValue", org.apache.thrift.protocol.TType.DOUBLE, (short)5);
  private static final org.apache.thrift.protocol.TField M1_FIELD_DESC = new org.apache.thrift.protocol.TField("m1", org.apache.thrift.protocol.TType.DOUBLE, (short)6);
  private static final org.apache.thrift.protocol.TField M5_FIELD_DESC = new org.apache.thrift.protocol.TField("m5", org.apache.thrift.protocol.TType.DOUBLE, (short)7);
  private static final org.apache.thrift.protocol.TField M15_FIELD_DESC = new org.apache.thrift.protocol.TField("m15", org.apache.thrift.protocol.TType.DOUBLE, (short)8);
  private static final org.apache.thrift.protocol.TField MEAN_FIELD_DESC = new org.apache.thrift.protocol.TField("mean", org.apache.thrift.protocol.TType.DOUBLE, (short)9);
  private static final org.apache.thrift.protocol.TField MIN_FIELD_DESC = new org.apache.thrift.protocol.TField("min", org.apache.thrift.protocol.TType.I64, (short)10);
  private static final org.apache.thrift.protocol.TField MAX_FIELD_DESC = new org.apache.thrift.protocol.TField("max", org.apache.thrift.protocol.TType.I64, (short)11);
  private static final org.apache.thrift.protocol.TField P50_FIELD_DESC = new org.apache.thrift.protocol.TField("p50", org.apache.thrift.protocol.TType.DOUBLE, (short)12);
  private static final org.apache.thrift.protocol.TField P75_FIELD_DESC = new org.apache.thrift.protocol.TField("p75", org.apache.thrift.protocol.TType.DOUBLE, (short)13);
  private static final org.apache.thrift.protocol.TField P95_FIELD_DESC = new org.apache.thrift.protocol.TField("p95", org.apache.thrift.protocol.TType.DOUBLE, (short)14);
  private static final org.apache.thrift.protocol.TField P98_FIELD_DESC = new org.apache.thrift.protocol.TField("p98", org.apache.thrift.protocol.TType.DOUBLE, (short)15);
  private static final org.apache.thrift.protocol.TField P99_FIELD_DESC = new org.apache.thrift.protocol.TField("p99", org.apache.thrift.protocol.TType.DOUBLE, (short)16);
  private static final org.apache.thrift.protocol.TField P999_FIELD_DESC = new org.apache.thrift.protocol.TField("p999", org.apache.thrift.protocol.TType.DOUBLE, (short)17);
  private static final org.apache.thrift.protocol.TField STDDEV_FIELD_DESC = new org.apache.thrift.protocol.TField("stddev", org.apache.thrift.protocol.TType.DOUBLE, (short)18);
  private static final org.apache.thrift.protocol.TField POINTS_FIELD_DESC = new org.apache.thrift.protocol.TField("points", org.apache.thrift.protocol.TType.LIST, (short)19);

  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
  static {
    schemes.put(StandardScheme.class, new MetricSnapshotStandardSchemeFactory());
    schemes.put(TupleScheme.class, new MetricSnapshotTupleSchemeFactory());
  }

  private long metricId; // required
  private long ts; // required
  private int metricType; // required
  private long longValue; // optional
  private double doubleValue; // optional
  private double m1; // optional
  private double m5; // optional
  private double m15; // optional
  private double mean; // optional
  private long min; // optional
  private long max; // optional
  private double p50; // optional
  private double p75; // optional
  private double p95; // optional
  private double p98; // optional
  private double p99; // optional
  private double p999; // optional
  private double stddev; // optional
  private List<Long> points; // optional

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
    METRIC_ID((short)1, "metricId"),
    TS((short)2, "ts"),
    METRIC_TYPE((short)3, "metricType"),
    LONG_VALUE((short)4, "longValue"),
    DOUBLE_VALUE((short)5, "doubleValue"),
    M1((short)6, "m1"),
    M5((short)7, "m5"),
    M15((short)8, "m15"),
    MEAN((short)9, "mean"),
    MIN((short)10, "min"),
    MAX((short)11, "max"),
    P50((short)12, "p50"),
    P75((short)13, "p75"),
    P95((short)14, "p95"),
    P98((short)15, "p98"),
    P99((short)16, "p99"),
    P999((short)17, "p999"),
    STDDEV((short)18, "stddev"),
    POINTS((short)19, "points");

    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();

    static {
      for (_Fields field : EnumSet.allOf(_Fields.class)) {
        byName.put(field.getFieldName(), field);
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // METRIC_ID
          return METRIC_ID;
        case 2: // TS
          return TS;
        case 3: // METRIC_TYPE
          return METRIC_TYPE;
        case 4: // LONG_VALUE
          return LONG_VALUE;
        case 5: // DOUBLE_VALUE
          return DOUBLE_VALUE;
        case 6: // M1
          return M1;
        case 7: // M5
          return M5;
        case 8: // M15
          return M15;
        case 9: // MEAN
          return MEAN;
        case 10: // MIN
          return MIN;
        case 11: // MAX
          return MAX;
        case 12: // P50
          return P50;
        case 13: // P75
          return P75;
        case 14: // P95
          return P95;
        case 15: // P98
          return P98;
        case 16: // P99
          return P99;
        case 17: // P999
          return P999;
        case 18: // STDDEV
          return STDDEV;
        case 19: // POINTS
          return POINTS;
        default:
          return null;
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, throwing an exception
     * if it is not found.
     */
    public static _Fields findByThriftIdOrThrow(int fieldId) {
      _Fields fields = findByThriftId(fieldId);
      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    public static _Fields findByName(String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final String _fieldName;

    _Fields(short thriftId, String fieldName) {
      _thriftId = thriftId;
      _fieldName = fieldName;
    }

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __METRICID_ISSET_ID = 0;
  private static final int __TS_ISSET_ID = 1;
  private static final int __METRICTYPE_ISSET_ID = 2;
  private static final int __LONGVALUE_ISSET_ID = 3;
  private static final int __DOUBLEVALUE_ISSET_ID = 4;
  private static final int __M1_ISSET_ID = 5;
  private static final int __M5_ISSET_ID = 6;
  private static final int __M15_ISSET_ID = 7;
  private static final int __MEAN_ISSET_ID = 8;
  private static final int __MIN_ISSET_ID = 9;
  private static final int __MAX_ISSET_ID = 10;
  private static final int __P50_ISSET_ID = 11;
  private static final int __P75_ISSET_ID = 12;
  private static final int __P95_ISSET_ID = 13;
  private static final int __P98_ISSET_ID = 14;
  private static final int __P99_ISSET_ID = 15;
  private static final int __P999_ISSET_ID = 16;
  private static final int __STDDEV_ISSET_ID = 17;
  private int __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.LONG_VALUE,_Fields.DOUBLE_VALUE,_Fields.M1,_Fields.M5,_Fields.M15,_Fields.MEAN,_Fields.MIN,_Fields.MAX,_Fields.P50,_Fields.P75,_Fields.P95,_Fields.P98,_Fields.P99,_Fields.P999,_Fields.STDDEV,_Fields.POINTS};
  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.METRIC_ID, new org.apache.thrift.meta_data.FieldMetaData("metricId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.TS, new org.apache.thrift.meta_data.FieldMetaData("ts", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.METRIC_TYPE, new org.apache.thrift.meta_data.FieldMetaData("metricType", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.LONG_VALUE, new org.apache.thrift.meta_data.FieldMetaData("longValue", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.DOUBLE_VALUE, new org.apache.thrift.meta_data.FieldMetaData("doubleValue", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.M1, new org.apache.thrift.meta_data.FieldMetaData("m1", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.M5, new org.apache.thrift.meta_data.FieldMetaData("m5", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.M15, new org.apache.thrift.meta_data.FieldMetaData("m15", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.MEAN, new org.apache.thrift.meta_data.FieldMetaData("mean", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.MIN, new org.apache.thrift.meta_data.FieldMetaData("min", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.MAX, new org.apache.thrift.meta_data.FieldMetaData("max", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.P50, new org.apache.thrift.meta_data.FieldMetaData("p50", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.P75, new org.apache.thrift.meta_data.FieldMetaData("p75", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.P95, new org.apache.thrift.meta_data.FieldMetaData("p95", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.P98, new org.apache.thrift.meta_data.FieldMetaData("p98", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.P99, new org.apache.thrift.meta_data.FieldMetaData("p99", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.P999, new org.apache.thrift.meta_data.FieldMetaData("p999", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.STDDEV, new org.apache.thrift.meta_data.FieldMetaData("stddev", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.DOUBLE)));
    tmpMap.put(_Fields.POINTS, new org.apache.thrift.meta_data.FieldMetaData("points", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64))));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(MetricSnapshot.class, metaDataMap);
  }

  public MetricSnapshot() {
  }

  public MetricSnapshot(
    long metricId,
    long ts,
    int metricType)
  {
    this();
    this.metricId = metricId;
    set_metricId_isSet(true);
    this.ts = ts;
    set_ts_isSet(true);
    this.metricType = metricType;
    set_metricType_isSet(true);
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public MetricSnapshot(MetricSnapshot other) {
    __isset_bitfield = other.__isset_bitfield;
    this.metricId = other.metricId;
    this.ts = other.ts;
    this.metricType = other.metricType;
    this.longValue = other.longValue;
    this.doubleValue = other.doubleValue;
    this.m1 = other.m1;
    this.m5 = other.m5;
    this.m15 = other.m15;
    this.mean = other.mean;
    this.min = other.min;
    this.max = other.max;
    this.p50 = other.p50;
    this.p75 = other.p75;
    this.p95 = other.p95;
    this.p98 = other.p98;
    this.p99 = other.p99;
    this.p999 = other.p999;
    this.stddev = other.stddev;
    if (other.is_set_points()) {
      List<Long> __this__points = new ArrayList<Long>(other.points);
      this.points = __this__points;
    }
  }

  public MetricSnapshot deepCopy() {
    return new MetricSnapshot(this);
  }

  @Override
  public void clear() {
    set_metricId_isSet(false);
    this.metricId = 0;
    set_ts_isSet(false);
    this.ts = 0;
    set_metricType_isSet(false);
    this.metricType = 0;
    set_longValue_isSet(false);
    this.longValue = 0;
    set_doubleValue_isSet(false);
    this.doubleValue = 0.0;
    set_m1_isSet(false);
    this.m1 = 0.0;
    set_m5_isSet(false);
    this.m5 = 0.0;
    set_m15_isSet(false);
    this.m15 = 0.0;
    set_mean_isSet(false);
    this.mean = 0.0;
    set_min_isSet(false);
    this.min = 0;
    set_max_isSet(false);
    this.max = 0;
    set_p50_isSet(false);
    this.p50 = 0.0;
    set_p75_isSet(false);
    this.p75 = 0.0;
    set_p95_isSet(false);
    this.p95 = 0.0;
    set_p98_isSet(false);
    this.p98 = 0.0;
    set_p99_isSet(false);
    this.p99 = 0.0;
    set_p999_isSet(false);
    this.p999 = 0.0;
    set_stddev_isSet(false);
    this.stddev = 0.0;
    this.points = null;
  }

  public long get_metricId() {
    return this.metricId;
  }

  public void set_metricId(long metricId) {
    this.metricId = metricId;
    set_metricId_isSet(true);
  }

  public void unset_metricId() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __METRICID_ISSET_ID);
  }

  /** Returns true if field metricId is set (has been assigned a value) and false otherwise */
  public boolean is_set_metricId() {
    return EncodingUtils.testBit(__isset_bitfield, __METRICID_ISSET_ID);
  }

  public void set_metricId_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __METRICID_ISSET_ID, value);
  }

  public long get_ts() {
    return this.ts;
  }

  public void set_ts(long ts) {
    this.ts = ts;
    set_ts_isSet(true);
  }

  public void unset_ts() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __TS_ISSET_ID);
  }

  /** Returns true if field ts is set (has been assigned a value) and false otherwise */
  public boolean is_set_ts() {
    return EncodingUtils.testBit(__isset_bitfield, __TS_ISSET_ID);
  }

  public void set_ts_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __TS_ISSET_ID, value);
  }

  public int get_metricType() {
    return this.metricType;
  }

  public void set_metricType(int metricType) {
    this.metricType = metricType;
    set_metricType_isSet(true);
  }

  public void unset_metricType() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __METRICTYPE_ISSET_ID);
  }

  /** Returns true if field metricType is set (has been assigned a value) and false otherwise */
  public boolean is_set_metricType() {
    return EncodingUtils.testBit(__isset_bitfield, __METRICTYPE_ISSET_ID);
  }

  public void set_metricType_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __METRICTYPE_ISSET_ID, value);
  }

  public long get_longValue() {
    return this.longValue;
  }

  public void set_longValue(long longValue) {
    this.longValue = longValue;
    set_longValue_isSet(true);
  }

  public void unset_longValue() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __LONGVALUE_ISSET_ID);
  }

  /** Returns true if field longValue is set (has been assigned a value) and false otherwise */
  public boolean is_set_longValue() {
    return EncodingUtils.testBit(__isset_bitfield, __LONGVALUE_ISSET_ID);
  }

  public void set_longValue_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __LONGVALUE_ISSET_ID, value);
  }

  public double get_doubleValue() {
    return this.doubleValue;
  }

  public void set_doubleValue(double doubleValue) {
    this.doubleValue = doubleValue;
    set_doubleValue_isSet(true);
  }

  public void unset_doubleValue() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID);
  }

  /** Returns true if field doubleValue is set (has been assigned a value) and false otherwise */
  public boolean is_set_doubleValue() {
    return EncodingUtils.testBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID);
  }

  public void set_doubleValue_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __DOUBLEVALUE_ISSET_ID, value);
  }

  public double get_m1() {
    return this.m1;
  }

  public void set_m1(double m1) {
    this.m1 = m1;
    set_m1_isSet(true);
  }

  public void unset_m1() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __M1_ISSET_ID);
  }

  /** Returns true if field m1 is set (has been assigned a value) and false otherwise */
  public boolean is_set_m1() {
    return EncodingUtils.testBit(__isset_bitfield, __M1_ISSET_ID);
  }

  public void set_m1_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __M1_ISSET_ID, value);
  }

  public double get_m5() {
    return this.m5;
  }

  public void set_m5(double m5) {
    this.m5 = m5;
    set_m5_isSet(true);
  }

  public void unset_m5() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __M5_ISSET_ID);
  }

  /** Returns true if field m5 is set (has been assigned a value) and false otherwise */
  public boolean is_set_m5() {
    return EncodingUtils.testBit(__isset_bitfield, __M5_ISSET_ID);
  }

  public void set_m5_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __M5_ISSET_ID, value);
  }

  public double get_m15() {
    return this.m15;
  }

  public void set_m15(double m15) {
    this.m15 = m15;
    set_m15_isSet(true);
  }

  public void unset_m15() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __M15_ISSET_ID);
  }

  /** Returns true if field m15 is set (has been assigned a value) and false otherwise */
  public boolean is_set_m15() {
    return EncodingUtils.testBit(__isset_bitfield, __M15_ISSET_ID);
  }

  public void set_m15_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __M15_ISSET_ID, value);
  }

  public double get_mean() {
    return this.mean;
  }

  public void set_mean(double mean) {
    this.mean = mean;
    set_mean_isSet(true);
  }

  public void unset_mean() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __MEAN_ISSET_ID);
  }

  /** Returns true if field mean is set (has been assigned a value) and false otherwise */
  public boolean is_set_mean() {
    return EncodingUtils.testBit(__isset_bitfield, __MEAN_ISSET_ID);
  }

  public void set_mean_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __MEAN_ISSET_ID, value);
  }

  public long get_min() {
    return this.min;
  }

  public void set_min(long min) {
    this.min = min;
    set_min_isSet(true);
  }

  public void unset_min() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __MIN_ISSET_ID);
  }

  /** Returns true if field min is set (has been assigned a value) and false otherwise */
  public boolean is_set_min() {
    return EncodingUtils.testBit(__isset_bitfield, __MIN_ISSET_ID);
  }

  public void set_min_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __MIN_ISSET_ID, value);
  }

  public long get_max() {
    return this.max;
  }

  public void set_max(long max) {
    this.max = max;
    set_max_isSet(true);
  }

  public void unset_max() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __MAX_ISSET_ID);
  }

  /** Returns true if field max is set (has been assigned a value) and false otherwise */
  public boolean is_set_max() {
    return EncodingUtils.testBit(__isset_bitfield, __MAX_ISSET_ID);
  }

  public void set_max_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __MAX_ISSET_ID, value);
  }

  public double get_p50() {
    return this.p50;
  }

  public void set_p50(double p50) {
    this.p50 = p50;
    set_p50_isSet(true);
  }

  public void unset_p50() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P50_ISSET_ID);
  }

  /** Returns true if field p50 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p50() {
    return EncodingUtils.testBit(__isset_bitfield, __P50_ISSET_ID);
  }

  public void set_p50_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P50_ISSET_ID, value);
  }

  public double get_p75() {
    return this.p75;
  }

  public void set_p75(double p75) {
    this.p75 = p75;
    set_p75_isSet(true);
  }

  public void unset_p75() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P75_ISSET_ID);
  }

  /** Returns true if field p75 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p75() {
    return EncodingUtils.testBit(__isset_bitfield, __P75_ISSET_ID);
  }

  public void set_p75_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P75_ISSET_ID, value);
  }

  public double get_p95() {
    return this.p95;
  }

  public void set_p95(double p95) {
    this.p95 = p95;
    set_p95_isSet(true);
  }

  public void unset_p95() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P95_ISSET_ID);
  }

  /** Returns true if field p95 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p95() {
    return EncodingUtils.testBit(__isset_bitfield, __P95_ISSET_ID);
  }

  public void set_p95_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P95_ISSET_ID, value);
  }

  public double get_p98() {
    return this.p98;
  }

  public void set_p98(double p98) {
    this.p98 = p98;
    set_p98_isSet(true);
  }

  public void unset_p98() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P98_ISSET_ID);
  }

  /** Returns true if field p98 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p98() {
    return EncodingUtils.testBit(__isset_bitfield, __P98_ISSET_ID);
  }

  public void set_p98_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P98_ISSET_ID, value);
  }

  public double get_p99() {
    return this.p99;
  }

  public void set_p99(double p99) {
    this.p99 = p99;
    set_p99_isSet(true);
  }

  public void unset_p99() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P99_ISSET_ID);
  }

  /** Returns true if field p99 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p99() {
    return EncodingUtils.testBit(__isset_bitfield, __P99_ISSET_ID);
  }

  public void set_p99_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P99_ISSET_ID, value);
  }

  public double get_p999() {
    return this.p999;
  }

  public void set_p999(double p999) {
    this.p999 = p999;
    set_p999_isSet(true);
  }

  public void unset_p999() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __P999_ISSET_ID);
  }

  /** Returns true if field p999 is set (has been assigned a value) and false otherwise */
  public boolean is_set_p999() {
    return EncodingUtils.testBit(__isset_bitfield, __P999_ISSET_ID);
  }

  public void set_p999_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __P999_ISSET_ID, value);
  }

  public double get_stddev() {
    return this.stddev;
  }

  public void set_stddev(double stddev) {
    this.stddev = stddev;
    set_stddev_isSet(true);
  }

  public void unset_stddev() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __STDDEV_ISSET_ID);
  }

  /** Returns true if field stddev is set (has been assigned a value) and false otherwise */
  public boolean is_set_stddev() {
    return EncodingUtils.testBit(__isset_bitfield, __STDDEV_ISSET_ID);
  }

  public void set_stddev_isSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __STDDEV_ISSET_ID, value);
  }

  public int get_points_size() {
    return (this.points == null) ? 0 : this.points.size();
  }

  public java.util.Iterator<Long> get_points_iterator() {
    return (this.points == null) ? null : this.points.iterator();
  }

  public void add_to_points(long elem) {
    if (this.points == null) {
      this.points = new ArrayList<Long>();
    }
    this.points.add(elem);
  }

  public List<Long> get_points() {
    return this.points;
  }

  public void set_points(List<Long> points) {
    this.points = points;
  }

  public void unset_points() {
    this.points = null;
  }

  /** Returns true if field points is set (has been assigned a value) and false otherwise */
  public boolean is_set_points() {
    return this.points != null;
  }

  public void set_points_isSet(boolean value) {
    if (!value) {
      this.points = null;
    }
  }

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case METRIC_ID:
      if (value == null) {
        unset_metricId();
      } else {
        set_metricId((Long)value);
      }
      break;

    case TS:
      if (value == null) {
        unset_ts();
      } else {
        set_ts((Long)value);
      }
      break;

    case METRIC_TYPE:
      if (value == null) {
        unset_metricType();
      } else {
        set_metricType((Integer)value);
      }
      break;

    case LONG_VALUE:
      if (value == null) {
        unset_longValue();
      } else {
        set_longValue((Long)value);
      }
      break;

    case DOUBLE_VALUE:
      if (value == null) {
        unset_doubleValue();
      } else {
        set_doubleValue((Double)value);
      }
      break;

    case M1:
      if (value == null) {
        unset_m1();
      } else {
        set_m1((Double)value);
      }
      break;

    case M5:
      if (value == null) {
        unset_m5();
      } else {
        set_m5((Double)value);
      }
      break;

    case M15:
      if (value == null) {
        unset_m15();
      } else {
        set_m15((Double)value);
      }
      break;

    case MEAN:
      if (value == null) {
        unset_mean();
      } else {
        set_mean((Double)value);
      }
      break;

    case MIN:
      if (value == null) {
        unset_min();
      } else {
        set_min((Long)value);
      }
      break;

    case MAX:
      if (value == null) {
        unset_max();
      } else {
        set_max((Long)value);
      }
      break;

    case P50:
      if (value == null) {
        unset_p50();
      } else {
        set_p50((Double)value);
      }
      break;

    case P75:
      if (value == null) {
        unset_p75();
      } else {
        set_p75((Double)value);
      }
      break;

    case P95:
      if (value == null) {
        unset_p95();
      } else {
        set_p95((Double)value);
      }
      break;

    case P98:
      if (value == null) {
        unset_p98();
      } else {
        set_p98((Double)value);
      }
      break;

    case P99:
      if (value == null) {
        unset_p99();
      } else {
        set_p99((Double)value);
      }
      break;

    case P999:
      if (value == null) {
        unset_p999();
      } else {
        set_p999((Double)value);
      }
      break;

    case STDDEV:
      if (value == null) {
        unset_stddev();
      } else {
        set_stddev((Double)value);
      }
      break;

    case POINTS:
      if (value == null) {
        unset_points();
      } else {
        set_points((List<Long>)value);
      }
      break;

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    case METRIC_ID:
      return Long.valueOf(get_metricId());

    case TS:
      return Long.valueOf(get_ts());

    case METRIC_TYPE:
      return Integer.valueOf(get_metricType());

    case LONG_VALUE:
      return Long.valueOf(get_longValue());

    case DOUBLE_VALUE:
      return Double.valueOf(get_doubleValue());

    case M1:
      return Double.valueOf(get_m1());

    case M5:
      return Double.valueOf(get_m5());

    case M15:
      return Double.valueOf(get_m15());

    case MEAN:
      return Double.valueOf(get_mean());

    case MIN:
      return Long.valueOf(get_min());

    case MAX:
      return Long.valueOf(get_max());

    case P50:
      return Double.valueOf(get_p50());

    case P75:
      return Double.valueOf(get_p75());

    case P95:
      return Double.valueOf(get_p95());

    case P98:
      return Double.valueOf(get_p98());

    case P99:
      return Double.valueOf(get_p99());

    case P999:
      return Double.valueOf(get_p999());

    case STDDEV:
      return Double.valueOf(get_stddev());

    case POINTS:
      return get_points();

    }
    throw new IllegalStateException();
  }

  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
  public boolean isSet(_Fields field) {
    if (field == null) {
      throw new IllegalArgumentException();
    }

    switch (field) {
    case METRIC_ID:
      return is_set_metricId();
    case TS:
      return is_set_ts();
    case METRIC_TYPE:
      return is_set_metricType();
    case LONG_VALUE:
      return is_set_longValue();
    case DOUBLE_VALUE:
      return is_set_doubleValue();
    case M1:
      return is_set_m1();
    case M5:
      return is_set_m5();
    case M15:
      return is_set_m15();
    case MEAN:
      return is_set_mean();
    case MIN:
      return is_set_min();
    case MAX:
      return is_set_max();
    case P50:
      return is_set_p50();
    case P75:
      return is_set_p75();
    case P95:
      return is_set_p95();
    case P98:
      return is_set_p98();
    case P99:
      return is_set_p99();
    case P999:
      return is_set_p999();
    case STDDEV:
      return is_set_stddev();
    case POINTS:
      return is_set_points();
    }
    throw new IllegalStateException();
  }

  @Override
  public boolean equals(Object that) {
    if (that == null)
      return false;
    if (that instanceof MetricSnapshot)
      return this.equals((MetricSnapshot)that);
    return false;
  }

  public boolean equals(MetricSnapshot that) {
    if (that == null)
      return false;

    boolean this_present_metricId = true;
    boolean that_present_metricId = true;
    if (this_present_metricId || that_present_metricId) {
      if (!(this_present_metricId && that_present_metricId))
        return false;
      if (this.metricId != that.metricId)
        return false;
    }

    boolean this_present_ts = true;
    boolean that_present_ts = true;
    if (this_present_ts || that_present_ts) {
      if (!(this_present_ts && that_present_ts))
        return false;
      if (this.ts != that.ts)
        return false;
    }

    boolean this_present_metricType = true;
    boolean that_present_metricType = true;
    if (this_present_metricType || that_present_metricType) {
      if (!(this_present_metricType && that_present_metricType))
        return false;
      if (this.metricType != that.metricType)
        return false;
    }

    boolean this_present_longValue = true && this.is_set_longValue();
    boolean that_present_longValue = true && that.is_set_longValue();
    if (this_present_longValue || that_present_longValue) {
      if (!(this_present_longValue && that_present_longValue))
        return false;
      if (this.longValue != that.longValue)
        return false;
    }

    boolean this_present_doubleValue = true && this.is_set_doubleValue();
    boolean that_present_doubleValue = true && that.is_set_doubleValue();
    if (this_present_doubleValue || that_present_doubleValue) {
      if (!(this_present_doubleValue && that_present_doubleValue))
        return false;
      if (this.doubleValue != that.doubleValue)
        return false;
    }

    boolean this_present_m1 = true && this.is_set_m1();
    boolean that_present_m1 = true && that.is_set_m1();
    if (this_present_m1 || that_present_m1) {
      if (!(this_present_m1 && that_present_m1))
        return false;
      if (this.m1 != that.m1)
        return false;
    }

    boolean this_present_m5 = true && this.is_set_m5();
    boolean that_present_m5 = true && that.is_set_m5();
    if (this_present_m5 || that_present_m5) {
      if (!(this_present_m5 && that_present_m5))
        return false;
      if (this.m5 != that.m5)
        return false;
    }

    boolean this_present_m15 = true && this.is_set_m15();
    boolean that_present_m15 = true && that.is_set_m15();
    if (this_present_m15 || that_present_m15) {
      if (!(this_present_m15 && that_present_m15))
        return false;
      if (this.m15 != that.m15)
        return false;
    }

    boolean this_present_mean = true && this.is_set_mean();
    boolean that_present_mean = true && that.is_set_mean();
    if (this_present_mean || that_present_mean) {
      if (!(this_present_mean && that_present_mean))
        return false;
      if (this.mean != that.mean)
        return false;
    }

    boolean this_present_min = true && this.is_set_min();
    boolean that_present_min = true && that.is_set_min();
    if (this_present_min || that_present_min) {
      if (!(this_present_min && that_present_min))
        return false;
      if (this.min != that.min)
        return false;
    }

    boolean this_present_max = true && this.is_set_max();
    boolean that_present_max = true && that.is_set_max();
    if (this_present_max || that_present_max) {
      if (!(this_present_max && that_present_max))
        return false;
      if (this.max != that.max)
        return false;
    }

    boolean this_present_p50 = true && this.is_set_p50();
    boolean that_present_p50 = true && that.is_set_p50();
    if (this_present_p50 || that_present_p50) {
      if (!(this_present_p50 && that_present_p50))
        return false;
      if (this.p50 != that.p50)
        return false;
    }

    boolean this_present_p75 = true && this.is_set_p75();
    boolean that_present_p75 = true && that.is_set_p75();
    if (this_present_p75 || that_present_p75) {
      if (!(this_present_p75 && that_present_p75))
        return false;
      if (this.p75 != that.p75)
        return false;
    }

    boolean this_present_p95 = true && this.is_set_p95();
    boolean that_present_p95 = true && that.is_set_p95();
    if (this_present_p95 || that_present_p95) {
      if (!(this_present_p95 && that_present_p95))
        return false;
      if (this.p95 != that.p95)
        return false;
    }

    boolean this_present_p98 = true && this.is_set_p98();
    boolean that_present_p98 = true && that.is_set_p98();
    if (this_present_p98 || that_present_p98) {
      if (!(this_present_p98 && that_present_p98))
        return false;
      if (this.p98 != that.p98)
        return false;
    }

    boolean this_present_p99 = true && this.is_set_p99();
    boolean that_present_p99 = true && that.is_set_p99();
    if (this_present_p99 || that_present_p99) {
      if (!(this_present_p99 && that_present_p99))
        return false;
      if (this.p99 != that.p99)
        return false;
    }

    boolean this_present_p999 = true && this.is_set_p999();
    boolean that_present_p999 = true && that.is_set_p999();
    if (this_present_p999 || that_present_p999) {
      if (!(this_present_p999 && that_present_p999))
        return false;
      if (this.p999 != that.p999)
        return false;
    }

    boolean this_present_stddev = true && this.is_set_stddev();
    boolean that_present_stddev = true && that.is_set_stddev();
    if (this_present_stddev || that_present_stddev) {
      if (!(this_present_stddev && that_present_stddev))
        return false;
      if (this.stddev != that.stddev)
        return false;
    }

    boolean this_present_points = true && this.is_set_points();
    boolean that_present_points = true && that.is_set_points();
    if (this_present_points || that_present_points) {
      if (!(this_present_points && that_present_points))
        return false;
      if (!this.points.equals(that.points))
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    List<Object> list = new ArrayList<Object>();

    boolean present_metricId = true;
    list.add(present_metricId);
    if (present_metricId)
      list.add(metricId);

    boolean present_ts = true;
    list.add(present_ts);
    if (present_ts)
      list.add(ts);

    boolean present_metricType = true;
    list.add(present_metricType);
    if (present_metricType)
      list.add(metricType);

    boolean present_longValue = true && (is_set_longValue());
    list.add(present_longValue);
    if (present_longValue)
      list.add(longValue);

    boolean present_doubleValue = true && (is_set_doubleValue());
    list.add(present_doubleValue);
    if (present_doubleValue)
      list.add(doubleValue);

    boolean present_m1 = true && (is_set_m1());
    list.add(present_m1);
    if (present_m1)
      list.add(m1);

    boolean present_m5 = true && (is_set_m5());
    list.add(present_m5);
    if (present_m5)
      list.add(m5);

    boolean present_m15 = true && (is_set_m15());
    list.add(present_m15);
    if (present_m15)
      list.add(m15);

    boolean present_mean = true && (is_set_mean());
    list.add(present_mean);
    if (present_mean)
      list.add(mean);

    boolean present_min = true && (is_set_min());
    list.add(present_min);
    if (present_min)
      list.add(min);

    boolean present_max = true && (is_set_max());
    list.add(present_max);
    if (present_max)
      list.add(max);

    boolean present_p50 = true && (is_set_p50());
    list.add(present_p50);
    if (present_p50)
      list.add(p50);

    boolean present_p75 = true && (is_set_p75());
    list.add(present_p75);
    if (present_p75)
      list.add(p75);

    boolean present_p95 = true && (is_set_p95());
    list.add(present_p95);
    if (present_p95)
      list.add(p95);

    boolean present_p98 = true && (is_set_p98());
    list.add(present_p98);
    if (present_p98)
      list.add(p98);

    boolean present_p99 = true && (is_set_p99());
    list.add(present_p99);
    if (present_p99)
      list.add(p99);

    boolean present_p999 = true && (is_set_p999());
    list.add(present_p999);
    if (present_p999)
      list.add(p999);

    boolean present_stddev = true && (is_set_stddev());
    list.add(present_stddev);
    if (present_stddev)
      list.add(stddev);

    boolean present_points = true && (is_set_points());
    list.add(present_points);
    if (present_points)
      list.add(points);

    return list.hashCode();
  }

  @Override
  public int compareTo(MetricSnapshot other) {
    if (!getClass().equals(other.getClass())) {
      return getClass().getName().compareTo(other.getClass().getName());
    }

    int lastComparison = 0;

    lastComparison = Boolean.valueOf(is_set_metricId()).compareTo(other.is_set_metricId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_metricId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.metricId, other.metricId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_ts()).compareTo(other.is_set_ts());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_ts()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.ts, other.ts);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_metricType()).compareTo(other.is_set_metricType());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_metricType()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.metricType, other.metricType);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_longValue()).compareTo(other.is_set_longValue());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_longValue()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.longValue, other.longValue);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_doubleValue()).compareTo(other.is_set_doubleValue());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_doubleValue()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.doubleValue, other.doubleValue);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_m1()).compareTo(other.is_set_m1());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_m1()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.m1, other.m1);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_m5()).compareTo(other.is_set_m5());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_m5()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.m5, other.m5);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_m15()).compareTo(other.is_set_m15());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_m15()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.m15, other.m15);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_mean()).compareTo(other.is_set_mean());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_mean()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.mean, other.mean);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_min()).compareTo(other.is_set_min());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_min()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.min, other.min);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_max()).compareTo(other.is_set_max());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_max()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.max, other.max);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p50()).compareTo(other.is_set_p50());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p50()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p50, other.p50);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p75()).compareTo(other.is_set_p75());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p75()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p75, other.p75);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p95()).compareTo(other.is_set_p95());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p95()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p95, other.p95);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p98()).compareTo(other.is_set_p98());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p98()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p98, other.p98);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p99()).compareTo(other.is_set_p99());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p99()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p99, other.p99);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_p999()).compareTo(other.is_set_p999());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_p999()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.p999, other.p999);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_stddev()).compareTo(other.is_set_stddev());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_stddev()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.stddev, other.stddev);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(is_set_points()).compareTo(other.is_set_points());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (is_set_points()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.points, other.points);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

  public void read(org.apache.thrift.protocol.TProtocol iprot) throws TException {
    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
  }

  public void write(org.apache.thrift.protocol.TProtocol oprot) throws TException {
    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("MetricSnapshot(");
    boolean first = true;

    sb.append("metricId:");
    sb.append(this.metricId);
    first = false;
    if (!first) sb.append(", ");
    sb.append("ts:");
    sb.append(this.ts);
    first = false;
    if (!first) sb.append(", ");
    sb.append("metricType:");
    sb.append(this.metricType);
    first = false;
    if (is_set_longValue()) {
      if (!first) sb.append(", ");
      sb.append("longValue:");
      sb.append(this.longValue);
      first = false;
    }
    if (is_set_doubleValue()) {
      if (!first) sb.append(", ");
      sb.append("doubleValue:");
      sb.append(this.doubleValue);
      first = false;
    }
    if (is_set_m1()) {
      if (!first) sb.append(", ");
      sb.append("m1:");
      sb.append(this.m1);
      first = false;
    }
    if (is_set_m5()) {
      if (!first) sb.append(", ");
      sb.append("m5:");
      sb.append(this.m5);
      first = false;
    }
    if (is_set_m15()) {
      if (!first) sb.append(", ");
      sb.append("m15:");
      sb.append(this.m15);
      first = false;
    }
    if (is_set_mean()) {
      if (!first) sb.append(", ");
      sb.append("mean:");
      sb.append(this.mean);
      first = false;
    }
    if (is_set_min()) {
      if (!first) sb.append(", ");
      sb.append("min:");
      sb.append(this.min);
      first = false;
    }
    if (is_set_max()) {
      if (!first) sb.append(", ");
      sb.append("max:");
      sb.append(this.max);
      first = false;
    }
    if (is_set_p50()) {
      if (!first) sb.append(", ");
      sb.append("p50:");
      sb.append(this.p50);
      first = false;
    }
    if (is_set_p75()) {
      if (!first) sb.append(", ");
      sb.append("p75:");
      sb.append(this.p75);
      first = false;
    }
    if (is_set_p95()) {
      if (!first) sb.append(", ");
      sb.append("p95:");
      sb.append(this.p95);
      first = false;
    }
    if (is_set_p98()) {
      if (!first) sb.append(", ");
      sb.append("p98:");
      sb.append(this.p98);
      first = false;
    }
    if (is_set_p99()) {
      if (!first) sb.append(", ");
      sb.append("p99:");
      sb.append(this.p99);
      first = false;
    }
    if (is_set_p999()) {
      if (!first) sb.append(", ");
      sb.append("p999:");
      sb.append(this.p999);
      first = false;
    }
    if (is_set_stddev()) {
      if (!first) sb.append(", ");
      sb.append("stddev:");
      sb.append(this.stddev);
      first = false;
    }
    if (is_set_points()) {
      if (!first) sb.append(", ");
      sb.append("points:");
      if (this.points == null) {
        sb.append("null");
      } else {
        sb.append(this.points);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws TException {
    // check for required fields
    if (!is_set_metricId()) {
      throw new TProtocolException("Required field 'metricId' is unset! Struct:" + toString());
    }

    if (!is_set_ts()) {
      throw new TProtocolException("Required field 'ts' is unset! Struct:" + toString());
    }

    if (!is_set_metricType()) {
      throw new TProtocolException("Required field 'metricType' is unset! Struct:" + toString());
    }

    // check for sub-struct validity
  }

  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
    try {
      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
    } catch (TException te) {
      throw new java.io.IOException(te);
    }
  }

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_bitfield = 0;
      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    } catch (TException te) {
      throw new java.io.IOException(te);
    }
  }

  private static class MetricSnapshotStandardSchemeFactory implements SchemeFactory {
    public MetricSnapshotStandardScheme getScheme() {
      return new MetricSnapshotStandardScheme();
    }
  }

  private static class MetricSnapshotStandardScheme extends StandardScheme<MetricSnapshot> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, MetricSnapshot struct) throws TException {
      org.apache.thrift.protocol.TField schemeField;
      iprot.readStructBegin();
      while (true)
      {
        schemeField = iprot.readFieldBegin();
        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
          break;
        }
        switch (schemeField.id) {
          case 1: // METRIC_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.metricId = iprot.readI64();
              struct.set_metricId_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // TS
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.ts = iprot.readI64();
              struct.set_ts_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // METRIC_TYPE
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.metricType = iprot.readI32();
              struct.set_metricType_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // LONG_VALUE
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.longValue = iprot.readI64();
              struct.set_longValue_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // DOUBLE_VALUE
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.doubleValue = iprot.readDouble();
              struct.set_doubleValue_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // M1
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.m1 = iprot.readDouble();
              struct.set_m1_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // M5
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.m5 = iprot.readDouble();
              struct.set_m5_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // M15
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.m15 = iprot.readDouble();
              struct.set_m15_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // MEAN
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.mean = iprot.readDouble();
              struct.set_mean_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // MIN
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.min = iprot.readI64();
              struct.set_min_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // MAX
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.max = iprot.readI64();
              struct.set_max_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // P50
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p50 = iprot.readDouble();
              struct.set_p50_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // P75
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p75 = iprot.readDouble();
              struct.set_p75_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // P95
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p95 = iprot.readDouble();
              struct.set_p95_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // P98
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p98 = iprot.readDouble();
              struct.set_p98_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // P99
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p99 = iprot.readDouble();
              struct.set_p99_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 17: // P999
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.p999 = iprot.readDouble();
              struct.set_p999_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // STDDEV
            if (schemeField.type == org.apache.thrift.protocol.TType.DOUBLE) {
              struct.stddev = iprot.readDouble();
              struct.set_stddev_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // POINTS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list116 = iprot.readListBegin();
                struct.points = new ArrayList<Long>(_list116.size);
                long _elem117;
                for (int _i118 = 0; _i118 < _list116.size; ++_i118)
                {
                  _elem117 = iprot.readI64();
                  struct.points.add(_elem117);
                }
                iprot.readListEnd();
              }
              struct.set_points_isSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

    public void write(org.apache.thrift.protocol.TProtocol oprot, MetricSnapshot struct) throws TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      oprot.writeFieldBegin(METRIC_ID_FIELD_DESC);
      oprot.writeI64(struct.metricId);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(TS_FIELD_DESC);
      oprot.writeI64(struct.ts);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(METRIC_TYPE_FIELD_DESC);
      oprot.writeI32(struct.metricType);
      oprot.writeFieldEnd();
      if (struct.is_set_longValue()) {
        oprot.writeFieldBegin(LONG_VALUE_FIELD_DESC);
        oprot.writeI64(struct.longValue);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_doubleValue()) {
        oprot.writeFieldBegin(DOUBLE_VALUE_FIELD_DESC);
        oprot.writeDouble(struct.doubleValue);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_m1()) {
        oprot.writeFieldBegin(M1_FIELD_DESC);
        oprot.writeDouble(struct.m1);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_m5()) {
        oprot.writeFieldBegin(M5_FIELD_DESC);
        oprot.writeDouble(struct.m5);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_m15()) {
        oprot.writeFieldBegin(M15_FIELD_DESC);
        oprot.writeDouble(struct.m15);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_mean()) {
        oprot.writeFieldBegin(MEAN_FIELD_DESC);
        oprot.writeDouble(struct.mean);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_min()) {
        oprot.writeFieldBegin(MIN_FIELD_DESC);
        oprot.writeI64(struct.min);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_max()) {
        oprot.writeFieldBegin(MAX_FIELD_DESC);
        oprot.writeI64(struct.max);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p50()) {
        oprot.writeFieldBegin(P50_FIELD_DESC);
        oprot.writeDouble(struct.p50);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p75()) {
        oprot.writeFieldBegin(P75_FIELD_DESC);
        oprot.writeDouble(struct.p75);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p95()) {
        oprot.writeFieldBegin(P95_FIELD_DESC);
        oprot.writeDouble(struct.p95);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p98()) {
        oprot.writeFieldBegin(P98_FIELD_DESC);
        oprot.writeDouble(struct.p98);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p99()) {
        oprot.writeFieldBegin(P99_FIELD_DESC);
        oprot.writeDouble(struct.p99);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_p999()) {
        oprot.writeFieldBegin(P999_FIELD_DESC);
        oprot.writeDouble(struct.p999);
        oprot.writeFieldEnd();
      }
      if (struct.is_set_stddev()) {
        oprot.writeFieldBegin(STDDEV_FIELD_DESC);
        oprot.writeDouble(struct.stddev);
        oprot.writeFieldEnd();
      }
      if (struct.points != null) {
        if (struct.is_set_points()) {
          oprot.writeFieldBegin(POINTS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I64, struct.points.size()));
            for (long _iter119 : struct.points)
            {
              oprot.writeI64(_iter119);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class MetricSnapshotTupleSchemeFactory implements SchemeFactory {
    public MetricSnapshotTupleScheme getScheme() {
      return new MetricSnapshotTupleScheme();
    }
  }

  private static class MetricSnapshotTupleScheme extends TupleScheme<MetricSnapshot> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, MetricSnapshot struct) throws TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      oprot.writeI64(struct.metricId);
      oprot.writeI64(struct.ts);
      oprot.writeI32(struct.metricType);
      BitSet optionals = new BitSet();
      if (struct.is_set_longValue()) {
        optionals.set(0);
      }
      if (struct.is_set_doubleValue()) {
        optionals.set(1);
      }
      if (struct.is_set_m1()) {
        optionals.set(2);
      }
      if (struct.is_set_m5()) {
        optionals.set(3);
      }
      if (struct.is_set_m15()) {
        optionals.set(4);
      }
      if (struct.is_set_mean()) {
        optionals.set(5);
      }
      if (struct.is_set_min()) {
        optionals.set(6);
      }
      if (struct.is_set_max()) {
        optionals.set(7);
      }
      if (struct.is_set_p50()) {
        optionals.set(8);
      }
      if (struct.is_set_p75()) {
        optionals.set(9);
      }
      if (struct.is_set_p95()) {
        optionals.set(10);
      }
      if (struct.is_set_p98()) {
        optionals.set(11);
      }
      if (struct.is_set_p99()) {
        optionals.set(12);
      }
      if (struct.is_set_p999()) {
        optionals.set(13);
      }
      if (struct.is_set_stddev()) {
        optionals.set(14);
      }
      if (struct.is_set_points()) {
        optionals.set(15);
      }
      oprot.writeBitSet(optionals, 16);
      if (struct.is_set_longValue()) {
        oprot.writeI64(struct.longValue);
      }
      if (struct.is_set_doubleValue()) {
        oprot.writeDouble(struct.doubleValue);
      }
      if (struct.is_set_m1()) {
        oprot.writeDouble(struct.m1);
      }
      if (struct.is_set_m5()) {
        oprot.writeDouble(struct.m5);
      }
      if (struct.is_set_m15()) {
        oprot.writeDouble(struct.m15);
      }
      if (struct.is_set_mean()) {
        oprot.writeDouble(struct.mean);
      }
      if (struct.is_set_min()) {
        oprot.writeI64(struct.min);
      }
      if (struct.is_set_max()) {
        oprot.writeI64(struct.max);
      }
      if (struct.is_set_p50()) {
        oprot.writeDouble(struct.p50);
      }
      if (struct.is_set_p75()) {
        oprot.writeDouble(struct.p75);
      }
      if (struct.is_set_p95()) {
        oprot.writeDouble(struct.p95);
      }
      if (struct.is_set_p98()) {
        oprot.writeDouble(struct.p98);
      }
      if (struct.is_set_p99()) {
        oprot.writeDouble(struct.p99);
      }
      if (struct.is_set_p999()) {
        oprot.writeDouble(struct.p999);
      }
      if (struct.is_set_stddev()) {
        oprot.writeDouble(struct.stddev);
      }
      if (struct.is_set_points()) {
        {
          oprot.writeI32(struct.points.size());
          for (long _iter120 : struct.points)
          {
            oprot.writeI64(_iter120);
          }
        }
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, MetricSnapshot struct) throws TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      struct.metricId = iprot.readI64();
      struct.set_metricId_isSet(true);
      struct.ts = iprot.readI64();
      struct.set_ts_isSet(true);
      struct.metricType = iprot.readI32();
      struct.set_metricType_isSet(true);
      BitSet incoming = iprot.readBitSet(16);
      if (incoming.get(0)) {
        struct.longValue = iprot.readI64();
        struct.set_longValue_isSet(true);
      }
      if (incoming.get(1)) {
        struct.doubleValue = iprot.readDouble();
        struct.set_doubleValue_isSet(true);
      }
      if (incoming.get(2)) {
        struct.m1 = iprot.readDouble();
        struct.set_m1_isSet(true);
      }
      if (incoming.get(3)) {
        struct.m5 = iprot.readDouble();
        struct.set_m5_isSet(true);
      }
      if (incoming.get(4)) {
        struct.m15 = iprot.readDouble();
        struct.set_m15_isSet(true);
      }
      if (incoming.get(5)) {
        struct.mean = iprot.readDouble();
        struct.set_mean_isSet(true);
      }
      if (incoming.get(6)) {
        struct.min = iprot.readI64();
        struct.set_min_isSet(true);
      }
      if (incoming.get(7)) {
        struct.max = iprot.readI64();
        struct.set_max_isSet(true);
      }
      if (incoming.get(8)) {
        struct.p50 = iprot.readDouble();
        struct.set_p50_isSet(true);
      }
      if (incoming.get(9)) {
        struct.p75 = iprot.readDouble();
        struct.set_p75_isSet(true);
      }
      if (incoming.get(10)) {
        struct.p95 = iprot.readDouble();
        struct.set_p95_isSet(true);
      }
      if (incoming.get(11)) {
        struct.p98 = iprot.readDouble();
        struct.set_p98_isSet(true);
      }
      if (incoming.get(12)) {
        struct.p99 = iprot.readDouble();
        struct.set_p99_isSet(true);
      }
      if (incoming.get(13)) {
        struct.p999 = iprot.readDouble();
        struct.set_p999_isSet(true);
      }
      if (incoming.get(14)) {
        struct.stddev = iprot.readDouble();
        struct.set_stddev_isSet(true);
      }
      if (incoming.get(15)) {
        {
          org.apache.thrift.protocol.TList _list121 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.I64, iprot.readI32());
          struct.points = new ArrayList<Long>(_list121.size);
          long _elem122;
          for (int _i123 = 0; _i123 < _list121.size; ++_i123)
          {
            _elem122 = iprot.readI64();
            struct.points.add(_elem122);
          }
        }
        struct.set_points_isSet(true);
      }
    }
  }

}

