예제 #1
0
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?   userProfile  = CurrentUserProfile?.ProfileId;
            IFilter linkedFilter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.Or,
                                                                                                  new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE),
                                                                                                  new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100))) :
                                   null;
            IFilter filter = userProfile.HasValue ? BooleanCombinationFilter.CombineFilters(BooleanOperator.And,
                                                                                            new FilteredRelationshipFilter(_role, _linkedRole, await AppendUserFilterAsync(linkedFilter, _necessaryLinkedMias)),
                                                                                            new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE)),
                                                                                            new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.LT, UserDataKeysKnown.GetSortablePlayPercentageString(100)),
                                                                                            new RelationalUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_PERCENTAGE, RelationalOperator.GT, UserDataKeysKnown.GetSortablePlayPercentageString(0))) :
                             new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.EQ, 0);

            ISortInformation sort = userProfile.HasValue ? (ISortInformation) new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending) :
                                    (ISortInformation) new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending);

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SubqueryFilter = GetNavigationFilter(_navigationInitializerType),
                SortInformation = new List <ISortInformation> {
                    sort
                }
            });
        }
예제 #2
0
        protected bool AddDataSortInformation(ISortInformation sortInformation, RequestedAttribute miaIdAttribute, IList <TableJoin> tableJoins, IList <CompiledSortInformation> compiledSortInformation,
                                              IList <BindVar> bindVars, ref BindVar userVar)
        {
            DataSortInformation dataSort = sortInformation as DataSortInformation;

            if (dataSort != null && _userProfileId.HasValue)
            {
                TableQueryData     tqd = new TableQueryData(UserProfileDataManagement.UserProfileDataManagement_SubSchema.USER_MEDIA_ITEM_DATA_TABLE_NAME);
                RequestedAttribute ra  = new RequestedAttribute(tqd, UserProfileDataManagement.UserProfileDataManagement_SubSchema.USER_DATA_VALUE_COL_NAME);
                compiledSortInformation.Add(new CompiledSortInformation(ra, dataSort.Direction));

                if (userVar == null)
                {
                    userVar = new BindVar("UID", _userProfileId.Value, typeof(Guid));
                    bindVars.Add(userVar);
                }
                TableJoin join = new TableJoin("LEFT OUTER JOIN", tqd, new RequestedAttribute(tqd, UserProfileDataManagement.UserProfileDataManagement_SubSchema.USER_PROFILE_ID_COL_NAME), "@" + userVar.Name);
                join.AddCondition(new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), miaIdAttribute);
                join.AddCondition(new RequestedAttribute(tqd, UserProfileDataManagement.UserProfileDataManagement_SubSchema.USER_DATA_KEY_COL_NAME), $"'{dataSort.UserDataKey}'");
                tableJoins.Add(join);

                return(true);
            }
            return(false);
        }
예제 #3
0
        protected bool AddAttributeSortInformation(ISortInformation sortInformation, RequestedAttribute miaIdAttribute, IDictionary <QueryAttribute, RequestedAttribute> requestedAttributes,
                                                   IDictionary <MediaItemAspectMetadata, TableQueryData> miaTypeTableQueries, IDictionary <object, TableQueryData> tableQueries, IList <TableJoin> tableJoins, IList <CompiledSortInformation> compiledSortInformation)
        {
            AttributeSortInformation attributeSort = sortInformation as AttributeSortInformation;

            if (attributeSort != null)
            {
                if (attributeSort.AttributeType.ParentMIAM.IsTransientAspect)
                {
                    return(false);
                }
                if (attributeSort.AttributeType.ParentMIAM is MultipleMediaItemAspectMetadata)
                {
                    return(false);
                }

                MediaItemAspectMetadata.AttributeSpecification attr = attributeSort.AttributeType;
                if (attr.Cardinality != Cardinality.Inline && attr.Cardinality != Cardinality.ManyToOne)
                {
                    // Sorting can only be done for Inline and MTO attributes
                    return(false);
                }

                RequestedAttribute ra;
                RequestSimpleAttribute(new QueryAttribute(attr), tableQueries, tableJoins, "LEFT OUTER JOIN", requestedAttributes,
                                       miaTypeTableQueries, miaIdAttribute, out ra);
                compiledSortInformation.Add(new CompiledSortInformation(ra, attributeSort.Direction));

                return(true);
            }
            return(false);
        }
예제 #4
0
 public RelationshipMLFilterCriterion(Guid role, Guid linkedRole, IEnumerable <Guid> necessaryMIATypeIds, IEnumerable <Guid> optionalMIATypeIds, ISortInformation sortInformation)
 {
     _role                = role;
     _linkedRole          = linkedRole;
     _necessaryMIATypeIds = necessaryMIATypeIds;
     _optionalMIATypeIds  = optionalMIATypeIds;
     _sortInformation     = sortInformation;
 }
예제 #5
0
        protected bool AddChildAggregateAttributeSortInformation(ISortInformation sortInformation, Namespace ns, BindVarNamespace bvNamespace, RequestedAttribute miaIdAttribute, IList <TableJoin> tableJoins,
                                                                 IList <CompiledSortInformation> compiledSortInformation, IList <BindVar> bindVars)
        {
            ChildAggregateAttributeSortInformation childAttributeSort = sortInformation as ChildAggregateAttributeSortInformation;

            if (childAttributeSort != null)
            {
                if (childAttributeSort.ChildAttributeType.ParentMIAM.IsTransientAspect)
                {
                    return(false);
                }

                var relation = _miaManagement.LocallyKnownRelationshipTypes.FirstOrDefault(r => (r.ChildRole == childAttributeSort.ChildRole && r.ParentRole == childAttributeSort.ParentRole));
                if (relation == null)
                {
                    return(false);
                }

                if (!_miaManagement.ManagedMediaItemAspectTypes.TryGetValue(relation.ChildAspectId, out var childMetadata))
                {
                    return(false);
                }

                BindVar roleVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), childAttributeSort.ParentRole, typeof(Guid));
                bindVars.Add(roleVar);
                BindVar linkedRoleVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), childAttributeSort.ChildRole, typeof(Guid));
                bindVars.Add(linkedRoleVar);

                var table     = new TableQueryData($"({BuildRelationshipPart(childAttributeSort, childMetadata, false, roleVar, linkedRoleVar)} UNION {BuildRelationshipPart(childAttributeSort, childMetadata, true, roleVar, linkedRoleVar)})");
                var tableName = table.GetAlias(ns);
                tableJoins.Add(new TableJoin("INNER JOIN", table, $"{tableName}.ID", miaIdAttribute.GetQualifiedName(ns)));

                RequestedAttribute ra = new RequestedAttribute(table, "SORT");
                compiledSortInformation.Add(new CompiledSortInformation(ra, childAttributeSort.Direction));
                return(true);
            }
            return(false);
        }
예제 #6
0
        protected override async Task <MediaItemQuery> CreateQueryAsync()
        {
            Guid?   userProfile = CurrentUserProfile?.ProfileId;
            IFilter filter      = userProfile.HasValue ? await AppendUserFilterAsync(new NotFilter(new EmptyUserDataFilter(userProfile.Value, UserDataKeysKnown.KEY_PLAY_DATE)),
                                                                                     _necessaryMias) : new RelationalFilter(MediaAspect.ATTR_PLAYCOUNT, RelationalOperator.GT, 0);

            IFilter navigationFilter = GetNavigationFilter(_navigationInitializerType);

            if (navigationFilter != null)
            {
                filter = BooleanCombinationFilter.CombineFilters(BooleanOperator.And, filter, navigationFilter);
            }

            ISortInformation sort = userProfile.HasValue ? (ISortInformation) new DataSortInformation(UserDataKeysKnown.KEY_PLAY_DATE, SortDirection.Descending) :
                                    (ISortInformation) new AttributeSortInformation(MediaAspect.ATTR_LASTPLAYED, SortDirection.Descending);

            return(new MediaItemQuery(_necessaryMias, _optionalMias, filter)
            {
                SortInformation = new List <ISortInformation> {
                    sort
                }
            });
        }