
/**********************************************************//**
 **
 ** @file index/eval.h
 **
 ** Copyright (C) 2010  Xpace, LLC.  All rights reserved
 **
 ** www.xpace.net
 **
 **************************************************************/

#if !defined(XPACE_EVAL_H)
#define XPACE_EVAL_H

#include "index/index.h"
#include "index/indexlist.h"
#include "index/reflist/reflist.h"

#include "data/store/tablecursor.h"
#include "result/result_c.h"

namespace Xpace
{
  #ifdef QDOM_H
  XPACE_EXPORT void showQueryTree
    (QDomNode node,
     uint depth = 0);
  #endif

  XPACE_EXPORT bool searchTable
    (const Index& index,
     const TableCursor& tc,
     const String& query,
     TableCursor::Sink* forEach);

  XPACE_EXPORT bool searchTable
    (const IndexList& indexList,
     const TableCursor& tc,
     const String& query,
     TableCursor::Sink* forEach);

  XPACE_EXPORT Xpace_Table_Result searchTable
    (const Index& index,
     const TableCursor& tc,
     const String& query);

  XPACE_EXPORT Xpace_Table_Result searchTable
    (const IndexList& indexList,
     const TableCursor& table,
     const String& query);

  class XPACE_EXPORT evalCantOpenIndex : public Exception
  {
  public:
    evalCantOpenIndex
      (String name);
  };

  class XPACE_EXPORT evalBadOperator : public Exception
  {
  public:
    evalBadOperator
      (String op);
  };

  class XPACE_EXPORT evalCantRegex : public Exception
  {
  public:
    evalCantRegex
      (String indexName);
  };

  class XPACE_EXPORT evalBadRegex : public Exception
  {
  public:
    evalBadRegex
      (String regex);
  };

  // ==========================================================
  // ==========================================================
  // ==========================================================

  struct EvalInfo
  {
    EvalInfo
      (const String& query, 
       const Xpace::TableCursor& table,
       TableCursor::Sink* act = 0);

    uint64 start;
    uint64 count;
    std::vector<uint> columns;

  private:
    #ifdef QDOM_H
    void init
      (QDomNode& tree, 
       const Xpace::TableCursor& table,
       TableCursor::Sink* act);
    #endif
  };
}

#endif

