
#include "x_at_file.h"
#include "x_at_index.h"
#include "x_at_reclist.h"
#include "x_at_data.h"

void show_record
  (const AT_Database* database,
   const AT_Record* curs)
{
  for (uint f(0); f < database->getFieldCount(); ++f)
  {
	  if (database->getField(f)->isText())
	    printf("%s, ", curs->getField(f));
	  else
	  {
      AT_Num num;
      if (curs->getField(f, 0, &num))
        printf("%I64d, ", num);
	  }
  }
  printf("\n");
}

class doForEach : public AT_Index::directAccess
{
public :
  doForEach
    (bool num,
     uint t) :
      numeric(num),
      total(t),
      cur(0)
  {};
  virtual bool term
    (const AT_Index::Iter& it)
  { 
    byte buf[100];
    int64 n((*it).getTerm(buf, 100));
    if (numeric)
      printf("\n%u/%u: %I64d", cur++, total, n);
    else
      printf("\n%u/%u: %s", cur++, total, buf);
    return (cur < 1000);
  };

  virtual bool rec
    (uint r)
  {
    printf("%u\r", r);
    return true;
  };

private :
  const bool numeric;
  const uint total;
  uint cur;
};

void main
  (int argc,
   char** argv)
{
  /**
  AT_Read_Rand_File dt("\\lager\\trunk\\customers\\nyse\\nyse.xml", AT_File_Type(0));
  AT_Read_Rand_File di("\\taq\\test\\quotes.di", AT_File_Type(0));
  AT_Read_Rand_File dd("\\taq\\test\\quotes.dd", AT_File_Type(0));
  if (!dt || !di || !dd)
    return;
  AT_Database database(&dt, &di, &dd);
  **/

  AT_Database database("\\lager\\trunk\\customers\\nyse\\nyse.xml", "\\taq\\test\\quotes.di", "\\taq\\test\\quotes.dd");
  if (!database)
    return;

  /**
  for (uint r(0); r < 1000000; r += 1000)
  {
    std::auto_ptr<const AT_Record> rec(database.getRecord(r));
    show_record(&database, rec.get());
  }
  **/

  /**
  AT_Read_Rand_File ii("\\taq\\test\\new\\quotes.ii", AT_File_Type(0));
  AT_Read_Rand_File id("\\taq\\test\\new\\quotes.id", AT_File_Type(0));
  if (!ii || !id)
    return;
  AT_Index_List index_list(&ii, &id);
  **/

  AT_Index_List index_list("\\taq\\test\\new\\quotes.ii", "\\taq\\test\\new\\quotes.id");

  /**
  for (uint index_num(0); index_num < index_list.getNumIndexes(); ++index_num)
  {
    printf("\n\nIndex #%u ===================", index_num);
    AT_Index idx(index_list.openIndex(index_num));
    if (!idx)
      continue;
    idx.forEachTerm(idx.begin(), idx.end(), &doForEach(idx.isNumeric(), idx.getTermCount()));
  }
  **/

  // a search
  AT_Index idx(index_list.openIndex(0));
  AT_Record_List rec_list(idx.search("IBM"));
  if (!!rec_list)
    for (AT_Record_List::Iter rec_iter(rec_list.begin()), stop(rec_list.end()); rec_iter < stop; ++rec_iter)
    {
      std::auto_ptr<const AT_Record> rec(database.getRecord(*rec_iter));
      show_record(&database, rec.get());
    }
}
