From 92fd919d2d3135327a9ba4be0f87229a4b21fffd Mon Sep 17 00:00:00 2001 From: JotaJota96 <jjap96@gmail.com> Date: Fri, 4 Oct 2019 02:47:31 -0300 Subject: [PATCH] Algoritmos terminados, no incorporan IgnoreCast --- .../JPAControllerClasses/BusquedaEnBDD.java | 118 +++++++++++++++++- .../src/Logica/DatosDePrueba.java | 11 +- .../src/Logica/Interfaces/IUsuario.java | 5 +- 3 files changed, 127 insertions(+), 7 deletions(-) diff --git a/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java index 466861a..438c9a3 100644 --- a/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java +++ b/UyTube_aplicacion/src/JPAControllerClasses/BusquedaEnBDD.java @@ -6,6 +6,9 @@ import Logica.Clases.ListaDeReproduccion_; import Logica.Clases.Usuario; import Logica.Clases.Video; import Logica.DataType.DtVideo; +import Logica.Enumerados.Filtrado; +import Logica.Enumerados.Ordenacion; +import Logica.Enumerados.TipoListaDeReproduccion; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -27,6 +30,80 @@ public class BusquedaEnBDD implements Serializable { return emf.createEntityManager(); } + /** + * Busca contenido por coincidencia de texto en nombre o descripcion de los + * contenidos del sistema En el resultado se incluirán (si corresponde segun + * el filtrado) los videos privados del usuarioActual + * + * @param busqueda Texto a buscar (si es vacÃo incluye todo el contenido) + * @param filtro Tipo de contenido en el cual se realizará la búsqueda + * @param orden Manera de ordenar el resultado de la búsqueda + * @return Resultado de la busqueda. Puede contener DtVideo, + * DtListaDeReproduccion y/o DtCanal. (para usar los elementos devueltos hay + * que castearlos) + */ + public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden){ + EntityManager em = getEntityManager(); + List<Object> ret = new ArrayList(); + if (busqueda == null || busqueda.equals("")) { + }else{ + busqueda = "%" + busqueda + "%"; + } + try { + Query q; + // Segun la opcion de filtrado, se obtienen los contenidos que contengan el texto a buscar + // Busca los Canales + if (filtro == Filtrado.TODO || filtro == Filtrado.CANALES){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM Canal e"); + }else{ + q = em.createQuery("SELECT e FROM Canal e WHERE e.nombre LIKE ?1 OR e.descripcion LIKE ?1"); + q.setParameter(1, busqueda); + } + ret.addAll(q.getResultList()); + } + // Busca los Listas de reproduccion + if (filtro == Filtrado.TODO || filtro == Filtrado.LISTAS_DE_REPRODUCCION){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1"); + q.setParameter(1, TipoListaDeReproduccion.PARTICULAR); + }else{ + q = em.createQuery("SELECT e FROM ListaDeReproduccion e WHERE e.tipo = ?1 AND e.nombre LIKE ?2"); + q.setParameter(1, TipoListaDeReproduccion.PARTICULAR); + q.setParameter(2, busqueda); + } + ret.addAll(q.getResultList()); + } + // Busca los Videos + if (filtro == Filtrado.TODO || filtro == Filtrado.VIDEOS){ + if (busqueda == null || busqueda.equals("")){ + q = em.createQuery("SELECT e FROM Video e"); + }else{ + q = em.createQuery("SELECT e FROM Video e WHERE e.nombre LIKE ?1 OR e.descripcion LIKE ?1"); + q.setParameter(1, busqueda); + } + ret.addAll(q.getResultList()); + } + + // En este punto ret contiene todos los contenidos que contienen la busqueda en su nombre o descripcion + ArrayList<ParDeObjetos> pares = null; + ArrayList<ParDeObjetos> paresOrdenados; + switch (orden){ + case ALFABETICA_ASCENDENTE: + pares = nombrarElementos((ArrayList<Object>) ret); + break; + case FECHA_DESCENDENTE: + pares = fecharElementos((ArrayList<Object>) ret); + break; + } + return ParDeObjetos.extraerElementos( + ordenar(pares) + ); + } finally { + em.close(); + } + } + /** * Devuelve un listado de Video y ListaDeReproduccion que pertenezcan ala * categoria indicada, ordenado por fecha de actividasd reciente @@ -75,6 +152,45 @@ public class BusquedaEnBDD implements Serializable { return ret; } + /** + * Asocia los objetos recibidos a una fecha + * Canal se asocia a la fecha del video mas reciente + * Video a su propia fecha + * ListaDeReproduccion fecha del video con fecha mas reciente + * @param lista Lista de objetos a ordenar (Canal, Video o ListaDeReproduccion) + * @return Lista de los objetos recibidos pero asociados a una fecha + */ + public ArrayList<ParDeObjetos> nombrarElementos(ArrayList<Object> lista){ + ArrayList<ParDeObjetos> ret = new ArrayList(); + for (Object o : lista){ + ret.add(new ParDeObjetos(o, nombreParaOrdenar(o))); + } + return ret; + } + + /** + * Devuelve el nombre del objeto + * Canal su nombre + * Video su nombre + * ListaDeReproduccion su nombre + * @param o Objeto a dar nombre + * @return Nombre del objeto + */ + private String nombreParaOrdenar(Object o){ + java.sql.Date ret = null; + if (o.getClass() == Canal.class){ + Canal c = (Canal) o; + return c.getNombre(); + }else if (o.getClass() == ListaDeReproduccion.class){ + ListaDeReproduccion l = (ListaDeReproduccion) o; + return l.getNombre(); + }else if (o.getClass() == Video.class){ + Video v = (Video) o; + return v.getNombre(); + } + return ""; + } + /** * Devuelve la fecha de la ultima actividad del objeto * Canal es la fecha del video mas reciente @@ -142,7 +258,7 @@ public class BusquedaEnBDD implements Serializable { if (a.getOrderField().getClass() == String.class){ String str1 = (String) a.getOrderField(); String str2 = (String) b.getOrderField(); - return str1.compareToIgnoreCase(str2); + return (str1.compareToIgnoreCase(str2)) * -1; }else if (a.getOrderField().getClass() == java.sql.Date.class){ java.sql.Date date1 = (java.sql.Date) a.getOrderField(); java.sql.Date date2 = (java.sql.Date) b.getOrderField(); diff --git a/UyTube_aplicacion/src/Logica/DatosDePrueba.java b/UyTube_aplicacion/src/Logica/DatosDePrueba.java index 5dc3fa3..24b8caf 100644 --- a/UyTube_aplicacion/src/Logica/DatosDePrueba.java +++ b/UyTube_aplicacion/src/Logica/DatosDePrueba.java @@ -1,8 +1,11 @@ package Logica; import JPAControllerClasses.BusquedaEnBDD; +import Logica.Clases.Canal; import Logica.Clases.ListaDeReproduccion; import Logica.Clases.Video; +import Logica.Enumerados.Filtrado; +import Logica.Enumerados.Ordenacion; import Logica.Interfaces.IAdmin; import Logica.Interfaces.IUsuario; import java.util.ArrayList; @@ -45,16 +48,16 @@ public class DatosDePrueba { */ - - - - for (Object o : new BusquedaEnBDD().buscarPorCategoria("MUSICA")){ + for (Object o : new BusquedaEnBDD().buscar("", Filtrado.TODO, Ordenacion.ALFABETICA_ASCENDENTE)){ if (o.getClass() == Video.class){ Video i = (Video) o; System.out.println(i.getNombre()); }else if (o.getClass() == ListaDeReproduccion.class){ ListaDeReproduccion i = (ListaDeReproduccion) o; System.out.println(i.getNombre()); + }else if (o.getClass() == Canal.class){ + Canal i = (Canal) o; + System.out.println(i.getNombre()); } } diff --git a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java index 1e10aff..f47b5d6 100644 --- a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java +++ b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java @@ -76,8 +76,9 @@ public interface IUsuario { public ArrayList<Object> buscar(String busqueda, Filtrado filtro, Ordenacion orden); /** - * Busca contenido por coincidencia de texto en nombre o descripcion de los - * contenidos del sistema que pertenezcan a la categoria indicada + * Busca contenido que pertenezcan a la categoria indicada El Resultado + * contendrá todos los contenidos publicos, y los contenidos privados del + * usuarioActual * * @param categoria Nombre de la categoria a buscar * @return Resultado de la busqueda. Puede contener DtVideo y -- GitLab