/**
 * Autogenerated by Thrift Compiler (0.14.1)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Thrift;
using Thrift.Collections;

using Thrift.Protocol;
using Thrift.Protocol.Entities;
using Thrift.Protocol.Utilities;
using Thrift.Transport;
using Thrift.Transport.Client;
using Thrift.Transport.Server;
using Thrift.Processor;


#pragma warning disable IDE0079  // remove unnecessary pragmas
#pragma warning disable IDE1006  // parts of the code use IDL spelling


public partial class TSAggregationQueryReq : TBase
{
  private long _startTime;
  private long _endTime;
  private long _interval;
  private long _slidingStep;
  private int _fetchSize;
  private long _timeout;
  private bool _legalPathNodes;

  public long SessionId { get; set; }

  public long StatementId { get; set; }

  public List<string> Paths { get; set; }

  public List<TAggregationType> Aggregations { get; set; }

  public long StartTime
  {
    get
    {
      return _startTime;
    }
    set
    {
      __isset.startTime = true;
      this._startTime = value;
    }
  }

  public long EndTime
  {
    get
    {
      return _endTime;
    }
    set
    {
      __isset.endTime = true;
      this._endTime = value;
    }
  }

  public long Interval
  {
    get
    {
      return _interval;
    }
    set
    {
      __isset.interval = true;
      this._interval = value;
    }
  }

  public long SlidingStep
  {
    get
    {
      return _slidingStep;
    }
    set
    {
      __isset.slidingStep = true;
      this._slidingStep = value;
    }
  }

  public int FetchSize
  {
    get
    {
      return _fetchSize;
    }
    set
    {
      __isset.fetchSize = true;
      this._fetchSize = value;
    }
  }

  public long Timeout
  {
    get
    {
      return _timeout;
    }
    set
    {
      __isset.timeout = true;
      this._timeout = value;
    }
  }

  public bool LegalPathNodes
  {
    get
    {
      return _legalPathNodes;
    }
    set
    {
      __isset.legalPathNodes = true;
      this._legalPathNodes = value;
    }
  }


  public Isset __isset;
  public struct Isset
  {
    public bool startTime;
    public bool endTime;
    public bool interval;
    public bool slidingStep;
    public bool fetchSize;
    public bool timeout;
    public bool legalPathNodes;
  }

  public TSAggregationQueryReq()
  {
  }

  public TSAggregationQueryReq(long sessionId, long statementId, List<string> paths, List<TAggregationType> aggregations) : this()
  {
    this.SessionId = sessionId;
    this.StatementId = statementId;
    this.Paths = paths;
    this.Aggregations = aggregations;
  }

  public async global::System.Threading.Tasks.Task ReadAsync(TProtocol iprot, CancellationToken cancellationToken)
  {
    iprot.IncrementRecursionDepth();
    try
    {
      bool isset_sessionId = false;
      bool isset_statementId = false;
      bool isset_paths = false;
      bool isset_aggregations = false;
      TField field;
      await iprot.ReadStructBeginAsync(cancellationToken);
      while (true)
      {
        field = await iprot.ReadFieldBeginAsync(cancellationToken);
        if (field.Type == TType.Stop)
        {
          break;
        }

        switch (field.ID)
        {
          case 1:
            if (field.Type == TType.I64)
            {
              SessionId = await iprot.ReadI64Async(cancellationToken);
              isset_sessionId = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 2:
            if (field.Type == TType.I64)
            {
              StatementId = await iprot.ReadI64Async(cancellationToken);
              isset_statementId = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 3:
            if (field.Type == TType.List)
            {
              {
                TList _list325 = await iprot.ReadListBeginAsync(cancellationToken);
                Paths = new List<string>(_list325.Count);
                for(int _i326 = 0; _i326 < _list325.Count; ++_i326)
                {
                  string _elem327;
                  _elem327 = await iprot.ReadStringAsync(cancellationToken);
                  Paths.Add(_elem327);
                }
                await iprot.ReadListEndAsync(cancellationToken);
              }
              isset_paths = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 4:
            if (field.Type == TType.List)
            {
              {
                TList _list328 = await iprot.ReadListBeginAsync(cancellationToken);
                Aggregations = new List<TAggregationType>(_list328.Count);
                for(int _i329 = 0; _i329 < _list328.Count; ++_i329)
                {
                  TAggregationType _elem330;
                  _elem330 = (TAggregationType)await iprot.ReadI32Async(cancellationToken);
                  Aggregations.Add(_elem330);
                }
                await iprot.ReadListEndAsync(cancellationToken);
              }
              isset_aggregations = true;
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 5:
            if (field.Type == TType.I64)
            {
              StartTime = await iprot.ReadI64Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 6:
            if (field.Type == TType.I64)
            {
              EndTime = await iprot.ReadI64Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 7:
            if (field.Type == TType.I64)
            {
              Interval = await iprot.ReadI64Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 8:
            if (field.Type == TType.I64)
            {
              SlidingStep = await iprot.ReadI64Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 9:
            if (field.Type == TType.I32)
            {
              FetchSize = await iprot.ReadI32Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 10:
            if (field.Type == TType.I64)
            {
              Timeout = await iprot.ReadI64Async(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          case 11:
            if (field.Type == TType.Bool)
            {
              LegalPathNodes = await iprot.ReadBoolAsync(cancellationToken);
            }
            else
            {
              await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            }
            break;
          default: 
            await TProtocolUtil.SkipAsync(iprot, field.Type, cancellationToken);
            break;
        }

        await iprot.ReadFieldEndAsync(cancellationToken);
      }

      await iprot.ReadStructEndAsync(cancellationToken);
      if (!isset_sessionId)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_statementId)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_paths)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
      if (!isset_aggregations)
      {
        throw new TProtocolException(TProtocolException.INVALID_DATA);
      }
    }
    finally
    {
      iprot.DecrementRecursionDepth();
    }
  }

  public async global::System.Threading.Tasks.Task WriteAsync(TProtocol oprot, CancellationToken cancellationToken)
  {
    oprot.IncrementRecursionDepth();
    try
    {
      var struc = new TStruct("TSAggregationQueryReq");
      await oprot.WriteStructBeginAsync(struc, cancellationToken);
      var field = new TField();
      field.Name = "sessionId";
      field.Type = TType.I64;
      field.ID = 1;
      await oprot.WriteFieldBeginAsync(field, cancellationToken);
      await oprot.WriteI64Async(SessionId, cancellationToken);
      await oprot.WriteFieldEndAsync(cancellationToken);
      field.Name = "statementId";
      field.Type = TType.I64;
      field.ID = 2;
      await oprot.WriteFieldBeginAsync(field, cancellationToken);
      await oprot.WriteI64Async(StatementId, cancellationToken);
      await oprot.WriteFieldEndAsync(cancellationToken);
      if((Paths != null))
      {
        field.Name = "paths";
        field.Type = TType.List;
        field.ID = 3;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        {
          await oprot.WriteListBeginAsync(new TList(TType.String, Paths.Count), cancellationToken);
          foreach (string _iter331 in Paths)
          {
            await oprot.WriteStringAsync(_iter331, cancellationToken);
          }
          await oprot.WriteListEndAsync(cancellationToken);
        }
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if((Aggregations != null))
      {
        field.Name = "aggregations";
        field.Type = TType.List;
        field.ID = 4;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        {
          await oprot.WriteListBeginAsync(new TList(TType.I32, Aggregations.Count), cancellationToken);
          foreach (TAggregationType _iter332 in Aggregations)
          {
            await oprot.WriteI32Async((int)_iter332, cancellationToken);
          }
          await oprot.WriteListEndAsync(cancellationToken);
        }
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.startTime)
      {
        field.Name = "startTime";
        field.Type = TType.I64;
        field.ID = 5;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI64Async(StartTime, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.endTime)
      {
        field.Name = "endTime";
        field.Type = TType.I64;
        field.ID = 6;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI64Async(EndTime, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.interval)
      {
        field.Name = "interval";
        field.Type = TType.I64;
        field.ID = 7;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI64Async(Interval, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.slidingStep)
      {
        field.Name = "slidingStep";
        field.Type = TType.I64;
        field.ID = 8;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI64Async(SlidingStep, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.fetchSize)
      {
        field.Name = "fetchSize";
        field.Type = TType.I32;
        field.ID = 9;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI32Async(FetchSize, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.timeout)
      {
        field.Name = "timeout";
        field.Type = TType.I64;
        field.ID = 10;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteI64Async(Timeout, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      if(__isset.legalPathNodes)
      {
        field.Name = "legalPathNodes";
        field.Type = TType.Bool;
        field.ID = 11;
        await oprot.WriteFieldBeginAsync(field, cancellationToken);
        await oprot.WriteBoolAsync(LegalPathNodes, cancellationToken);
        await oprot.WriteFieldEndAsync(cancellationToken);
      }
      await oprot.WriteFieldStopAsync(cancellationToken);
      await oprot.WriteStructEndAsync(cancellationToken);
    }
    finally
    {
      oprot.DecrementRecursionDepth();
    }
  }

  public override bool Equals(object that)
  {
    if (!(that is TSAggregationQueryReq other)) return false;
    if (ReferenceEquals(this, other)) return true;
    return System.Object.Equals(SessionId, other.SessionId)
      && System.Object.Equals(StatementId, other.StatementId)
      && TCollections.Equals(Paths, other.Paths)
      && TCollections.Equals(Aggregations, other.Aggregations)
      && ((__isset.startTime == other.__isset.startTime) && ((!__isset.startTime) || (System.Object.Equals(StartTime, other.StartTime))))
      && ((__isset.endTime == other.__isset.endTime) && ((!__isset.endTime) || (System.Object.Equals(EndTime, other.EndTime))))
      && ((__isset.interval == other.__isset.interval) && ((!__isset.interval) || (System.Object.Equals(Interval, other.Interval))))
      && ((__isset.slidingStep == other.__isset.slidingStep) && ((!__isset.slidingStep) || (System.Object.Equals(SlidingStep, other.SlidingStep))))
      && ((__isset.fetchSize == other.__isset.fetchSize) && ((!__isset.fetchSize) || (System.Object.Equals(FetchSize, other.FetchSize))))
      && ((__isset.timeout == other.__isset.timeout) && ((!__isset.timeout) || (System.Object.Equals(Timeout, other.Timeout))))
      && ((__isset.legalPathNodes == other.__isset.legalPathNodes) && ((!__isset.legalPathNodes) || (System.Object.Equals(LegalPathNodes, other.LegalPathNodes))));
  }

  public override int GetHashCode() {
    int hashcode = 157;
    unchecked {
      hashcode = (hashcode * 397) + SessionId.GetHashCode();
      hashcode = (hashcode * 397) + StatementId.GetHashCode();
      if((Paths != null))
      {
        hashcode = (hashcode * 397) + TCollections.GetHashCode(Paths);
      }
      if((Aggregations != null))
      {
        hashcode = (hashcode * 397) + TCollections.GetHashCode(Aggregations);
      }
      if(__isset.startTime)
      {
        hashcode = (hashcode * 397) + StartTime.GetHashCode();
      }
      if(__isset.endTime)
      {
        hashcode = (hashcode * 397) + EndTime.GetHashCode();
      }
      if(__isset.interval)
      {
        hashcode = (hashcode * 397) + Interval.GetHashCode();
      }
      if(__isset.slidingStep)
      {
        hashcode = (hashcode * 397) + SlidingStep.GetHashCode();
      }
      if(__isset.fetchSize)
      {
        hashcode = (hashcode * 397) + FetchSize.GetHashCode();
      }
      if(__isset.timeout)
      {
        hashcode = (hashcode * 397) + Timeout.GetHashCode();
      }
      if(__isset.legalPathNodes)
      {
        hashcode = (hashcode * 397) + LegalPathNodes.GetHashCode();
      }
    }
    return hashcode;
  }

  public override string ToString()
  {
    var sb = new StringBuilder("TSAggregationQueryReq(");
    sb.Append(", SessionId: ");
    SessionId.ToString(sb);
    sb.Append(", StatementId: ");
    StatementId.ToString(sb);
    if((Paths != null))
    {
      sb.Append(", Paths: ");
      Paths.ToString(sb);
    }
    if((Aggregations != null))
    {
      sb.Append(", Aggregations: ");
      Aggregations.ToString(sb);
    }
    if(__isset.startTime)
    {
      sb.Append(", StartTime: ");
      StartTime.ToString(sb);
    }
    if(__isset.endTime)
    {
      sb.Append(", EndTime: ");
      EndTime.ToString(sb);
    }
    if(__isset.interval)
    {
      sb.Append(", Interval: ");
      Interval.ToString(sb);
    }
    if(__isset.slidingStep)
    {
      sb.Append(", SlidingStep: ");
      SlidingStep.ToString(sb);
    }
    if(__isset.fetchSize)
    {
      sb.Append(", FetchSize: ");
      FetchSize.ToString(sb);
    }
    if(__isset.timeout)
    {
      sb.Append(", Timeout: ");
      Timeout.ToString(sb);
    }
    if(__isset.legalPathNodes)
    {
      sb.Append(", LegalPathNodes: ");
      LegalPathNodes.ToString(sb);
    }
    sb.Append(')');
    return sb.ToString();
  }
}

