Example #1
0
        /// <summary>
        /// método responsável por retornar o resultado do SELECT
        /// </summary>
        /// <returns>TabelaSelect formatada para apresentar no Form1</returns>
        public TabelaSelect run()
        {
            TabelaSelect tabelaSelect = null;
            //caso e select seja select tabela.* from tabela não será necessário
            //aplicar join pois tratará de apenas uma tabela
            //tratamento apenas para where
            if (asterisco)
            {
                string arqTabela = mem.getPath() + "\\" + tabelas[0].getNome() + ".dat";
                if (where != null)
                {
                    if (where.ListaFiltro == null || where.ListaFiltro.Count == 0)
                    {
                        //se não tiver filtro retorna tudo
                        //tabelaSelect = new Binarios(arqTabela).returnDados(tabelas[0]);
                        tabelaSelect = returnDados(tabelas[0]);
                    }
                    //traz os resultados filtrados por grupos de AND e depois junta com os OR's
                    foreach (List<Filtro> filtrosAND in where.ListaFiltro)
                    {
                        TabelaSelect tabelaFiltro = null;
                        tabelaFiltro = returnDados(filtrosAND,new Dictionary<string, List<string>>(), tabelas[0]);
                        if (tabelaSelect == null) tabelaSelect = tabelaFiltro;
                        else tabelaSelect.uniaoDistinct(tabelaFiltro);
                    }
                }
                else
                {
                    //se nao tiver filtro retorna tudo

                    tabelaSelect = returnDados(tabelas[0]);
                }
                //envia comando para a TabelaSelect ordenar os registros
                if (ordem.Count > 0)
                {
                    tabelaSelect.ordenaRegistros(ordem, ordemAscendente);
                }
                return tabelaSelect;
            }

            //Se não tem asterisco o negócio complica

            //ordena as tabelas por qtdade registros
            tabelas.Sort(delegate (Metadados m1, Metadados m2)
            {
                return m1.getNumeroRegistrosTabela() > m2.getNumeroRegistrosTabela() ? -1 : 1;
            });

            Dictionary<Metadados, Where> filtros = new Dictionary<Metadados, Where>();
            //separa os filtros referentes a cada tabela e, se tiver filtro, joga a tabela no inicio da ordenação
            for (int i = 0; i < tabelas.Count; i++)
            {
                Metadados m = tabelas[i];
                Where filtroE = new Where();
                //separa os filtros
                foreach (List<Filtro> filtrosAND in where.ListaFiltro)
                {
                    List<Filtro> maisFiltro = (filtrosAND.Where(f => f.LValue.StartsWith(m.getNome())).ToList());
                    filtroE.ListaFiltro.Add(maisFiltro);
                }
                //ordena pro inicio
                if (filtroE.ListaFiltro.Count > 0)
                {
                    m = tabelas[i];
                    tabelas.Remove(m);
                    tabelas.Insert(0, m);
                }
                filtros.Add(m, filtroE);
            }
            //seleciona cada tabela separadamente
            while (tabelas.Count > 0)
            {
                Metadados m = tabelas.First();
                TabelaSelect tabelaFiltro = null;
                //traz os resultados filtrados por grupos de AND e depois junta com os OR's
                if (filtros[m].ListaFiltro.Count > 0)
                {
                    foreach (List<Filtro> filtrosAND in where.ListaFiltro)
                    {
                        TabelaSelect tabelaFiltroOR = null;
                        //informa apenas os filtros relacionados com a tabela em questão
                        tabelaFiltroOR = returnDados(filtrosAND,filtros[m].FiltroJoin, m);
                        if (tabelaFiltro == null) tabelaFiltro = tabelaFiltroOR;
                        else tabelaFiltro.uniaoDistinct(tabelaFiltroOR);
                    }
                }
                else
                {
                    tabelaFiltro = returnDados(m);
                }

                tabelas.Remove(m);
                filtros.Remove(m);
                //Adicionando campos de join como filtro.

                foreach (Filtro f in where.ListaJoin)
                {
                    if (f.LValue.StartsWith(m.getNome()))
                    {
                        Metadados outroM = null;
                        foreach (Metadados meta in filtros.Keys)
                        {
                            if (f.RValue.StartsWith(meta.getNome()))
                            {
                                outroM = meta;
                                break;
                            }
                        }
                        //insere os registros de join como filtro para as proximas tabelas
                        if (outroM != null)
                        {
                            List<string> maisFiltro = new List<string>();
                            int colEsq = 0;
                            for (int i = 0; i < tabelaFiltro.Campos.Length; i++)
                            {
                                if (tabelaFiltro.Campos[i].Equals(f.LValue))
                                {
                                    colEsq = i;
                                    break;
                                }
                            }
                            foreach (string[] reg in tabelaFiltro.Registros)
                            {
                                maisFiltro.Add(reg[colEsq]);
                            }
                            maisFiltro.Sort();
                            filtros[outroM].FiltroJoin.Add(f.LValue, maisFiltro);

                            //joga o outroM para ser o proximo a pesquisar
                            tabelas.Remove(outroM);
                            tabelas.Insert(0, outroM);
                        }
                    }
                    if (f.RValue.StartsWith(m.getNome()))
                    {
                        Metadados outroM = null;
                        foreach (Metadados meta in filtros.Keys)
                        {
                            if (f.LValue.StartsWith(meta.getNome()))
                            {
                                outroM = meta;
                                break;
                            }
                        }
                        //insere os registros de join como filtro para as proximas tabelas
                        if (outroM != null)
                        {
                            List<string> maisFiltro = new List<string>();
                            int colDir = 0;
                            for (int i = 0; i < tabelaFiltro.Campos.Length; i++)
                            {
                                if (tabelaFiltro.Campos[i].Equals(f.LValue))
                                {
                                    colDir = i;
                                    break;
                                }
                            }
                            foreach (string[] reg in tabelaFiltro.Registros)
                            {
                                maisFiltro.Add(reg[colDir]);
                            }
                            maisFiltro.Sort();
                            filtros[outroM].FiltroJoin.Add(f.RValue, maisFiltro);

                            //joga o outroM para ser o proximo a pesquisar
                            tabelas.Remove(outroM);
                            tabelas.Insert(0, outroM);
                        }
                    }
                }/**/
                //se tem mais tabelas faz o join
                if (tabelaSelect == null) tabelaSelect = tabelaFiltro;
                else tabelaSelect = tabelaSelect.join(tabelaFiltro, Where.ListaJoin);
            }
            //envia comando para a TabelaSelect ordenar os registros
            if (ordem.Count > 0)
            {
                tabelaSelect.ordenaRegistros(ordem, ordemAscendente);
            }
            return tabelaSelect;
        }
Example #2
0
 /// <summary>
 /// Limpa todos os campos
 /// </summary>
 public void clear()
 {
     tabelas = new List<Metadados>();
     retorno = new Dictionary<string, string>();
     Where = null;
     ordem = new List<string>();
     ordemAscendente = true;
     asterisco = false;
     Etapa = EtapaSemantica.CAMPOS;
 }