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 } }); }
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); }
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); }
public RelationshipMLFilterCriterion(Guid role, Guid linkedRole, IEnumerable <Guid> necessaryMIATypeIds, IEnumerable <Guid> optionalMIATypeIds, ISortInformation sortInformation) { _role = role; _linkedRole = linkedRole; _necessaryMIATypeIds = necessaryMIATypeIds; _optionalMIATypeIds = optionalMIATypeIds; _sortInformation = sortInformation; }
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); }
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 } }); }