/**
 * Autogenerated by Thrift Compiler (0.14.1)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.hadoop.hbase.thrift2.generated;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
/**
 * Thrift wrapper around
 * org.apache.hadoop.hbase.client.OnlineLogRecordrd
 */
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.14.1)", date = "2021-07-19")
public class TOnlineLogRecord implements org.apache.thrift.TBase<TOnlineLogRecord, TOnlineLogRecord._Fields>, java.io.Serializable, Cloneable, Comparable<TOnlineLogRecord> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("TOnlineLogRecord");

  private static final org.apache.thrift.protocol.TField START_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("startTime", org.apache.thrift.protocol.TType.I64, (short)1);
  private static final org.apache.thrift.protocol.TField PROCESSING_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("processingTime", org.apache.thrift.protocol.TType.I32, (short)2);
  private static final org.apache.thrift.protocol.TField QUEUE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("queueTime", org.apache.thrift.protocol.TType.I32, (short)3);
  private static final org.apache.thrift.protocol.TField RESPONSE_SIZE_FIELD_DESC = new org.apache.thrift.protocol.TField("responseSize", org.apache.thrift.protocol.TType.I64, (short)4);
  private static final org.apache.thrift.protocol.TField CLIENT_ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField("clientAddress", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField SERVER_CLASS_FIELD_DESC = new org.apache.thrift.protocol.TField("serverClass", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField METHOD_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("methodName", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField CALL_DETAILS_FIELD_DESC = new org.apache.thrift.protocol.TField("callDetails", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField PARAM_FIELD_DESC = new org.apache.thrift.protocol.TField("param", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField MULTI_GETS_COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("multiGetsCount", org.apache.thrift.protocol.TType.I32, (short)11);
  private static final org.apache.thrift.protocol.TField MULTI_MUTATIONS_COUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("multiMutationsCount", org.apache.thrift.protocol.TType.I32, (short)12);
  private static final org.apache.thrift.protocol.TField MULTI_SERVICE_CALLS_FIELD_DESC = new org.apache.thrift.protocol.TField("multiServiceCalls", org.apache.thrift.protocol.TType.I32, (short)13);
  private static final org.apache.thrift.protocol.TField REGION_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("regionName", org.apache.thrift.protocol.TType.STRING, (short)14);

  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new TOnlineLogRecordStandardSchemeFactory();
  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new TOnlineLogRecordTupleSchemeFactory();

  public long startTime; // required
  public int processingTime; // required
  public int queueTime; // required
  public long responseSize; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String clientAddress; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String serverClass; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String methodName; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String callDetails; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String param; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String userName; // required
  public int multiGetsCount; // required
  public int multiMutationsCount; // required
  public int multiServiceCalls; // required
  public @org.apache.thrift.annotation.Nullable java.lang.String regionName; // 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 {
    START_TIME((short)1, "startTime"),
    PROCESSING_TIME((short)2, "processingTime"),
    QUEUE_TIME((short)3, "queueTime"),
    RESPONSE_SIZE((short)4, "responseSize"),
    CLIENT_ADDRESS((short)5, "clientAddress"),
    SERVER_CLASS((short)6, "serverClass"),
    METHOD_NAME((short)7, "methodName"),
    CALL_DETAILS((short)8, "callDetails"),
    PARAM((short)9, "param"),
    USER_NAME((short)10, "userName"),
    MULTI_GETS_COUNT((short)11, "multiGetsCount"),
    MULTI_MUTATIONS_COUNT((short)12, "multiMutationsCount"),
    MULTI_SERVICE_CALLS((short)13, "multiServiceCalls"),
    REGION_NAME((short)14, "regionName");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    @org.apache.thrift.annotation.Nullable
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // START_TIME
          return START_TIME;
        case 2: // PROCESSING_TIME
          return PROCESSING_TIME;
        case 3: // QUEUE_TIME
          return QUEUE_TIME;
        case 4: // RESPONSE_SIZE
          return RESPONSE_SIZE;
        case 5: // CLIENT_ADDRESS
          return CLIENT_ADDRESS;
        case 6: // SERVER_CLASS
          return SERVER_CLASS;
        case 7: // METHOD_NAME
          return METHOD_NAME;
        case 8: // CALL_DETAILS
          return CALL_DETAILS;
        case 9: // PARAM
          return PARAM;
        case 10: // USER_NAME
          return USER_NAME;
        case 11: // MULTI_GETS_COUNT
          return MULTI_GETS_COUNT;
        case 12: // MULTI_MUTATIONS_COUNT
          return MULTI_MUTATIONS_COUNT;
        case 13: // MULTI_SERVICE_CALLS
          return MULTI_SERVICE_CALLS;
        case 14: // REGION_NAME
          return REGION_NAME;
        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 java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    @org.apache.thrift.annotation.Nullable
    public static _Fields findByName(java.lang.String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final java.lang.String _fieldName;

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

    public short getThriftFieldId() {
      return _thriftId;
    }

    public java.lang.String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __STARTTIME_ISSET_ID = 0;
  private static final int __PROCESSINGTIME_ISSET_ID = 1;
  private static final int __QUEUETIME_ISSET_ID = 2;
  private static final int __RESPONSESIZE_ISSET_ID = 3;
  private static final int __MULTIGETSCOUNT_ISSET_ID = 4;
  private static final int __MULTIMUTATIONSCOUNT_ISSET_ID = 5;
  private static final int __MULTISERVICECALLS_ISSET_ID = 6;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.REGION_NAME};
  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.START_TIME, new org.apache.thrift.meta_data.FieldMetaData("startTime", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.PROCESSING_TIME, new org.apache.thrift.meta_data.FieldMetaData("processingTime", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.QUEUE_TIME, new org.apache.thrift.meta_data.FieldMetaData("queueTime", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.RESPONSE_SIZE, new org.apache.thrift.meta_data.FieldMetaData("responseSize", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.CLIENT_ADDRESS, new org.apache.thrift.meta_data.FieldMetaData("clientAddress", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.SERVER_CLASS, new org.apache.thrift.meta_data.FieldMetaData("serverClass", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.METHOD_NAME, new org.apache.thrift.meta_data.FieldMetaData("methodName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.CALL_DETAILS, new org.apache.thrift.meta_data.FieldMetaData("callDetails", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PARAM, new org.apache.thrift.meta_data.FieldMetaData("param", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.MULTI_GETS_COUNT, new org.apache.thrift.meta_data.FieldMetaData("multiGetsCount", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.MULTI_MUTATIONS_COUNT, new org.apache.thrift.meta_data.FieldMetaData("multiMutationsCount", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.MULTI_SERVICE_CALLS, new org.apache.thrift.meta_data.FieldMetaData("multiServiceCalls", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.REGION_NAME, new org.apache.thrift.meta_data.FieldMetaData("regionName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TOnlineLogRecord.class, metaDataMap);
  }

  public TOnlineLogRecord() {
  }

  public TOnlineLogRecord(
    long startTime,
    int processingTime,
    int queueTime,
    long responseSize,
    java.lang.String clientAddress,
    java.lang.String serverClass,
    java.lang.String methodName,
    java.lang.String callDetails,
    java.lang.String param,
    java.lang.String userName,
    int multiGetsCount,
    int multiMutationsCount,
    int multiServiceCalls)
  {
    this();
    this.startTime = startTime;
    setStartTimeIsSet(true);
    this.processingTime = processingTime;
    setProcessingTimeIsSet(true);
    this.queueTime = queueTime;
    setQueueTimeIsSet(true);
    this.responseSize = responseSize;
    setResponseSizeIsSet(true);
    this.clientAddress = clientAddress;
    this.serverClass = serverClass;
    this.methodName = methodName;
    this.callDetails = callDetails;
    this.param = param;
    this.userName = userName;
    this.multiGetsCount = multiGetsCount;
    setMultiGetsCountIsSet(true);
    this.multiMutationsCount = multiMutationsCount;
    setMultiMutationsCountIsSet(true);
    this.multiServiceCalls = multiServiceCalls;
    setMultiServiceCallsIsSet(true);
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public TOnlineLogRecord(TOnlineLogRecord other) {
    __isset_bitfield = other.__isset_bitfield;
    this.startTime = other.startTime;
    this.processingTime = other.processingTime;
    this.queueTime = other.queueTime;
    this.responseSize = other.responseSize;
    if (other.isSetClientAddress()) {
      this.clientAddress = other.clientAddress;
    }
    if (other.isSetServerClass()) {
      this.serverClass = other.serverClass;
    }
    if (other.isSetMethodName()) {
      this.methodName = other.methodName;
    }
    if (other.isSetCallDetails()) {
      this.callDetails = other.callDetails;
    }
    if (other.isSetParam()) {
      this.param = other.param;
    }
    if (other.isSetUserName()) {
      this.userName = other.userName;
    }
    this.multiGetsCount = other.multiGetsCount;
    this.multiMutationsCount = other.multiMutationsCount;
    this.multiServiceCalls = other.multiServiceCalls;
    if (other.isSetRegionName()) {
      this.regionName = other.regionName;
    }
  }

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

  @Override
  public void clear() {
    setStartTimeIsSet(false);
    this.startTime = 0;
    setProcessingTimeIsSet(false);
    this.processingTime = 0;
    setQueueTimeIsSet(false);
    this.queueTime = 0;
    setResponseSizeIsSet(false);
    this.responseSize = 0;
    this.clientAddress = null;
    this.serverClass = null;
    this.methodName = null;
    this.callDetails = null;
    this.param = null;
    this.userName = null;
    setMultiGetsCountIsSet(false);
    this.multiGetsCount = 0;
    setMultiMutationsCountIsSet(false);
    this.multiMutationsCount = 0;
    setMultiServiceCallsIsSet(false);
    this.multiServiceCalls = 0;
    this.regionName = null;
  }

  public long getStartTime() {
    return this.startTime;
  }

  public TOnlineLogRecord setStartTime(long startTime) {
    this.startTime = startTime;
    setStartTimeIsSet(true);
    return this;
  }

  public void unsetStartTime() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __STARTTIME_ISSET_ID);
  }

  /** Returns true if field startTime is set (has been assigned a value) and false otherwise */
  public boolean isSetStartTime() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __STARTTIME_ISSET_ID);
  }

  public void setStartTimeIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __STARTTIME_ISSET_ID, value);
  }

  public int getProcessingTime() {
    return this.processingTime;
  }

  public TOnlineLogRecord setProcessingTime(int processingTime) {
    this.processingTime = processingTime;
    setProcessingTimeIsSet(true);
    return this;
  }

  public void unsetProcessingTime() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __PROCESSINGTIME_ISSET_ID);
  }

  /** Returns true if field processingTime is set (has been assigned a value) and false otherwise */
  public boolean isSetProcessingTime() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __PROCESSINGTIME_ISSET_ID);
  }

  public void setProcessingTimeIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __PROCESSINGTIME_ISSET_ID, value);
  }

  public int getQueueTime() {
    return this.queueTime;
  }

  public TOnlineLogRecord setQueueTime(int queueTime) {
    this.queueTime = queueTime;
    setQueueTimeIsSet(true);
    return this;
  }

  public void unsetQueueTime() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __QUEUETIME_ISSET_ID);
  }

  /** Returns true if field queueTime is set (has been assigned a value) and false otherwise */
  public boolean isSetQueueTime() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __QUEUETIME_ISSET_ID);
  }

  public void setQueueTimeIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __QUEUETIME_ISSET_ID, value);
  }

  public long getResponseSize() {
    return this.responseSize;
  }

  public TOnlineLogRecord setResponseSize(long responseSize) {
    this.responseSize = responseSize;
    setResponseSizeIsSet(true);
    return this;
  }

  public void unsetResponseSize() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __RESPONSESIZE_ISSET_ID);
  }

  /** Returns true if field responseSize is set (has been assigned a value) and false otherwise */
  public boolean isSetResponseSize() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __RESPONSESIZE_ISSET_ID);
  }

  public void setResponseSizeIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __RESPONSESIZE_ISSET_ID, value);
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getClientAddress() {
    return this.clientAddress;
  }

  public TOnlineLogRecord setClientAddress(@org.apache.thrift.annotation.Nullable java.lang.String clientAddress) {
    this.clientAddress = clientAddress;
    return this;
  }

  public void unsetClientAddress() {
    this.clientAddress = null;
  }

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

  public void setClientAddressIsSet(boolean value) {
    if (!value) {
      this.clientAddress = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getServerClass() {
    return this.serverClass;
  }

  public TOnlineLogRecord setServerClass(@org.apache.thrift.annotation.Nullable java.lang.String serverClass) {
    this.serverClass = serverClass;
    return this;
  }

  public void unsetServerClass() {
    this.serverClass = null;
  }

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

  public void setServerClassIsSet(boolean value) {
    if (!value) {
      this.serverClass = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getMethodName() {
    return this.methodName;
  }

  public TOnlineLogRecord setMethodName(@org.apache.thrift.annotation.Nullable java.lang.String methodName) {
    this.methodName = methodName;
    return this;
  }

  public void unsetMethodName() {
    this.methodName = null;
  }

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

  public void setMethodNameIsSet(boolean value) {
    if (!value) {
      this.methodName = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getCallDetails() {
    return this.callDetails;
  }

  public TOnlineLogRecord setCallDetails(@org.apache.thrift.annotation.Nullable java.lang.String callDetails) {
    this.callDetails = callDetails;
    return this;
  }

  public void unsetCallDetails() {
    this.callDetails = null;
  }

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

  public void setCallDetailsIsSet(boolean value) {
    if (!value) {
      this.callDetails = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getParam() {
    return this.param;
  }

  public TOnlineLogRecord setParam(@org.apache.thrift.annotation.Nullable java.lang.String param) {
    this.param = param;
    return this;
  }

  public void unsetParam() {
    this.param = null;
  }

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

  public void setParamIsSet(boolean value) {
    if (!value) {
      this.param = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getUserName() {
    return this.userName;
  }

  public TOnlineLogRecord setUserName(@org.apache.thrift.annotation.Nullable java.lang.String userName) {
    this.userName = userName;
    return this;
  }

  public void unsetUserName() {
    this.userName = null;
  }

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

  public void setUserNameIsSet(boolean value) {
    if (!value) {
      this.userName = null;
    }
  }

  public int getMultiGetsCount() {
    return this.multiGetsCount;
  }

  public TOnlineLogRecord setMultiGetsCount(int multiGetsCount) {
    this.multiGetsCount = multiGetsCount;
    setMultiGetsCountIsSet(true);
    return this;
  }

  public void unsetMultiGetsCount() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __MULTIGETSCOUNT_ISSET_ID);
  }

  /** Returns true if field multiGetsCount is set (has been assigned a value) and false otherwise */
  public boolean isSetMultiGetsCount() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __MULTIGETSCOUNT_ISSET_ID);
  }

  public void setMultiGetsCountIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __MULTIGETSCOUNT_ISSET_ID, value);
  }

  public int getMultiMutationsCount() {
    return this.multiMutationsCount;
  }

  public TOnlineLogRecord setMultiMutationsCount(int multiMutationsCount) {
    this.multiMutationsCount = multiMutationsCount;
    setMultiMutationsCountIsSet(true);
    return this;
  }

  public void unsetMultiMutationsCount() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __MULTIMUTATIONSCOUNT_ISSET_ID);
  }

  /** Returns true if field multiMutationsCount is set (has been assigned a value) and false otherwise */
  public boolean isSetMultiMutationsCount() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __MULTIMUTATIONSCOUNT_ISSET_ID);
  }

  public void setMultiMutationsCountIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __MULTIMUTATIONSCOUNT_ISSET_ID, value);
  }

  public int getMultiServiceCalls() {
    return this.multiServiceCalls;
  }

  public TOnlineLogRecord setMultiServiceCalls(int multiServiceCalls) {
    this.multiServiceCalls = multiServiceCalls;
    setMultiServiceCallsIsSet(true);
    return this;
  }

  public void unsetMultiServiceCalls() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __MULTISERVICECALLS_ISSET_ID);
  }

  /** Returns true if field multiServiceCalls is set (has been assigned a value) and false otherwise */
  public boolean isSetMultiServiceCalls() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __MULTISERVICECALLS_ISSET_ID);
  }

  public void setMultiServiceCallsIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __MULTISERVICECALLS_ISSET_ID, value);
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getRegionName() {
    return this.regionName;
  }

  public TOnlineLogRecord setRegionName(@org.apache.thrift.annotation.Nullable java.lang.String regionName) {
    this.regionName = regionName;
    return this;
  }

  public void unsetRegionName() {
    this.regionName = null;
  }

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

  public void setRegionNameIsSet(boolean value) {
    if (!value) {
      this.regionName = null;
    }
  }

  public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) {
    switch (field) {
    case START_TIME:
      if (value == null) {
        unsetStartTime();
      } else {
        setStartTime((java.lang.Long)value);
      }
      break;

    case PROCESSING_TIME:
      if (value == null) {
        unsetProcessingTime();
      } else {
        setProcessingTime((java.lang.Integer)value);
      }
      break;

    case QUEUE_TIME:
      if (value == null) {
        unsetQueueTime();
      } else {
        setQueueTime((java.lang.Integer)value);
      }
      break;

    case RESPONSE_SIZE:
      if (value == null) {
        unsetResponseSize();
      } else {
        setResponseSize((java.lang.Long)value);
      }
      break;

    case CLIENT_ADDRESS:
      if (value == null) {
        unsetClientAddress();
      } else {
        setClientAddress((java.lang.String)value);
      }
      break;

    case SERVER_CLASS:
      if (value == null) {
        unsetServerClass();
      } else {
        setServerClass((java.lang.String)value);
      }
      break;

    case METHOD_NAME:
      if (value == null) {
        unsetMethodName();
      } else {
        setMethodName((java.lang.String)value);
      }
      break;

    case CALL_DETAILS:
      if (value == null) {
        unsetCallDetails();
      } else {
        setCallDetails((java.lang.String)value);
      }
      break;

    case PARAM:
      if (value == null) {
        unsetParam();
      } else {
        setParam((java.lang.String)value);
      }
      break;

    case USER_NAME:
      if (value == null) {
        unsetUserName();
      } else {
        setUserName((java.lang.String)value);
      }
      break;

    case MULTI_GETS_COUNT:
      if (value == null) {
        unsetMultiGetsCount();
      } else {
        setMultiGetsCount((java.lang.Integer)value);
      }
      break;

    case MULTI_MUTATIONS_COUNT:
      if (value == null) {
        unsetMultiMutationsCount();
      } else {
        setMultiMutationsCount((java.lang.Integer)value);
      }
      break;

    case MULTI_SERVICE_CALLS:
      if (value == null) {
        unsetMultiServiceCalls();
      } else {
        setMultiServiceCalls((java.lang.Integer)value);
      }
      break;

    case REGION_NAME:
      if (value == null) {
        unsetRegionName();
      } else {
        setRegionName((java.lang.String)value);
      }
      break;

    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.Object getFieldValue(_Fields field) {
    switch (field) {
    case START_TIME:
      return getStartTime();

    case PROCESSING_TIME:
      return getProcessingTime();

    case QUEUE_TIME:
      return getQueueTime();

    case RESPONSE_SIZE:
      return getResponseSize();

    case CLIENT_ADDRESS:
      return getClientAddress();

    case SERVER_CLASS:
      return getServerClass();

    case METHOD_NAME:
      return getMethodName();

    case CALL_DETAILS:
      return getCallDetails();

    case PARAM:
      return getParam();

    case USER_NAME:
      return getUserName();

    case MULTI_GETS_COUNT:
      return getMultiGetsCount();

    case MULTI_MUTATIONS_COUNT:
      return getMultiMutationsCount();

    case MULTI_SERVICE_CALLS:
      return getMultiServiceCalls();

    case REGION_NAME:
      return getRegionName();

    }
    throw new java.lang.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 java.lang.IllegalArgumentException();
    }

    switch (field) {
    case START_TIME:
      return isSetStartTime();
    case PROCESSING_TIME:
      return isSetProcessingTime();
    case QUEUE_TIME:
      return isSetQueueTime();
    case RESPONSE_SIZE:
      return isSetResponseSize();
    case CLIENT_ADDRESS:
      return isSetClientAddress();
    case SERVER_CLASS:
      return isSetServerClass();
    case METHOD_NAME:
      return isSetMethodName();
    case CALL_DETAILS:
      return isSetCallDetails();
    case PARAM:
      return isSetParam();
    case USER_NAME:
      return isSetUserName();
    case MULTI_GETS_COUNT:
      return isSetMultiGetsCount();
    case MULTI_MUTATIONS_COUNT:
      return isSetMultiMutationsCount();
    case MULTI_SERVICE_CALLS:
      return isSetMultiServiceCalls();
    case REGION_NAME:
      return isSetRegionName();
    }
    throw new java.lang.IllegalStateException();
  }

  @Override
  public boolean equals(java.lang.Object that) {
    if (that instanceof TOnlineLogRecord)
      return this.equals((TOnlineLogRecord)that);
    return false;
  }

  public boolean equals(TOnlineLogRecord that) {
    if (that == null)
      return false;
    if (this == that)
      return true;

    boolean this_present_startTime = true;
    boolean that_present_startTime = true;
    if (this_present_startTime || that_present_startTime) {
      if (!(this_present_startTime && that_present_startTime))
        return false;
      if (this.startTime != that.startTime)
        return false;
    }

    boolean this_present_processingTime = true;
    boolean that_present_processingTime = true;
    if (this_present_processingTime || that_present_processingTime) {
      if (!(this_present_processingTime && that_present_processingTime))
        return false;
      if (this.processingTime != that.processingTime)
        return false;
    }

    boolean this_present_queueTime = true;
    boolean that_present_queueTime = true;
    if (this_present_queueTime || that_present_queueTime) {
      if (!(this_present_queueTime && that_present_queueTime))
        return false;
      if (this.queueTime != that.queueTime)
        return false;
    }

    boolean this_present_responseSize = true;
    boolean that_present_responseSize = true;
    if (this_present_responseSize || that_present_responseSize) {
      if (!(this_present_responseSize && that_present_responseSize))
        return false;
      if (this.responseSize != that.responseSize)
        return false;
    }

    boolean this_present_clientAddress = true && this.isSetClientAddress();
    boolean that_present_clientAddress = true && that.isSetClientAddress();
    if (this_present_clientAddress || that_present_clientAddress) {
      if (!(this_present_clientAddress && that_present_clientAddress))
        return false;
      if (!this.clientAddress.equals(that.clientAddress))
        return false;
    }

    boolean this_present_serverClass = true && this.isSetServerClass();
    boolean that_present_serverClass = true && that.isSetServerClass();
    if (this_present_serverClass || that_present_serverClass) {
      if (!(this_present_serverClass && that_present_serverClass))
        return false;
      if (!this.serverClass.equals(that.serverClass))
        return false;
    }

    boolean this_present_methodName = true && this.isSetMethodName();
    boolean that_present_methodName = true && that.isSetMethodName();
    if (this_present_methodName || that_present_methodName) {
      if (!(this_present_methodName && that_present_methodName))
        return false;
      if (!this.methodName.equals(that.methodName))
        return false;
    }

    boolean this_present_callDetails = true && this.isSetCallDetails();
    boolean that_present_callDetails = true && that.isSetCallDetails();
    if (this_present_callDetails || that_present_callDetails) {
      if (!(this_present_callDetails && that_present_callDetails))
        return false;
      if (!this.callDetails.equals(that.callDetails))
        return false;
    }

    boolean this_present_param = true && this.isSetParam();
    boolean that_present_param = true && that.isSetParam();
    if (this_present_param || that_present_param) {
      if (!(this_present_param && that_present_param))
        return false;
      if (!this.param.equals(that.param))
        return false;
    }

    boolean this_present_userName = true && this.isSetUserName();
    boolean that_present_userName = true && that.isSetUserName();
    if (this_present_userName || that_present_userName) {
      if (!(this_present_userName && that_present_userName))
        return false;
      if (!this.userName.equals(that.userName))
        return false;
    }

    boolean this_present_multiGetsCount = true;
    boolean that_present_multiGetsCount = true;
    if (this_present_multiGetsCount || that_present_multiGetsCount) {
      if (!(this_present_multiGetsCount && that_present_multiGetsCount))
        return false;
      if (this.multiGetsCount != that.multiGetsCount)
        return false;
    }

    boolean this_present_multiMutationsCount = true;
    boolean that_present_multiMutationsCount = true;
    if (this_present_multiMutationsCount || that_present_multiMutationsCount) {
      if (!(this_present_multiMutationsCount && that_present_multiMutationsCount))
        return false;
      if (this.multiMutationsCount != that.multiMutationsCount)
        return false;
    }

    boolean this_present_multiServiceCalls = true;
    boolean that_present_multiServiceCalls = true;
    if (this_present_multiServiceCalls || that_present_multiServiceCalls) {
      if (!(this_present_multiServiceCalls && that_present_multiServiceCalls))
        return false;
      if (this.multiServiceCalls != that.multiServiceCalls)
        return false;
    }

    boolean this_present_regionName = true && this.isSetRegionName();
    boolean that_present_regionName = true && that.isSetRegionName();
    if (this_present_regionName || that_present_regionName) {
      if (!(this_present_regionName && that_present_regionName))
        return false;
      if (!this.regionName.equals(that.regionName))
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int hashCode = 1;

    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(startTime);

    hashCode = hashCode * 8191 + processingTime;

    hashCode = hashCode * 8191 + queueTime;

    hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(responseSize);

    hashCode = hashCode * 8191 + ((isSetClientAddress()) ? 131071 : 524287);
    if (isSetClientAddress())
      hashCode = hashCode * 8191 + clientAddress.hashCode();

    hashCode = hashCode * 8191 + ((isSetServerClass()) ? 131071 : 524287);
    if (isSetServerClass())
      hashCode = hashCode * 8191 + serverClass.hashCode();

    hashCode = hashCode * 8191 + ((isSetMethodName()) ? 131071 : 524287);
    if (isSetMethodName())
      hashCode = hashCode * 8191 + methodName.hashCode();

    hashCode = hashCode * 8191 + ((isSetCallDetails()) ? 131071 : 524287);
    if (isSetCallDetails())
      hashCode = hashCode * 8191 + callDetails.hashCode();

    hashCode = hashCode * 8191 + ((isSetParam()) ? 131071 : 524287);
    if (isSetParam())
      hashCode = hashCode * 8191 + param.hashCode();

    hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
    if (isSetUserName())
      hashCode = hashCode * 8191 + userName.hashCode();

    hashCode = hashCode * 8191 + multiGetsCount;

    hashCode = hashCode * 8191 + multiMutationsCount;

    hashCode = hashCode * 8191 + multiServiceCalls;

    hashCode = hashCode * 8191 + ((isSetRegionName()) ? 131071 : 524287);
    if (isSetRegionName())
      hashCode = hashCode * 8191 + regionName.hashCode();

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.compare(isSetStartTime(), other.isSetStartTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStartTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.startTime, other.startTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessingTime(), other.isSetProcessingTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessingTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processingTime, other.processingTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetQueueTime(), other.isSetQueueTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetQueueTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.queueTime, other.queueTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetResponseSize(), other.isSetResponseSize());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetResponseSize()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.responseSize, other.responseSize);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetClientAddress(), other.isSetClientAddress());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetClientAddress()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.clientAddress, other.clientAddress);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetServerClass(), other.isSetServerClass());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetServerClass()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.serverClass, other.serverClass);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetMethodName(), other.isSetMethodName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMethodName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.methodName, other.methodName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetCallDetails(), other.isSetCallDetails());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCallDetails()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.callDetails, other.callDetails);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetParam(), other.isSetParam());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetParam()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.param, other.param);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetUserName(), other.isSetUserName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUserName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetMultiGetsCount(), other.isSetMultiGetsCount());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMultiGetsCount()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.multiGetsCount, other.multiGetsCount);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetMultiMutationsCount(), other.isSetMultiMutationsCount());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMultiMutationsCount()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.multiMutationsCount, other.multiMutationsCount);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetMultiServiceCalls(), other.isSetMultiServiceCalls());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMultiServiceCalls()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.multiServiceCalls, other.multiServiceCalls);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetRegionName(), other.isSetRegionName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetRegionName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.regionName, other.regionName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  @org.apache.thrift.annotation.Nullable
  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

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

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

  @Override
  public java.lang.String toString() {
    java.lang.StringBuilder sb = new java.lang.StringBuilder("TOnlineLogRecord(");
    boolean first = true;

    sb.append("startTime:");
    sb.append(this.startTime);
    first = false;
    if (!first) sb.append(", ");
    sb.append("processingTime:");
    sb.append(this.processingTime);
    first = false;
    if (!first) sb.append(", ");
    sb.append("queueTime:");
    sb.append(this.queueTime);
    first = false;
    if (!first) sb.append(", ");
    sb.append("responseSize:");
    sb.append(this.responseSize);
    first = false;
    if (!first) sb.append(", ");
    sb.append("clientAddress:");
    if (this.clientAddress == null) {
      sb.append("null");
    } else {
      sb.append(this.clientAddress);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("serverClass:");
    if (this.serverClass == null) {
      sb.append("null");
    } else {
      sb.append(this.serverClass);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("methodName:");
    if (this.methodName == null) {
      sb.append("null");
    } else {
      sb.append(this.methodName);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("callDetails:");
    if (this.callDetails == null) {
      sb.append("null");
    } else {
      sb.append(this.callDetails);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("param:");
    if (this.param == null) {
      sb.append("null");
    } else {
      sb.append(this.param);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("userName:");
    if (this.userName == null) {
      sb.append("null");
    } else {
      sb.append(this.userName);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("multiGetsCount:");
    sb.append(this.multiGetsCount);
    first = false;
    if (!first) sb.append(", ");
    sb.append("multiMutationsCount:");
    sb.append(this.multiMutationsCount);
    first = false;
    if (!first) sb.append(", ");
    sb.append("multiServiceCalls:");
    sb.append(this.multiServiceCalls);
    first = false;
    if (isSetRegionName()) {
      if (!first) sb.append(", ");
      sb.append("regionName:");
      if (this.regionName == null) {
        sb.append("null");
      } else {
        sb.append(this.regionName);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.thrift.TException {
    // check for required fields
    // alas, we cannot check 'startTime' because it's a primitive and you chose the non-beans generator.
    // alas, we cannot check 'processingTime' because it's a primitive and you chose the non-beans generator.
    // alas, we cannot check 'queueTime' because it's a primitive and you chose the non-beans generator.
    // alas, we cannot check 'responseSize' because it's a primitive and you chose the non-beans generator.
    if (clientAddress == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'clientAddress' was not present! Struct: " + toString());
    }
    if (serverClass == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'serverClass' was not present! Struct: " + toString());
    }
    if (methodName == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'methodName' was not present! Struct: " + toString());
    }
    if (callDetails == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'callDetails' was not present! Struct: " + toString());
    }
    if (param == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'param' was not present! Struct: " + toString());
    }
    if (userName == null) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'userName' was not present! Struct: " + toString());
    }
    // alas, we cannot check 'multiGetsCount' because it's a primitive and you chose the non-beans generator.
    // alas, we cannot check 'multiMutationsCount' because it's a primitive and you chose the non-beans generator.
    // alas, we cannot check 'multiServiceCalls' because it's a primitive and you chose the non-beans generator.
    // 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 (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, java.lang.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 (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private static class TOnlineLogRecordStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public TOnlineLogRecordStandardScheme getScheme() {
      return new TOnlineLogRecordStandardScheme();
    }
  }

  private static class TOnlineLogRecordStandardScheme extends org.apache.thrift.scheme.StandardScheme<TOnlineLogRecord> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, TOnlineLogRecord struct) throws org.apache.thrift.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: // START_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.startTime = iprot.readI64();
              struct.setStartTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // PROCESSING_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.processingTime = iprot.readI32();
              struct.setProcessingTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // QUEUE_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.queueTime = iprot.readI32();
              struct.setQueueTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // RESPONSE_SIZE
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.responseSize = iprot.readI64();
              struct.setResponseSizeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // CLIENT_ADDRESS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.clientAddress = iprot.readString();
              struct.setClientAddressIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // SERVER_CLASS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.serverClass = iprot.readString();
              struct.setServerClassIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // METHOD_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.methodName = iprot.readString();
              struct.setMethodNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // CALL_DETAILS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.callDetails = iprot.readString();
              struct.setCallDetailsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // PARAM
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.param = iprot.readString();
              struct.setParamIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // USER_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.userName = iprot.readString();
              struct.setUserNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // MULTI_GETS_COUNT
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.multiGetsCount = iprot.readI32();
              struct.setMultiGetsCountIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // MULTI_MUTATIONS_COUNT
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.multiMutationsCount = iprot.readI32();
              struct.setMultiMutationsCountIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // MULTI_SERVICE_CALLS
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.multiServiceCalls = iprot.readI32();
              struct.setMultiServiceCallsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // REGION_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.regionName = iprot.readString();
              struct.setRegionNameIsSet(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();

      // check for required fields of primitive type, which can't be checked in the validate method
      if (!struct.isSetStartTime()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'startTime' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetProcessingTime()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'processingTime' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetQueueTime()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'queueTime' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetResponseSize()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'responseSize' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetMultiGetsCount()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'multiGetsCount' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetMultiMutationsCount()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'multiMutationsCount' was not found in serialized data! Struct: " + toString());
      }
      if (!struct.isSetMultiServiceCalls()) {
        throw new org.apache.thrift.protocol.TProtocolException("Required field 'multiServiceCalls' was not found in serialized data! Struct: " + toString());
      }
      struct.validate();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      oprot.writeFieldBegin(START_TIME_FIELD_DESC);
      oprot.writeI64(struct.startTime);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(PROCESSING_TIME_FIELD_DESC);
      oprot.writeI32(struct.processingTime);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(QUEUE_TIME_FIELD_DESC);
      oprot.writeI32(struct.queueTime);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(RESPONSE_SIZE_FIELD_DESC);
      oprot.writeI64(struct.responseSize);
      oprot.writeFieldEnd();
      if (struct.clientAddress != null) {
        oprot.writeFieldBegin(CLIENT_ADDRESS_FIELD_DESC);
        oprot.writeString(struct.clientAddress);
        oprot.writeFieldEnd();
      }
      if (struct.serverClass != null) {
        oprot.writeFieldBegin(SERVER_CLASS_FIELD_DESC);
        oprot.writeString(struct.serverClass);
        oprot.writeFieldEnd();
      }
      if (struct.methodName != null) {
        oprot.writeFieldBegin(METHOD_NAME_FIELD_DESC);
        oprot.writeString(struct.methodName);
        oprot.writeFieldEnd();
      }
      if (struct.callDetails != null) {
        oprot.writeFieldBegin(CALL_DETAILS_FIELD_DESC);
        oprot.writeString(struct.callDetails);
        oprot.writeFieldEnd();
      }
      if (struct.param != null) {
        oprot.writeFieldBegin(PARAM_FIELD_DESC);
        oprot.writeString(struct.param);
        oprot.writeFieldEnd();
      }
      if (struct.userName != null) {
        oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
        oprot.writeString(struct.userName);
        oprot.writeFieldEnd();
      }
      oprot.writeFieldBegin(MULTI_GETS_COUNT_FIELD_DESC);
      oprot.writeI32(struct.multiGetsCount);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(MULTI_MUTATIONS_COUNT_FIELD_DESC);
      oprot.writeI32(struct.multiMutationsCount);
      oprot.writeFieldEnd();
      oprot.writeFieldBegin(MULTI_SERVICE_CALLS_FIELD_DESC);
      oprot.writeI32(struct.multiServiceCalls);
      oprot.writeFieldEnd();
      if (struct.regionName != null) {
        if (struct.isSetRegionName()) {
          oprot.writeFieldBegin(REGION_NAME_FIELD_DESC);
          oprot.writeString(struct.regionName);
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class TOnlineLogRecordTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public TOnlineLogRecordTupleScheme getScheme() {
      return new TOnlineLogRecordTupleScheme();
    }
  }

  private static class TOnlineLogRecordTupleScheme extends org.apache.thrift.scheme.TupleScheme<TOnlineLogRecord> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, TOnlineLogRecord struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      oprot.writeI64(struct.startTime);
      oprot.writeI32(struct.processingTime);
      oprot.writeI32(struct.queueTime);
      oprot.writeI64(struct.responseSize);
      oprot.writeString(struct.clientAddress);
      oprot.writeString(struct.serverClass);
      oprot.writeString(struct.methodName);
      oprot.writeString(struct.callDetails);
      oprot.writeString(struct.param);
      oprot.writeString(struct.userName);
      oprot.writeI32(struct.multiGetsCount);
      oprot.writeI32(struct.multiMutationsCount);
      oprot.writeI32(struct.multiServiceCalls);
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetRegionName()) {
        optionals.set(0);
      }
      oprot.writeBitSet(optionals, 1);
      if (struct.isSetRegionName()) {
        oprot.writeString(struct.regionName);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, TOnlineLogRecord struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      struct.startTime = iprot.readI64();
      struct.setStartTimeIsSet(true);
      struct.processingTime = iprot.readI32();
      struct.setProcessingTimeIsSet(true);
      struct.queueTime = iprot.readI32();
      struct.setQueueTimeIsSet(true);
      struct.responseSize = iprot.readI64();
      struct.setResponseSizeIsSet(true);
      struct.clientAddress = iprot.readString();
      struct.setClientAddressIsSet(true);
      struct.serverClass = iprot.readString();
      struct.setServerClassIsSet(true);
      struct.methodName = iprot.readString();
      struct.setMethodNameIsSet(true);
      struct.callDetails = iprot.readString();
      struct.setCallDetailsIsSet(true);
      struct.param = iprot.readString();
      struct.setParamIsSet(true);
      struct.userName = iprot.readString();
      struct.setUserNameIsSet(true);
      struct.multiGetsCount = iprot.readI32();
      struct.setMultiGetsCountIsSet(true);
      struct.multiMutationsCount = iprot.readI32();
      struct.setMultiMutationsCountIsSet(true);
      struct.multiServiceCalls = iprot.readI32();
      struct.setMultiServiceCallsIsSet(true);
      java.util.BitSet incoming = iprot.readBitSet(1);
      if (incoming.get(0)) {
        struct.regionName = iprot.readString();
        struct.setRegionNameIsSet(true);
      }
    }
  }

  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
  }
}

