Conj<Registro_tp3> BaseDeDatos::combinarRegistros(string t1, string t2, string campo) const { assert( _nombreATabla.def(t1) && _nombreATabla.def(t2) ); assert( _nombreATabla.obtener(t1).campos().Pertenece(campo) ); assert( _nombreATabla.obtener(t2).campos().Pertenece(campo) ); Tabla tabla1 = _nombreATabla.obtener(t1); Tabla tabla2 = _nombreATabla.obtener(t2); Conj<Registro_tp3>::const_Iterador it; Tabla tablaIt = (tabla1.indices().Pertenece(campo))? tabla2 : tabla1; Tabla tablaBusq = (tabla1.indices().Pertenece(campo))? tabla1 : tabla2; it = tablaIt.registros().CrearIt(); Conj<Registro_tp3> res; while (it.HaySiguiente()) { Registro_tp3 regMergeado; Dato d = it.Siguiente().obtener(campo); Lista<Registro_tp3> coincis = tablaBusq.buscar(campo, d); if (!coincis.EsVacia()) { if (tablaBusq.nombre() == t1) { regMergeado = Merge(coincis.Primero(), it.Siguiente()); } else { regMergeado = Merge(it.Siguiente(), coincis.Primero()); } } Lista<struct tupString<Dato> >::const_Iterador ver_Vacio = regMergeado.vistaDicc(); if (ver_Vacio.HaySiguiente()) res.AgregarRapido(regMergeado); it.Avanzar(); } return res; }
Conj<Registro_tp3>::const_Iterador BaseDeDatos::vistaJoin(string s1, string s2) { assert( hayJoin(s1,s2) ); string campito = _hayJoin.obtener(s1).obtener(s2).campoJoin; Tabla& tabla1 = _nombreATabla.obtener(s1); bool esNat = tabla1.tipoCampo(campito); Tabla& tabla2 = _nombreATabla.obtener(s2); if ( esNat ) { diccNat<Conj<Registro_tp3>::Iterador >& diccDeIters = _joinPorCampoNat.obtener(s1).obtener(s2); Lista<tupInterna>::Iterador itT1 = _hayJoin.obtener(s1).obtener(s2).cambiosT1.CrearIt(); while ( itT1.HaySiguiente() ) { tupInterna tupSiguiente = itT1.Siguiente(); Dato claveNat = tupSiguiente.reg.obtener(campito); Lista<Registro_tp3> coincidencias = tabla2.buscar(campito, claveNat); if ( tupSiguiente.agregar && !coincidencias.EsVacia() ) { Registro_tp3 regT2 = coincidencias.Primero(); Registro_tp3 registroMergeado = Merge(tupSiguiente.reg, regT2); Conj<Registro_tp3>::Iterador iter = _registrosDelJoin.obtener(s1).obtener(s2).AgregarRapido(registroMergeado); diccDeIters.definir(claveNat.dame_valorNat(), iter); } else { if ( diccDeIters.def(claveNat.dame_valorNat()) ) { diccDeIters.obtener(claveNat.dame_valorNat()).EliminarSiguiente(); diccDeIters.borrar(claveNat.dame_valorNat()); } } itT1.EliminarSiguiente(); } Lista<tupInterna>::Iterador itT2 = _hayJoin.obtener(s1).obtener(s2).cambiosT2.CrearIt(); while ( itT2.HaySiguiente() ) { tupInterna tupSiguiente = itT2.Siguiente(); Dato claveNat = tupSiguiente.reg.obtener(campito); Lista<Registro_tp3> coincidencias = tabla1.buscar(campito, claveNat); if ( tupSiguiente.agregar && !coincidencias.EsVacia() && !diccDeIters.def(claveNat.dame_valorNat()) ) { Registro_tp3 regT1 = coincidencias.Primero(); Registro_tp3 registroMergeado = Merge(regT1, tupSiguiente.reg); Conj<Registro_tp3>::Iterador iter = _registrosDelJoin.obtener(s1).obtener(s2).AgregarRapido(registroMergeado); diccDeIters.definir(claveNat.dame_valorNat(), iter); } else { if ( !tupSiguiente.agregar && diccDeIters.def(claveNat.dame_valorNat()) ) { diccDeIters.obtener(claveNat.dame_valorNat()).EliminarSiguiente(); diccDeIters.borrar(claveNat.dame_valorNat()); } } itT2.EliminarSiguiente(); } } else { diccString<Conj<Registro_tp3>::Iterador >& diccDeIters = _joinPorCampoString.obtener(s1).obtener(s2); Lista<tupInterna>::Iterador itT1 = _hayJoin.obtener(s1).obtener(s2).cambiosT1.CrearIt(); while ( itT1.HaySiguiente() ) { tupInterna tupSiguiente = itT1.Siguiente(); Dato claveString = tupSiguiente.reg.obtener(campito); Lista<Registro_tp3> coincidencias = tabla2.buscar(campito, claveString); if ( tupSiguiente.agregar && !coincidencias.EsVacia() ) { Registro_tp3 regT2 = coincidencias.Primero(); Registro_tp3 registroMergeado = Merge(tupSiguiente.reg, regT2); Conj<Registro_tp3>::Iterador iter = _registrosDelJoin.obtener(s1).obtener(s2).AgregarRapido(registroMergeado); diccDeIters.definir(claveString.dame_valorStr(), iter); } else { if ( diccDeIters.def(claveString.dame_valorStr()) ) { diccDeIters.obtener(claveString.dame_valorStr()).EliminarSiguiente(); diccDeIters.borrar(claveString.dame_valorStr()); } } itT1.EliminarSiguiente(); } Lista<tupInterna>::Iterador itT2 = _hayJoin.obtener(s1).obtener(s2).cambiosT2.CrearIt(); while ( itT2.HaySiguiente() ) { tupInterna tupSiguiente = itT2.Siguiente(); Dato claveString = tupSiguiente.reg.obtener(campito); Lista<Registro_tp3> coincidencias = tabla1.buscar(campito, claveString); if ( tupSiguiente.agregar && !coincidencias.EsVacia() && !diccDeIters.def(claveString.dame_valorStr()) ) { Registro_tp3 regT1 = coincidencias.Primero(); Registro_tp3 registroMergeado = Merge(regT1, tupSiguiente.reg); Conj<Registro_tp3>::Iterador iter = _registrosDelJoin.obtener(s1).obtener(s2).AgregarRapido(registroMergeado); diccDeIters.definir(claveString.dame_valorStr(), iter); } else { if ( !tupSiguiente.agregar && diccDeIters.def(claveString.dame_valorStr()) ) { diccDeIters.obtener(claveString.dame_valorStr()).EliminarSiguiente(); diccDeIters.borrar(claveString.dame_valorStr()); } } itT2.EliminarSiguiente(); } } Conj<Registro_tp3>::const_Iterador res = _registrosDelJoin.obtener(s1).obtener(s2).CrearIt(); return res; }