Funcionalidades - nshandra/practica_final-ISI_18-19 GitHub Wiki

Funcionalidades

En esta pagina se proponen las funcionalidades a implementar.

NOTA:

Para evitar caer en la "trampa" de pensar como usuarios finales creo que es buena idea plantear que estamos implementando una API.

Así las funcionalidades propuestas no quedarían limitadas por interfaces web u otros elementos que quedan fuera del foco de la practica.


Filtrado / Búsqueda de Películas

Grupo: Álvaro y Miguel

Posibilidad de filtrar por actores, géneros, directores, puntuación...etc.

  1. Filtrar por nombre de la película.
  2. Filtrar por año de estreno de la película.
  3. Filtrar por nombre del actor/actriz que aparece en la película. (En construcción...)

4.Filtrar por duración de la película(En construcción...)

5.Filtrar por género(En construcción...)

6.Filtrar por valoración(En construcción...)


Puntuaciones

Grupo: Juan, Andrés y Raquel

Añadir sistema de puntuación, críticas o comentarios.

Se han generado las tablas necesarias: -Usuarios(id_user) -Scores(id_user, id_film, score); donde la combinacion de id_user e id_film sera la clae primaria, permiiendo una sola votacion por usuario y peli -Comentarios(id_comment, id_user, id_film, text); en este caso se permite que los usuarios comenten mas de una vez una pelicula.

Las funciones se han implementado de tal manera, que la acceder a la info de una pelicula nos permita comentarla y puntuarla mediante unos formularios simles. Debajo de esta posibilidad se mostraran los mensajes de todos los usuarios. Un usuario solo puntua una vez una pelicula, despues se debe cambiar la puntuacion, pero si puede comentar más de una vez. Si llega un mensaje de un usuario no registrado, suponemos que es un usuario nuevo y lo añadimos a nuestras talas.


Recomendaciones

Grupo: Jaime, Nazar y Alberto

Necesitaríamos establecer algún tipo de usuarios, para que podamos mostrar películas similares a las que este usuario haya puntuado. Podemos mostrar las películas mejor valoradas si no es un usuario identificado o no ha puntuado todavía.

Clase Java

class SlopeOneFilter {

	Map<Integer, Map<Integer, Double>> data;
	// userID | titleID | score

	Map<Integer, Map<Integer, Double>> diffMap;
	// titleID | titleID | difference

	Map<Integer, Map<Integer, Integer>> weightMap;
	// titleID | titleID | weight

	Map<Integer, Map<Integer, Double>> predictions;
	// userID | titleID | prediction

	void buildMaps(){
		// Crear diffMap y weightMap a partir de data.
	}

	void predict(int user) {
		// Crear predictions para ese usuario determinado.
	}

	void recommend(int user, int nItems) {
		// Mostrar nItems predicciones con mayor puntuación.
	}

}

Adición de películas

Grupo: Lydia, Cristina, Borja y Adrián

Posibilidad de añadir nuevas películas por parte de los usuarios con un pequeño formulario, título, actores, género...etc

1º) Buscar si la película ya está en la BD.

  • Filtrado por título y año (introducidos que coincidan o no con una entrada).
  • Devolver boolean.

2º) Si no coinciden con ninguna entrada:

  • Crear nueva con: título, año, género y actores que participan.

Interfaz SQL-Java

Grupo: Carlos, Álvaro y Víctor

  1. Función que, dado el nombre de una película, devuelva todos los campos (si es posible) que tenemos de ella.

    • filterByName()
    • Parámetro: String nombrePelicula
    • Devuelve: ArrayList de Strings camposPelicula

    Hecho.

  2. Función que, dado un año, devuelva todos las películas de dicho año.

    • filterByYear()
    • Parámetro: String año
    • Devuelve: ArrayList de Strings peliculas

    Hecho.

  3. Función que, dado el nombre de un actor/actriz, devuelva todas las películas en las que aparece.

    • filterByActorActress()
    • Parámetro: String nombreActorActriz
    • Devuelve: ArrayList de Strings peliculas

    Hecho.

  4. Función que guarda en un hashMap la informacion almacenada en la tabla Ratings. Esta función se llamara en el constructor de la clase SlopeOneFilter.

    • makeDataHashMap(Map<Integer, Map<Integer, Double>> data)
    • Parámetro: Map<Integer, Map<Integer, Double>> data - Mapa que almacena la tabla Ratings.
    • Devuelve: void
  5. Función que, dada una duración en minutos, devuelva las películas con una duración inferior a esos minutos.

    • filterByDuration()
    • Parámetro: int duracion
    • Devuelve: ArrayList de Strings peliculas

    Hecho.

  6. Función que, dado el genero, devuelva todas las películas de ese género

    • filterByGenre()
    • Parámetro: String genero
    • Devuelve: ArrayList de Strings peliculas

    Hecho.

  7. Función que, dada un número, devuelva las películas con una valoración mayor a ese número

    • filterByRating()
    • Parámetro: Float valoracion
    • Devuelve: ArrayList de Strings peliculas

    Hecho.

  8. Función que guarda en un integer la media de las puntuaciones que tiene una película en concreto.

    • Parámetro: Nombre de la película
    • Devuelve: La media de sus puntuaciones

    Hecho.

  9. Función que añade a la tabla ratings, si ya existía se debe modificar

    • Parámetros: ID_Usuario,ID_Pelicula,puntuación
    • Devuelve: Nada

    Hecho

  10. Función que añade a la tabla comments

  • Parámetros: ID_Usuario,ID_Pelicula,comentario
  • Devuelve: Nada

Hecho

  1. Función que añade un id_usuario a la tabla Users si no existe, si exixtía no dabe hacer nada *Parámetros: ID_Usuario *Devuelve: nada

Hecho

  1. Dada una pelicula (id/nombre, nos es indiferente) nos devuelva un array de arrays de comentarios, formado por en la primera columna, el usuario que dejo el comentario y en la segunda columna el comentario. *Parámetros: id/name film *Devuelve: array de arrays, user, comentario

Hecho

  1. Dada una peliciula (id/nombre, nos es indiferente), y una puntuación, debe actualizar la base de datos pelculas, con la nueva puntuacion calculada *Parámetros: id/name film, int media. *Devuelve: nada

Hecho

Creamos para el punto 10 la tabla comments, con ID_Pelicula, ID_Usuario y comentario


Grafos (cálculo de distancias, filtrado e información sobre grafos)

Grupo: Jonathan y Pablo Funcionalidad explicada: parte de Jonathan (Onac8)

Cálculo de la distancia entre dos actores o películas (o actor y película)

Está basado en la Teoría de Grafos. Sigue el siguiente procedimiento:

  1. Se pedirá al usuario introducir en un formulario dos nombres. Gracias al método nameChecker, no tenemos por que introducir el nombre exacto la película/actor. Basta con introducir una palabra correcta, o una parte de todo el string que se sepa seguro. Se ofrecerán diferentes coincidencias a elegir (p.e. 'Mark' si no se sabe 'Mark Wahlberg', o 'Arnold S' si no sabemos 'Arnold Schwarzenegger'). En estos casos buscamos en IMDb.db.

  2. Nuestro programa se encargará de crear un grafo dada la tabla film_actors.txt, extraída directamente de IMDb.db, gracias a los comandos que se encuentran en film_actors_query.txt. Se guardarán nodos (vertex) y enlaces entre nodos vecinos (edges), formando así el grafo (todo gracias a la clase Graph.java).

  3. Dado el primer nombre del form, y gracias a la clase PathFinder.java, se irán calculando distancias relativas a este elemento dado (nodo).

  4. Dado el segundo nombre del form, se comprobará si existe o no camino (path) de un nodo al otro.

  5. Se mostrará en un nuevo html el camino más corto de un nodo a otro y su distancia. En caso de no haber camino, se mostrará mensaje apropiado (no coincidencia o uso erróneo).

Filtrado mediante el uso de grafos

Aquí tenemos dos ejemplos, según orden de aparición en el html:

  1. Se pedirá al usuario un nombre de película o actor. Se obtendrán los actores que han trabajado en esa película, o películas en las que ha trabajado ese actor. Aquí hacemos uso de nuestro propio método doGraphFilter.
  2. Se pedirá al usuario un número. Con él, y gracias al método doRanking, se obtendrán actores que han trabajado en X o más películas, y el número de películas totales.

Información sobre el grafo

En este apartado, gracias a la ayuda de Graph.java, SmallWorld.java y Performer.java obtendremos información relativa a nuestro grafo total (suma de diferentes subgrafos). Cuenta con los siguientes apartados:

  • Número de nodos (vértices) --> nodos totales del grafo (películas + actores/actrices).
  • Número de enlaces (edges) --> enlaces totales entre nodos (actores y películas).
  • Grado máximo --> nodo con mayor número de vecinos en todo el grafo total + nombre del nodo. Esto es el equivalente a la película con más actores, o actor que ha trabajado en más películas.
  • Grado mínimo --> nodo con menor número de vecinos en todo el grafo total + nombre del nodo. La inversa del anterior.
  • Grado medio --> media de vecinos por cada nodo.

Tests (de la funcionalidad grafos)

En este apartado, hablaremos sobre los distintos tests implementados. El SUT sobre el que se ha trabajado han sido la clase principal de grafos, 'GraphFuncionality.java', y las principales clases que utiliza: 'Graph.java', 'Pathfinder.java', 'In.java'... Diferenciaremos dos tipos: tests de** caja negra** y de caja blanca.

Caja negra

Se han implementado tests basados en la partición del dominio de la entrada y funcionalidad. El resultado han sido 11 tests totales (con 3 happy paths). En el fichero 'Alltests.md', situado en el directorio /src/test/.../GraphFuncionalityBlackWhite, se explican cada uno de los tests y los criterios seguidos.

Caja blanca

Aquí se han diseñado grafos basados en el código fuente de la clase 'GraphFuncionality.java'. Estos se encuentran en el directorio '/src/test/.../GraphFuncionalityGraphs'. Debido al gran número de grafos que saldría, se ha decidido trabajar solo con esta clase y no las demás clases que utiliza esta. Echando un vistazo a cada grafo, vemos como es posible diseñar más tests, para cubrir más código. Se han implementado varios como ejemplo, y se detallan en '/src/test/.../GraphFuncionalityBlackWhite/Alltests.md'.