/// <summary> /// Get list of Movies based on query parameters /// </summary> /// <param name="movieQueryParameters">query params</param> /// <returns>List of Movie</returns> public Task <IEnumerable <Movie> > GetMoviesAsync(MovieQueryParameters movieQueryParameters) { // call the worker with the params if (movieQueryParameters == null) { return(GetMoviesAsync(string.Empty, string.Empty, offset: 0, limit: 100)); } return(GetMoviesAsync(movieQueryParameters.Q, movieQueryParameters.Genre, movieQueryParameters.Year, movieQueryParameters.Rating, movieQueryParameters.ActorId, movieQueryParameters.GetOffset(), movieQueryParameters.PageSize)); }
/// <summary> /// Get a list of Movies by search and/or filter terms /// </summary> /// <param name="movieQueryParameters">movie search parameters</param> /// <returns>List of Movies or an empty list</returns> public async Task<IEnumerable<Movie>> GetMoviesAsync(MovieQueryParameters movieQueryParameters) { if (movieQueryParameters == null) { throw new ArgumentNullException(nameof(movieQueryParameters)); } string sql = MovieSelect; int offset = movieQueryParameters.GetOffset(); int limit = movieQueryParameters.PageSize; string offsetLimit = string.Format(CultureInfo.InvariantCulture, MovieOffset, offset, limit); if (!string.IsNullOrWhiteSpace(movieQueryParameters.Q)) { movieQueryParameters.Q = movieQueryParameters.Q.Trim(); sql += " and contains(m.title, @q, true) "; } if (movieQueryParameters.Year > 0) { sql += " and m.year = @year "; } if (movieQueryParameters.Rating > 0) { sql += " and m.rating >= @rating "; } if (!string.IsNullOrWhiteSpace(movieQueryParameters.ActorId)) { // convert to lower movieQueryParameters.ActorId = movieQueryParameters.ActorId.Trim().ToLowerInvariant(); sql += " and array_contains(m.roles, { actorId: @actorId }, true) "; } if (!string.IsNullOrWhiteSpace(movieQueryParameters.Genre)) { movieQueryParameters.Genre = movieQueryParameters.Genre.Trim(); sql += " and contains(m.genreSearch, @genre, true) "; } sql += MovieOrderBy + offsetLimit; // Parameterize fields QueryDefinition queryDefinition = new QueryDefinition(sql); if (!string.IsNullOrWhiteSpace(movieQueryParameters.Q)) { queryDefinition.WithParameter("@q", movieQueryParameters.Q); } if (!string.IsNullOrWhiteSpace(movieQueryParameters.ActorId)) { queryDefinition.WithParameter("@actorId", movieQueryParameters.ActorId); } if (!string.IsNullOrWhiteSpace(movieQueryParameters.Genre)) { // genreSearch is stored delimited with : queryDefinition.WithParameter("@genre", "|" + movieQueryParameters.Genre + "|"); } if (movieQueryParameters.Year > 0) { queryDefinition.WithParameter("@year", movieQueryParameters.Year); } if (movieQueryParameters.Rating > 0) { queryDefinition.WithParameter("@rating", movieQueryParameters.Rating); } return await InternalCosmosDBSqlQuery<Movie>(queryDefinition).ConfigureAwait(false); }
/// <summary> /// Get Cosmos query string based on query parameters /// </summary> /// <param name="movieQueryParameters">query params</param> /// <returns>Cosmos query string</returns> public string GetMovieIds(MovieQueryParameters movieQueryParameters) { List <Movie> cache; string ids = string.Empty; if (movieQueryParameters == null) { cache = GetMovies(string.Empty, string.Empty, offset: 0, limit: 100); } else { cache = GetMovies(movieQueryParameters.Q, movieQueryParameters.Genre, movieQueryParameters.Year, movieQueryParameters.Rating, movieQueryParameters.ActorId, movieQueryParameters.GetOffset(), movieQueryParameters.PageSize); } foreach (Movie m in cache) { ids += $"'{m.Id}',"; } // nothing found if (string.IsNullOrEmpty(ids)) { return(string.Empty); } string sql = "select m.id, m.partitionKey, m.movieId, m.type, m.textSearch, m.title, m.year, m.runtime, m.rating, m.votes, m.totalScore, m.genres, m.roles from m where m.id in ({0}) order by m.textSearch ASC, m.movieId ASC"; return(sql.Replace("{0}", ids[0..^ 1], StringComparison.Ordinal));