/// <summary>
        /// Gets the media objects having all tags specified in the search options. Guaranteed to not return null.
        /// Only media objects the user has permission to view are returned.
        /// </summary>
        /// <returns>An instance of <see cref="IGalleryObjectCollection" />.</returns>
        private IGalleryObjectCollection GetMediaObjectsHavingTags()
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(m =>
                                     m.Album.FKGalleryId == SearchOptions.GalleryId &&
                                     m.Metadata.Any(md => md.MetaName == TagType && md.MetadataTags.Any(mdt => SearchOptions.Tags.Contains(mdt.FKTagName))), m => m.Metadata);

                foreach (var moDto in RestrictForCurrentUser(qry))
                {
                    var mediaObject = Factory.GetMediaObjectFromDto(moDto, null);

                    // We have a media object that contains at least one of the tags. If we have multiple tags, do an extra test to ensure
                    // media object matches ALL of them. (I wasn't able to write the LINQ to do this for me, so it's an extra step.)
                    if (SearchOptions.Tags.Length == 1)
                    {
                        galleryObjects.Add(mediaObject);
                    }
                    else if (MetadataItemContainsAllTags(mediaObject.MetadataItems.First(md => md.MetadataItemName == TagType)))
                    {
                        galleryObjects.Add(mediaObject);
                    }
                }
            }

            return(galleryObjects);
        }
        /// <summary>
        /// Creates an instance of <see cref="CacheItemAlbum" /> from <paramref name="album" />. This instance is suitable for storing in cache.
        /// If <paramref name="album" /> is not inflated, a call to the data store is made to retrieve the child albums and media assets.
        /// </summary>
        /// <param name="album">The album.</param>
        /// <returns>An instance of <see cref="CacheItemAlbum" />.</returns>
        public static CacheItemAlbum CreateFrom(IAlbum album)
        {
            ConcurrentDictionary <int, byte> childAlbumIds;
            ConcurrentDictionary <int, byte> childMediaObjectIds;

            if (album.AreChildrenInflated)
            {
                childAlbumIds       = new ConcurrentDictionary <int, byte>(album.GetChildGalleryObjects(GalleryObjectType.Album).ToDictionary(k => k.Id, v => (byte)0));
                childMediaObjectIds = new ConcurrentDictionary <int, byte>(album.GetChildGalleryObjects(GalleryObjectType.MediaObject).ToDictionary(k => k.Id, v => (byte)0));
            }
            else
            {
                using (var repo = new AlbumRepository())
                {
                    childAlbumIds = new ConcurrentDictionary <int, byte>(repo.Where(a => a.FKAlbumParentId == album.Id).ToDictionary(k => k.AlbumId, v => (byte)0));
                }

                using (var repo = new MediaObjectRepository())
                {
                    childMediaObjectIds = new ConcurrentDictionary <int, byte>(repo.Where(a => a.FKAlbumId == album.Id).ToDictionary(k => k.MediaObjectId, v => (byte)0));
                }
            }

            return(new CacheItemAlbum(album.Id, album.GalleryId, album.Parent.Id, album.GalleryObjectType, album.Sequence, album.DateAdded, CacheItemMetaItem.FromMetaItems(album.MetadataItems, album.Id, album.GalleryObjectType), album.CreatedByUserName, album.LastModifiedByUserName, album.DateLastModified, album.IsPrivate, album.DirectoryName, album.ThumbnailMediaObjectId, album.SortByMetaName, album.SortAscending, album.OwnerUserName, album.OwnerRoleName, childAlbumIds, childMediaObjectIds));
        }
Exemple #3
0
        private IEnumerable <IGalleryObject> FindItemsMatchingKeywords()
        {
            var results = new GalleryObjectCollection();

            using (var repo = new AlbumRepository())
            {
                var qry = repo.Where(a => true, a => a.Metadata);

                qry = SearchOptions.SearchTerms.Aggregate(qry, (current, searchTerm) => current.Where(a =>
                                                                                                      a.FKGalleryId == SearchOptions.GalleryId &&
                                                                                                      a.Metadata.Any(md => md.Value.Contains(searchTerm))));

                foreach (var album in qry)
                {
                    results.Add(Factory.GetAlbumFromDto(album));
                }
            }

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(a => true, a => a.Metadata);

                qry = SearchOptions.SearchTerms.Aggregate(qry, (current, searchTerm) => current.Where(mo =>
                                                                                                      mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                                                                      mo.Metadata.Any(md => md.Value.Contains(searchTerm))));

                foreach (var mediaObject in qry)
                {
                    results.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return(results);
        }
        /// <summary>
        /// Gets the <paramref name="top" /> most recently added media objects, skipping the first
        /// <paramref name="skip" /> objects. Only media objects the current user is authorized to
        /// view are returned.
        /// </summary>
        /// <param name="top">The number of items to retrieve.</param>
        /// <param name="skip">The number of items to skip over in the data store.</param>
        /// <returns><see cref="IEnumerable&lt;IGalleryObject&gt;" />.</returns>
        private IEnumerable <IGalleryObject> GetRecentlyAddedMediaObjects(int top, int skip = 0)
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                var qry = RestrictForCurrentUser(repo.Where(mo => mo.Album.FKGalleryId == SearchOptions.GalleryId)
                                                 .OrderByDescending(m => m.DateAdded))
                          .Skip(skip).Take(top)
                          .Include(m => m.Metadata);

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return(galleryObjects);
        }
        private IEnumerable <IGalleryObject> GetMediaObjectsHavingTitleOrCaption()
        {
            var galleryObjects = new GalleryObjectCollection();

            var metaTagsToSearch = new[] { MetadataItemName.Title, MetadataItemName.Caption };

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(a => true, a => a.Metadata);

                qry = RestrictForCurrentUser(qry);

                qry = SearchOptions.SearchTerms.Aggregate(qry, (current, searchTerm) => current.Where(mo =>
                                                                                                      mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                                                                      mo.Metadata.Any(md => metaTagsToSearch.Contains(md.MetaName) && md.Value.Contains(searchTerm))));

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return(galleryObjects);
        }
        /// <summary>
        /// Gets the <paramref name="top" /> media objects having the specified rating, skipping the first
        /// <paramref name="skip" /> objects. Only media objects the current user is authorized to
        /// view are returned. Albums cannot be rated and are thus not returned.
        /// </summary>
        /// <param name="top">The number of items to retrieve.</param>
        /// <param name="skip">The number of items to skip over in the data store.</param>
        /// <returns><see cref="IEnumerable&lt;IGalleryObject&gt;" />.</returns>
        private IEnumerable <IGalleryObject> GetRatedMediaObjects(int top, int skip = 0)
        {
            var galleryObjects = new GalleryObjectCollection();

            if (AppSetting.Instance.ProviderDataStore == ProviderDataStore.SqlCe)
            {
                // SQL CE does not support the queries below, so throw an error. We should never get here because Utils.GetTopRatedUrl()
                // only generates an URL for SQL Server DB's, but better safe than sorry. FYI, these are the errors SQL CE generates:
                // Caused by String.IsNullOrEmpty(md.Value): "The specified argument value for the function is not valid. [ Argument # = 1,Name of function(if known) = LEN ]"
                // Caused by using md.Value in OrderBy: "Large objects (ntext and image) cannot be used in ORDER BY clauses."
                // One way to make these queries work is to change Metadata.Value from NTEXT to NVARCHAR(4000), but this is undesirable because we
                // want the max length to handle long meta values, especially in SQL Server, where these queries work fine. I looked into adding
                // conditional logic to change the column definition for SQL CE but leaving it unchanged for SQL Server, but it was complex and had risk.
                throw new NotSupportedException("SQL CE does not support the query syntax used in GalleryObjectSearcher.GetRatedMediaObjects(). Use SQL Server instead.");
            }

            using (var repo = new MediaObjectRepository())
            {
                IQueryable <MediaObjectDto> qry;

                switch (SearchOptions.SearchTerms[0].ToLowerInvariant())
                {
                case "highest": // Highest rated objects
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                            mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                                                 .OrderByDescending(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                case "lowest": // Lowest rated objects
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId
                                                            //&& mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && md.Value == "5"))
                                                            && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                                                 .OrderBy(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                case "none": // Having no rating
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                            mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && String.IsNullOrEmpty(md.Value)))
                                                 .OrderBy(mo => mo.DateAdded)
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                default: // Look for a specific rating
                    var r = ParseRating(SearchOptions.SearchTerms[0]);
                    if (r != null)
                    {
                        qry = RestrictForCurrentUser(repo.Where(mo =>
                                                                mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                                mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && r.Contains(md.Value)))
                                                     .OrderBy(mo => mo.DateAdded)
                                                     .Include(mo => mo.Metadata)
                                                     .Skip(skip).Take(top));
                    }
                    else
                    {
                        // The search term is a string other than highest, lowest, none or a decimal. Don't return anything.
                        qry = repo.Where(mo => false);
                    }
                    break;
                }

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return(galleryObjects);
        }
        /// <summary>
        /// Gets the <paramref name="top" /> media objects having the specified rating, skipping the first
        /// <paramref name="skip" /> objects. Only media objects the current user is authorized to
        /// view are returned. Albums cannot be rated and are thus not returned.
        /// </summary>
        /// <param name="top">The number of items to retrieve.</param>
        /// <param name="skip">The number of items to skip over in the data store.</param>
        /// <returns><see cref="IEnumerable&lt;IGalleryObject&gt;" />.</returns>
        private IEnumerable <IGalleryObject> GetRatedMediaObjects(int top, int skip = 0)
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                IQueryable <MediaObjectDto> qry;

                switch (SearchOptions.SearchTerms[0].ToLowerInvariant())
                {
                case "highest":                         // Highest rated objects
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                            mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                                                 .OrderByDescending(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                case "lowest":                         // Lowest rated objects
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId
                                                            //&& mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && md.Value == "5"))
                                                            && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                                                 .OrderBy(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                case "none":                         // Having no rating
                    qry = RestrictForCurrentUser(repo.Where(mo =>
                                                            mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                            mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && String.IsNullOrEmpty(md.Value)))
                                                 .OrderBy(mo => mo.DateAdded)
                                                 .Include(mo => mo.Metadata)
                                                 .Skip(skip).Take(top));
                    break;

                default:                         // Look for a specific rating
                    var r = ParseRating(SearchOptions.SearchTerms[0]);
                    if (r != null)
                    {
                        qry = RestrictForCurrentUser(repo.Where(mo =>
                                                                mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                                                                mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && r.Contains(md.Value)))
                                                     .OrderBy(mo => mo.DateAdded)
                                                     .Include(mo => mo.Metadata)
                                                     .Skip(skip).Take(top));
                    }
                    else
                    {
                        // The search term is a string other than highest, lowest, none or a decimal. Don't return anything.
                        qry = repo.Where(mo => false);
                    }
                    break;
                }

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return(galleryObjects);
        }
        /// <summary>
        /// Gets the <paramref name="top" /> most recently added media objects, skipping the first
        /// <paramref name="skip" /> objects. Only media objects the current user is authorized to
        /// view are returned.
        /// </summary>
        /// <param name="top">The number of items to retrieve.</param>
        /// <param name="skip">The number of items to skip over in the data store.</param>
        /// <returns><see cref="IEnumerable&lt;IGalleryObject&gt;" />.</returns>
        private IEnumerable<IGalleryObject> GetRecentlyAddedMediaObjects(int top, int skip = 0)
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                var qry = RestrictForCurrentUser(repo.Where(mo => mo.Album.FKGalleryId == SearchOptions.GalleryId)
                    .OrderByDescending(m => m.DateAdded))
                    .Skip(skip).Take(top)
                    .Include(m => m.Metadata);

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return galleryObjects;
        }
        /// <summary>
        /// Gets the <paramref name="top" /> media objects having the specified rating, skipping the first
        /// <paramref name="skip" /> objects. Only media objects the current user is authorized to
        /// view are returned. Albums cannot be rated and are thus not returned.
        /// </summary>
        /// <param name="top">The number of items to retrieve.</param>
        /// <param name="skip">The number of items to skip over in the data store.</param>
        /// <returns><see cref="IEnumerable&lt;IGalleryObject&gt;" />.</returns>
        private IEnumerable<IGalleryObject> GetRatedMediaObjects(int top, int skip = 0)
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                IQueryable<MediaObjectDto> qry;

                switch (SearchOptions.SearchTerms[0].ToLowerInvariant())
                {
                    case "highest": // Highest rated objects
                        qry = RestrictForCurrentUser(repo.Where(mo =>
                            mo.Album.FKGalleryId == SearchOptions.GalleryId
                            && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                            .OrderByDescending(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                            .Include(mo => mo.Metadata)
                            .Skip(skip).Take(top));
                        break;

                    case "lowest": // Lowest rated objects
                        qry = RestrictForCurrentUser(repo.Where(mo =>
                            mo.Album.FKGalleryId == SearchOptions.GalleryId
                                //&& mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && md.Value == "5"))
                            && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && !String.IsNullOrEmpty(md.Value)))
                            .OrderBy(mo => mo.Metadata.Where(md => md.MetaName == MetadataItemName.Rating).Select(md => md.Value).FirstOrDefault())
                            .Include(mo => mo.Metadata)
                            .Skip(skip).Take(top));
                        break;

                    case "none": // Having no rating
                        qry = RestrictForCurrentUser(repo.Where(mo =>
                            mo.Album.FKGalleryId == SearchOptions.GalleryId
                            && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && String.IsNullOrEmpty(md.Value)))
                            .OrderBy(mo => mo.DateAdded)
                            .Include(mo => mo.Metadata)
                            .Skip(skip).Take(top));
                        break;

                    default: // Look for a specific rating
                        var r = ParseRating(SearchOptions.SearchTerms[0]);
                        if (r != null)
                        {
                            qry = RestrictForCurrentUser(repo.Where(mo =>
                                mo.Album.FKGalleryId == SearchOptions.GalleryId
                                && mo.Metadata.Any(md => md.MetaName == MetadataItemName.Rating && r.Contains(md.Value)))
                                .OrderBy(mo => mo.DateAdded)
                                .Include(mo => mo.Metadata)
                                .Skip(skip).Take(top));
                        }
                        else
                        {
                            // The search term is a string other than highest, lowest, none or a decimal. Don't return anything.
                            qry = repo.Where(mo => false);
                        }
                        break;
                }

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return galleryObjects;
        }
        private IEnumerable<IGalleryObject> GetMediaObjectsMatchingKeywords()
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(a => true, a => a.Metadata);

                qry = SearchOptions.SearchTerms.Aggregate(qry, (current, searchTerm) => current.Where(mo =>
                    mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                    mo.Metadata.Any(md => md.Value.Contains(searchTerm))));

                qry = RestrictForCurrentUser(qry);

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return galleryObjects;
        }
        private IEnumerable<IGalleryObject> GetMediaObjectsHavingTitleOrCaption()
        {
            var galleryObjects = new GalleryObjectCollection();

            var metaTagsToSearch = new[] { MetadataItemName.Title, MetadataItemName.Caption };

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(a => true, a => a.Metadata);

                qry = RestrictForCurrentUser(qry);

                qry = SearchOptions.SearchTerms.Aggregate(qry, (current, searchTerm) => current.Where(mo =>
                    mo.Album.FKGalleryId == SearchOptions.GalleryId &&
                    mo.Metadata.Any(md => metaTagsToSearch.Contains(md.MetaName) && md.Value.Contains(searchTerm))));

                foreach (var mediaObject in qry)
                {
                    galleryObjects.Add(Factory.GetMediaObjectFromDto(mediaObject, null));
                }
            }

            return galleryObjects;
        }
        /// <summary>
        /// Gets the media objects having all tags specified in the search options. Guaranteed to not return null. 
        /// Only media objects the user has permission to view are returned.
        /// </summary>
        /// <returns>An instance of <see cref="IGalleryObjectCollection" />.</returns>
        private IGalleryObjectCollection GetMediaObjectsHavingTags()
        {
            var galleryObjects = new GalleryObjectCollection();

            using (var repo = new MediaObjectRepository())
            {
                var qry = repo.Where(m =>
                    m.Album.FKGalleryId == SearchOptions.GalleryId &&
                    m.Metadata.Any(md => md.MetaName == TagType && md.MetadataTags.Any(mdt => SearchOptions.Tags.Contains(mdt.FKTagName))), m => m.Metadata);

                foreach (var moDto in RestrictForCurrentUser(qry))
                {
                    var mediaObject = Factory.GetMediaObjectFromDto(moDto, null);

                    // We have a media object that contains at least one of the tags. If we have multiple tags, do an extra test to ensure
                    // media object matches ALL of them. (I wasn't able to write the LINQ to do this for me, so it's an extra step.)
                    if (SearchOptions.Tags.Length == 1)
                    {
                        galleryObjects.Add(mediaObject);
                    }
                    else if (MetadataItemContainsAllTags(mediaObject.MetadataItems.First(md => md.MetadataItemName == TagType)))
                    {
                        galleryObjects.Add(mediaObject);
                    }
                }
            }

            return galleryObjects;
        }
Exemple #13
0
		private static void AddChildObjects(IAlbum album)
		{
			if (album == null)
				throw new ArgumentNullException("album");

			#region Add child albums

			using (var repo = new AlbumRepository())
			{
				//foreach (int albumId in GetDataProvider().Album_GetChildAlbumIdsById(album.Id))
				foreach (int albumId in repo.Where(a => a.FKAlbumParentId == album.Id).Select(a => a.AlbumId))
				{
					album.AddGalleryObject(CreateAlbumInstance(albumId, album.GalleryId));
				}
			}

			#endregion

			#region Add child media objects

			using (var repo = new MediaObjectRepository())
			{
				//foreach (MediaObjectDto moDto in GetDataProvider().Album_GetChildMediaObjectsById(album.Id, album.AllowMetadataLoading))
				IQueryable<MediaObjectDto> moDtos;
				if (album.AllowMetadataLoading)
					moDtos = repo.Where(m => m.FKAlbumId == album.Id, m => m.Metadata);
				else
					moDtos = repo.Where(m => m.FKAlbumId == album.Id);

				foreach (MediaObjectDto moDto in moDtos)
				{
					var mediaObject = GetMediaObjectFromDto(moDto, album);

					AddToMediaObjectCache(mediaObject);

					album.AddGalleryObject(mediaObject);
				}
			}

			#endregion

			album.AreChildrenInflated = true;
		}
Exemple #14
0
		private static MediaObjectDto GetMediaObjectById(int mediaObjectId, bool includeMetadata)
		{
			using (var repo = new MediaObjectRepository())
			{
				return (includeMetadata ? repo.Where(m => m.MediaObjectId == mediaObjectId, m => m.Metadata).FirstOrDefault() : repo.Find(mediaObjectId));
			}
		}