/// <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); }
public TabelaSelect returnDados(Metadados tabela) { try { Base.getInstance().desalocarBinarios(tabela.getNome()); } catch { } TabelaSelect ts = null; FileStream file = null; BinaryReader br = null; try { string arquivo = mem.getPath() + "\\" + tabela.getNome() + ".dat"; file = new FileStream(arquivo, FileMode.Open); using (br = new BinaryReader(file)) { int count; ts = new TabelaSelect(); Metadados meta = GerenciadorMemoria.getInstance().recuperarMetadados(tabela.getNome()); int colunas = meta.getNomesColunas().Count; ts.Campos = new string[colunas]; for (int i = 0; i < colunas; i++) { ts.Campos[i] = meta.getNome() + "." + meta.getNomesColunas()[i]; } //lê cada registro while (br.BaseStream.Position != br.BaseStream.Length) { string[] registro = new string[colunas]; RegistroTabela r = new RegistroTabela(br.ReadInt64()); count = br.ReadInt32(); //Lê cada dado dentro do registro for (int i = 0; i < count; i++) { string nomeColuna = meta.getNomesColunas()[i]; TipoDado tipo = meta.getDados()[nomeColuna].getTipoDado(); string valor = ""; if (tipo == TipoDado.Inteiro) { byte tamanho = br.ReadByte(); bool isValido = br.ReadBoolean(); int numero = br.ReadInt32(); valor = isValido ? numero + "" : "NULL"; } else { byte tamanho = br.ReadByte(); bool isValido = br.ReadBoolean(); byte[] literal = br.ReadBytes(tamanho); string texto = new System.Text.ASCIIEncoding().GetString(literal); valor = isValido ? texto : "NULL"; } registro[i] = valor; } ts.Registros.Add(registro); if (ts.Registros.Count >= Base.getInstance().qtd_max_registros) { break; } } } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); Console.ReadLine(); } finally { if (br != null) { br.Close(); } if (file != null) { file.Close(); } } return(ts); }