//------------------------------------------------------------------------------
// <auto-generated />
//
// This file was automatically generated by SWIG (https://www.swig.org).
// Version 4.3.0
//
// Do not make changes to this file unless you know what you are doing - modify
// the SWIG interface file instead.
//------------------------------------------------------------------------------

namespace Xapian {

public class Query : global::System.IDisposable {
  private global::System.Runtime.InteropServices.HandleRef swigCPtr;
  protected bool swigCMemOwn;

  internal Query(global::System.IntPtr cPtr, bool cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = new global::System.Runtime.InteropServices.HandleRef(this, cPtr);
  }

  internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Query obj) {
    return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
  }

  internal static global::System.Runtime.InteropServices.HandleRef swigRelease(Query obj) {
    if (obj != null) {
      if (!obj.swigCMemOwn)
        throw new global::System.ApplicationException("Cannot release ownership as memory is not owned");
      global::System.Runtime.InteropServices.HandleRef ptr = obj.swigCPtr;
      obj.swigCMemOwn = false;
      obj.Dispose();
      return ptr;
    } else {
      return new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
    }
  }

  ~Query() {
    Dispose(false);
  }

  public void Dispose() {
    Dispose(true);
    global::System.GC.SuppressFinalize(this);
  }

  protected virtual void Dispose(bool disposing) {
    lock(this) {
      if (swigCPtr.Handle != global::System.IntPtr.Zero) {
        if (swigCMemOwn) {
          swigCMemOwn = false;
          XapianPINVOKE.delete_Query(swigCPtr);
        }
        swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero);
      }
    }
  }

  public static readonly Query MatchAll = new Query("");
  public static readonly Query MatchNothing = new Query();

  public Query() : this(XapianPINVOKE.new_Query__SWIG_0(), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(string term, uint wqf, uint pos) : this(XapianPINVOKE.new_Query__SWIG_1(term, wqf, pos), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(string term, uint wqf) : this(XapianPINVOKE.new_Query__SWIG_2(term, wqf), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(string term) : this(XapianPINVOKE.new_Query__SWIG_3(term), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(PostingSource source) : this(XapianPINVOKE.new_Query__SWIG_4(PostingSource.getCPtr(source)), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(double factor, Query subquery) : this(XapianPINVOKE.new_Query__SWIG_5(factor, Query.getCPtr(subquery)), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, Query subquery, double factor) : this(XapianPINVOKE.new_Query__SWIG_6((int)op_, Query.getCPtr(subquery), factor), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, Query a, Query b) : this(XapianPINVOKE.new_Query__SWIG_7((int)op_, Query.getCPtr(a), Query.getCPtr(b)), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, string a, string b) : this(XapianPINVOKE.new_Query__SWIG_8((int)op_, a, b), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, uint slot, string range_limit) : this(XapianPINVOKE.new_Query__SWIG_9((int)op_, slot, range_limit), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, uint slot, string range_lower, string range_upper) : this(XapianPINVOKE.new_Query__SWIG_10((int)op_, slot, range_lower, range_upper), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, string pattern, uint max_expansion, int max_type, Query.op combiner) : this(XapianPINVOKE.new_Query__SWIG_11((int)op_, pattern, max_expansion, max_type, (int)combiner), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, string pattern, uint max_expansion, int max_type) : this(XapianPINVOKE.new_Query__SWIG_12((int)op_, pattern, max_expansion, max_type), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, string pattern, uint max_expansion) : this(XapianPINVOKE.new_Query__SWIG_13((int)op_, pattern, max_expansion), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public Query(Query.op op_, string pattern) : this(XapianPINVOKE.new_Query__SWIG_14((int)op_, pattern), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public TermIterator GetTermsBegin() {
    TermIterator ret = new TermIterator(XapianPINVOKE.Query_GetTermsBegin(swigCPtr), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public TermIterator GetTermsEnd() {
    TermIterator ret = new TermIterator(XapianPINVOKE.Query_GetTermsEnd(swigCPtr), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public TermIterator GetUniqueTermsBegin() {
    TermIterator ret = new TermIterator(XapianPINVOKE.Query_GetUniqueTermsBegin(swigCPtr), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public TermIterator GetUniqueTermsEnd() {
    TermIterator ret = new TermIterator(XapianPINVOKE.Query_GetUniqueTermsEnd(swigCPtr), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public uint GetLength() {
    uint ret = XapianPINVOKE.Query_GetLength(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public bool Empty() {
    bool ret = XapianPINVOKE.Query_Empty(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public string Serialise() {
    string ret = XapianPINVOKE.Query_Serialise(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static Query Unserialise(string serialised, Registry reg) {
    Query ret = new Query(XapianPINVOKE.Query_Unserialise__SWIG_0(serialised, Registry.getCPtr(reg)), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public static Query Unserialise(string serialised) {
    Query ret = new Query(XapianPINVOKE.Query_Unserialise__SWIG_1(serialised), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public Query.op GetType() {
    Query.op ret = (Query.op)XapianPINVOKE.Query_GetType(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public uint GetNumSubqueries() {
    uint ret = XapianPINVOKE.Query_GetNumSubqueries(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public Query GetSubquery(uint n) {
    Query ret = new Query(XapianPINVOKE.Query_GetSubquery(swigCPtr, n), true);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public string GetDescription() {
    string ret = XapianPINVOKE.Query_GetDescription(swigCPtr);
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
    return ret;
  }

  public Query(Query.op op_) : this(XapianPINVOKE.new_Query__SWIG_15((int)op_), true) {
    if (XapianPINVOKE.SWIGPendingException.Pending) throw XapianPINVOKE.SWIGPendingException.Retrieve();
  }

  public enum op {
    OP_AND = 0,
    OP_OR = 1,
    OP_AND_NOT = 2,
    OP_XOR = 3,
    OP_AND_MAYBE = 4,
    OP_FILTER = 5,
    OP_NEAR = 6,
    OP_PHRASE = 7,
    OP_VALUE_RANGE = 8,
    OP_SCALE_WEIGHT = 9,
    OP_ELITE_SET = 10,
    OP_VALUE_GE = 11,
    OP_VALUE_LE = 12,
    OP_SYNONYM = 13,
    OP_MAX = 14,
    OP_WILDCARD = 15,
    OP_INVALID = 99
  }

  public static readonly int WILDCARD_LIMIT_ERROR = XapianPINVOKE.Query_WILDCARD_LIMIT_ERROR_get();
  public static readonly int WILDCARD_LIMIT_FIRST = XapianPINVOKE.Query_WILDCARD_LIMIT_FIRST_get();
  public static readonly int WILDCARD_LIMIT_MOST_FREQUENT = XapianPINVOKE.Query_WILDCARD_LIMIT_MOST_FREQUENT_get();

}

}
