예제 #1
0
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;
}
예제 #2
0
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;
}