/* ------------------ TESTES ------------------ */
  public static void main(String[] args) {
    System.out.println("->Teste da classe FachadaDB");
    List ticos = new ArrayList();
    Object tico;
    List<String> nomeFiltros = new ArrayList<String>();
    List<String> valorFiltros = new ArrayList<String>();
    List<String> ordenacoes = new ArrayList<String>();
    List<String> indexes = new ArrayList<String>();
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    List datas = new ArrayList();
    String sigla = "VALE5";
    nomeFiltros.add("sigla");
    valorFiltros.add(sigla);
    ordenacoes.add("data");
    indexes.add("sigla");
    indexes.add("data");
    HashMap<Integer, Object> ticosHash = new HashMap();
    int[] posicoesA = {1, 2, 4};
    int[] posicoesB = {1, 2, 3, 4};

    // Inicializando BD
    System.out.println("-> Inicializando BD");
    FachadaBD instancia = FachadaBD.getInstancia();

    // instancia.inicializarBD(Configuracao.getArquivoDb4o() + sigla,
    // indexes, Object.class);

    // Pesquisar Ordenado
    // List ticks = FachadaDB.pesquisarOrdenado(Tick.class, "data",
    // FachadaDB.ORDENACAO_DECRESCENTE);
    // for (int i = 0; i < ticks.size(); i++) {
    // System.out.println("=-=->" + ticks.get(i));
    // }

    // Pesquisar entre valores
    // String nomeAtributoComparado = "data";
    // Comparator comparadorAtributo = ComparadorTick.data;
    // Calendar calendario1 = Calendar.getInstance();
    // Util.zerarHoraCalendar(calendario1);
    // calendario1.set(2008, Calendar.JUNE, 2);
    // Date valorInicial = calendario1.getTime();
    // Calendar calendario2 = Calendar.getInstance();
    // Util.zerarHoraCalendar(calendario2);
    // calendario2.set(2008, Calendar.JUNE, 13);
    // Date valorFinal = calendario2.getTime();
    // List valores = pesquisarEntreValores(pesquisar(Tick.class, "sigla",
    // "VALE5"), nomeAtributoComparado,
    // comparadorAtributo, valorInicial, valorFinal);
    // for (int i = 0; i < valores.size(); i++) {
    // System.out.println("=-=->" + valores.get(i));
    // }

    // // Pesquisando valores distintos de um atributo
    // List valoresDistintos = pesquisarValoresDistintos(Tick.class,
    // "minimo");
    // for (int i = 0; i < valoresDistintos.size(); i++) {
    // System.out.println(valoresDistintos.get(i));
    // }

    // // Recuperando por 1 campo/valor (1x1)
    // System.out.println("-> Recuperando por 1 campo/valor (1x1):");
    // ticos = pesquisar(Object.class, "data", ORDENACAO_CRESCENTE, "sigla",
    // sigla);
    // //
    // Util.gravarListaEmArquivo(ticos,"C:\\temp\\monitormercado\\bd\\"+sigla+"-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }
    // System.out.println("size: " + ticos.size());

    // // Recuperando por N valores de um campo (1xN)
    // System.out.println("-> Recuperando por N valores de um campo (1xN):");
    // datas.add((Date) formatter.parse("2009-02-10"));
    // datas.add((Date) formatter.parse("2009-02-09"));
    // ticos = pesquisar(Object.class, "data", ORDENACAO_DECRESCENTE,
    // "data",
    // datas);
    // //
    // Util.gravarListaEmArquivo(ticos,"C:\\temp\\monitormercado\\bd\\"+sigla+"-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }

    // // Recuperando por N campos e respectivos valores (NxN)
    // System.out.println("-> Recuperando por N campos e respectivos valores (NxN):");
    // List<String> nomesCampos = new ArrayList<String>();
    // List valoresCampos = new ArrayList();
    // nomesCampos.add("sigla");
    // nomesCampos.add("data");
    // valoresCampos.add(sigla);
    // valoresCampos.add((Date) formatter.parse("2009-02-06"));
    // ticos = pesquisar(Object.class, "data", ORDENACAO_DECRESCENTE,
    // nomesCampos,
    // valoresCampos, JUNCAO_AND);
    // //
    // Util.gravarListaEmArquivo(ticos,"C:\\temp\\monitormercado\\bd\\"+sigla+"-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }

    // // Recuperando posição
    // System.out.println("-> Recuperando posição:");
    // tico = pesquisarPosicao(Object.class, "data", ORDENACAO_DECRESCENTE,
    // "sigla",
    // sigla, 1);
    // System.out.println(tico);

    // // Recuperando classe
    // System.out.println("-> Recuperando todos os objetos da classe:");
    // ticos = pesquisar(Object.class, "data", ORDENACAO_DECRESCENTE);
    // Util.gravarListaEmArquivo(ticos, "C:\\temp\\monitormercado\\bd\\" +
    // sigla + "-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }

    // // Deletando objeto(s)
    // System.out.println("-> Deletando objeto(s) recuperado(s) por 1 campo/valor (1x1):");
    // apagar(Object.class, "data", (Date) formatter.parse("2009-02-11"));

    // Deletando objeto(s)
    // System.out.println("-> Deletando objeto(s) recuperado(s) por N valores de um campo (1xN):");
    // datas.add((Date) formatter.parse("2009-02-10"));
    // datas.add((Date) formatter.parse("2009-02-09"));
    // apagar(Object.class, "data", datas);

    // // Deletando objeto(s)
    // System.out.println("-> Deletando objeto(s) recuperado(s) por N campos e respectivos valores
    // (NxN):");
    // List<String> nomesCampos = new ArrayList<String>();
    // List valoresCampos = new ArrayList();
    // nomesCampos.add("sigla");
    // nomesCampos.add("data");
    // valoresCampos.add(sigla);
    // valoresCampos.add((Date) formatter.parse("2009-02-06"));
    // apagar(Object.class, nomesCampos, valoresCampos, JUNCAO_AND);

    // // Atualizando por 1 campo/valor (1x1)
    // System.out.println("-> Atualizando por 1 campo/valor (1x1):");
    // ticos = pesquisar(Object.class, "data", ORDENACAO_DECRESCENTE,
    // "data", (Date)
    // formatter.parse("2009-02-05")); //
    // Util.gravarListaEmArquivo(ticos,"C:\\temp\\monitormercado\\bd\\"+sigla+"-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // Tick tick = (Tick) ticos.get(i);
    // System.out.println("Antes: " + tick);
    // tick.setAbertura(10.01);
    // armazenar(tick);
    // }
    // //ticos = pesquisar(Object.class, "data", ORDENACAO_DECRESCENTE,
    // "data",
    // (Date) formatter.parse("2009-02-05"));
    // Util.gravarListaEmArquivo(ticos,"C:\\temp\\monitormercado\\bd\\"+sigla+"-BD.csv");
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println("Depois: " + ticos.get(i));
    // }

    // Atualizando por 1 campo/valor (1x1)
    // System.out.println("-> Atualizando por 1 campo/valor (1x1):");
    // Tick tick = (Tick) pesquisarPosicao(Object.class, "data",
    // ORDENACAO_DECRESCENTE, "sigla", sigla, 0);
    // System.out.println(tick);
    // tick.setAbertura(10.01);
    // armazenar(tick);
    // tick = (Tick) pesquisarPosicao(Object.class, "data",
    // ORDENACAO_DECRESCENTE,
    // "sigla", sigla, 0);
    // System.out.println(tick);
    // ticos = pesquisar(Object.class, "data", ORDENACAO_CRESCENTE);
    // Calendar ca1 = Calendar.getInstance();
    // Calendar ca2 = Calendar.getInstance();
    // ca1.setTime(((Tick) ticos.get(0)).getData());
    // ca2.setTime(((Tick) ticos.get(ticos.size() - 1)).getData());
    // Util.diasEntreDatas(ca1, ca2);
    // ticos = pesquisar(Object.class, "data", ORDENACAO_CRESCENTE);
    // Util.diasEntreDatas(((Tick) ticos.get(0)).getData(), ((Tick)
    // ticos.get(ticos.size() - 1)).getData());

    // Recuperando posições
    // System.out.println("-> Recuperando posições 1, 2 e 4:");
    // ticosHash = pesquisarPosicoes(Object.class, "data",
    // ORDENACAO_CRESCENTE,
    // "sigla", sigla, posicoesA);
    // for (int i = 0; i < posicoesA.length; i++) {
    // System.out.println(posicoesA[i] + "|" + ticosHash.get(posicoesA[i]));
    // }
    // System.out.println("-> Recuperando posições 1, 2, 3 e 4:");
    // ticosHash = pesquisarPosicoes(Object.class, "data",
    // ORDENACAO_CRESCENTE,
    // "sigla", sigla, posicoesB);
    // for (int i = 0; i < posicoesB.length; i++) {
    // System.out.println(posicoesB[i] + "|" + ticosHash.get(posicoesB[i]));
    // }
    // System.out.println("-> Recuperando posicoes e N, N-1, N-2 e N-3:");
    // ticosHash = pesquisarPosicoes(Object.class, "data",
    // ORDENACAO_DECRESCENTE,
    // "sigla", sigla, posicoesB);
    // for (int i = 0; i < posicoesB.length; i++) {
    // System.out.println(posicoesB[i] + "|" + ticosHash.get(posicoesB[i]));
    // }

    // ticosHash = pesquisarPosicoes(Object.class, "data",
    // ORDENACAO_CRESCENTE,
    // "sigla", sigla, posicoesB);
    // for (int i = 0; i < posicoesB.length; i++) {
    // ticos.add(ticosHash.get(posicoesB[i])); //
    // System.out.println(posicoesB[i] + "|" + ticosHash.get(posicoesB[i]));
    // }
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }
    // System.out.println("-> Ordenando lista por atributo:");
    // List<Tick> ticks = new ArrayList<Tick>();
    // for (int i = 0; i < ticos.size(); i++) {
    // ticks.add((Tick) ticos.get(i));
    // }
    // double minimos[] = new double[ticks.size()];
    // Util.ordenarTicks(ticks, ComparadorTick.volume);
    // for (int i = 0; i < ticks.size(); i++) {
    // minimos[i] = ticks.get(i).getMinimo(); //
    // System.out.println(ticks.get(i));
    // System.out.println(minimos[i] + " | " + ticks.get(i));
    // }

    // Calendar calendario = Calendar.getInstance();
    // Util.zerarHoraCalendar(calendario);
    // calendario.set(2009, Calendar.JANUARY, 5);
    // ticos = pesquisar(Object.class, "data", ORDENACAO_CRESCENTE, "data",
    // calendario.getTime());
    // System.out.println(ticos.get(0));
    // Tick tico2 = (Tick) ticos.get(0);
    // Tick tico3 = new Tick(tico2.getSigla(), tico2.getData(),
    // tico2.getAbertura(), tico2.getMinimo(), tico2.getMaximo(),
    // tico2.getFechamento(), tico2.getVolume());
    // FachadaDB.armazenar(tico3);

    // Calendar calendario = Calendar.getInstance();
    // Util.zerarHoraCalendar(calendario);
    // calendario.set(2009, Calendar.JANUARY, 5);
    // ticos = pesquisarOrdenado(Object.class, "minimo", 28, "data",
    // ORDENACAO_DECRESCENTE);
    // for (int i = 0; i < ticos.size(); i++) {
    // System.out.println(ticos.get(i));
    // }

    // Recuperar os ticks
    // instancia.fecharBD();
    // instancia.inicializarBD(Configuracao.getArquivoDb4o() + sigla,
    // Tick.getIndexacao(), Tick.class);
    UtilIO.gravarListaEmArquivo(
        instancia.pesquisarOrdenado(
            Tick.class, "sigla", "VALE5", "data", FachadaBD.ORDENACAO_CRESCENTE),
        Configuracao.getDiretorioTeste() + "TICKS.txt");

    // Recupera as EMs com as periodiciadades
    // instancia.fecharBD();
    // instancia.inicializarBD(Configuracao.getArquivoDb4o() + sigla,
    // Indicador.getIndexacao(), Indicador.class);
    List periodicidades =
        Arrays.asList(Indicador.PERIODICIDADE_DIARIA, Indicador.PERIODICIDADE_SEMANAL);
    List numerosAmostras = Arrays.asList(5, 9, 12, 21, 26);
    // EMAs dos ticks
    for (int i = 0; i < periodicidades.size(); i++) {
      for (int j = 0; j < numerosAmostras.size(); j++) {
        UtilIO.gravarListaEmArquivo(
            instancia.pesquisarOrdenado(
                EMA.class,
                Arrays.asList("periodicidade", "numeroDeAmostras", "baseDeCalculo", "siglaAcao"),
                Arrays.asList(
                    periodicidades.get(i),
                    numerosAmostras.get(j),
                    IFonteEMA.TICK_FECHAMENTO,
                    "TCSL4"),
                FachadaBD.JUNCAO_AND,
                "data",
                FachadaBD.ORDENACAO_CRESCENTE),
            Configuracao.getDiretorioTeste()
                + "EMA-"
                + Indicador.getPeriodicidadeToString((Integer) periodicidades.get(i))
                + "-"
                + numerosAmostras.get(j)
                + ".txt");
      }
    }
    // EMAs dos MACDs
    UtilIO.gravarListaEmArquivo(
        instancia.pesquisarOrdenado(
            EMA.class,
            Arrays.asList("periodicidade", "numeroDeAmostras", "baseDeCalculo", "siglaAcao"),
            Arrays.asList(Indicador.PERIODICIDADE_SEMANAL, 9, IFonteEMA.LINHARAPIDA_MACD, "TCSL4"),
            FachadaBD.JUNCAO_AND,
            "data",
            FachadaBD.ORDENACAO_CRESCENTE),
        Configuracao.getDiretorioTeste() + "EMA-LINHARAPIDA.txt");

    // Fechando BD
    System.out.println("->Fechando BD");
    instancia.fecharBD();
  }
  /**
   * Inicializa (abre ou cria) o banco de dados, obtendo lock de escrita.
   *
   * @param path endereço de disco onde o banco de dados será (está) armazenado
   * @param indexes atributos pelos quais os objetos armazenados estarão indexados
   * @param classe tipo do objeto que será armazenado no banco de dados
   */
  private void inicializarBD() {
    String path = Configuracao.getArquivoDb4o() + NOMEBD;

    Configuration configuracao = Db4o.newConfiguration();

    Map<Class, List<String>> mapa = new HashMap<Class, List<String>>();
    mapa.put(Tick.class, Tick.getIndexacao());
    mapa.put(Indicador.class, Indicador.getIndexacao());
    mapa.put(EMA.class, EMA.getIndexacao());

    for (Class<Object> classe : mapa.keySet()) {
      for (String indice : mapa.get(classe)) {
        configuracao.objectClass(classe).objectField(indice).indexed(true);
      }
    }

    /*
     * configura o nível de ativação para 2 Níveis maiores causam perda de
     * performance
     */
    configuracao.activationDepth(2);
    /*
     * configura o nível de atualizacao para 1 em um update atualiza somente
     * o primeiro nível
     *
     * - necessidades maiores, configurar pontualmente por classe:
     * configuracao.objectClass(classe).updateDepth(arg0);
     */

    // configuracao.messageLevel(3);
    configuracao.updateDepth(1);
    configuracao.callbacks(false);
    configuracao.blockSize(8);
    configuracao.optimizeNativeQueries(true);
    configuracao.queries().evaluationMode(QueryEvaluationMode.SNAPSHOT);

    // configuracao.freespace().useRamSystem();

    /*
     * try { Defragment.defrag(path+ ".db4o"); } catch (IOException e) { //
     * e.printStackTrace(); }
     */

    /*
     * Descomentar para ativar o verbose do diagnose.
     */
    /*configuracao.diagnostic().addListener(new DiagnosticListener() {

    	@Override
    	public void onDiagnostic(Diagnostic arg0) {
    		System.out.println(arg0.toString());

    	}
    });*/

    bd = Db4o.openFile(configuracao, path + ".db4o");

    /*
     * Descomentar para ativar o verbose do otimizador
     */
    // addNativeQueryListener();
  }