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