/// <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; }
/// <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; }