Пример #1
0
        protected override void CompileStatementParts(MIA_Management miaManagement, IFilter filter, IFilter subqueryFilter, Namespace ns, BindVarNamespace bvNamespace,
                                                      ICollection <MediaItemAspectMetadata> requiredMIATypes, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins,
                                                      IList <object> resultParts, IList <BindVar> resultBindVars)
        {
            MediaItemIdFilter mediaItemIdFilter = (MediaItemIdFilter)filter;

            bool first = true;

            foreach (IList <Guid> mediaItemIdsCluster in CollectionUtils.Cluster(mediaItemIdFilter.MediaItemIds, MAX_IN_VALUES_SIZE))
            {
                QueryAttribute qa          = new QueryAttribute(RelationshipAspect.ATTR_LINKED_ID);
                IList <string> bindVarRefs = new List <string>(MAX_IN_VALUES_SIZE);
                foreach (Guid mediaItemId in mediaItemIdsCluster)
                {
                    BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemId, typeof(Guid));
                    bindVarRefs.Add("@" + bindVar.Name);
                    resultBindVars.Add(bindVar);
                }
                if (!first)
                {
                    resultParts.Add(" OR ");
                }
                first = false;
                resultParts.Add(qa);
                resultParts.Add(" IN (" + StringUtils.Join(", ", bindVarRefs) + ")");
            }
        }
        public static CompiledGroupedAttributeValueQuery Compile(MIA_Management miaManagement,
                                                                 IEnumerable <Guid> necessaryRequestedMIATypeIDs,
                                                                 MediaItemAspectMetadata.AttributeSpecification selectAttribute, IAttributeFilter selectAttributeFilter,
                                                                 SelectProjectionFunction selectProjectionFunction, Type projectionValueType, IFilter filter)
        {
            IDictionary <Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;

            // If we're doing a complex query, we can optimize if we have an extra select attribute filter, i.e. a restriction
            // on the result set of values. See ComplexAttributeQueryBuilder.GenerateSqlGroupByStatement().
            bool    simpleQuery    = selectAttribute.Cardinality == Cardinality.Inline || selectAttribute.Cardinality == Cardinality.ManyToOne;
            IFilter combinedFilter = simpleQuery ?
                                     BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] { filter, selectAttributeFilter }) : filter;

            selectAttributeFilter = simpleQuery ? null : selectAttributeFilter;

            ICollection <MediaItemAspectMetadata> necessaryMIATypes = new List <MediaItemAspectMetadata>();

            // Raise exception if necessary MIA types are not present
            foreach (Guid miaTypeID in necessaryRequestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    throw new InvalidDataException("Necessary requested MIA type of ID '{0}' is not present in the media library", miaTypeID);
                }
                necessaryMIATypes.Add(miam);
            }
            return(new CompiledGroupedAttributeValueQuery(miaManagement, necessaryMIATypes, selectAttribute, selectAttributeFilter,
                                                          selectProjectionFunction, projectionValueType, combinedFilter));
        }
 public RelationshipQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                                 ICollection <MediaItemAspectMetadata> requiredMIATypes, IFilter filter, int bindVarCount)
     : base(miaManagement, simpleSelectAttributes, null, requiredMIATypes, new List <MediaItemAspectMetadata> {
 }, filter, null)
 {
     _bindVarCount = bindVarCount;
 }
 public CompiledMediaItemQuery(
     MIA_Management miaManagement,
     ICollection <MediaItemAspectMetadata> necessaryRequestedMIAs,
     ICollection <MediaItemAspectMetadata> optionalRequestedMIAs,
     ICollection <MediaItemAspectMetadata> explicitRequestedMIAs,
     IDictionary <MediaItemAspectMetadata.AttributeSpecification, QueryAttribute> mainSelectedAttributes,
     ICollection <MediaItemAspectMetadata.AttributeSpecification> explicitSelectedAttributes,
     IFilter filter, IFilter subqueryFilter, IList <ISortInformation> sortInformation,
     Guid?userProfileId = null,
     uint?limit         = null,
     uint?offset        = null
     )
 {
     _miaManagement            = miaManagement;
     _necessaryRequestedMIAs   = necessaryRequestedMIAs;
     _optionalRequestedMIAs    = optionalRequestedMIAs;
     _explicitRequestedMIAs    = explicitRequestedMIAs;
     _mainSelectAttributes     = mainSelectedAttributes;
     _explicitSelectAttributes = explicitSelectedAttributes;
     _filter          = filter;
     _subqueryFilter  = subqueryFilter;
     _sortInformation = sortInformation;
     _limit           = limit;
     _offset          = offset;
     _userProfileId   = userProfileId;
 }
 public void test(MIA_Management miaManagement, IFilter filter, IFilter subqueryFilter,
                  ICollection <MediaItemAspectMetadata> requiredMIATypes, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins,
                  IList <object> resultParts, IList <BindVar> resultBindVars)
 {
     CompileStatementParts(miaManagement, filter, subqueryFilter, null, new BindVarNamespace(),
                           requiredMIATypes, outerMIIDJoinVariable, tableJoins,
                           resultParts, resultBindVars);
 }
Пример #6
0
 public SubQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                        ICollection <MediaItemAspectMetadata> requiredMIATypes, IFilter filter, IFilter subQueryFilter, int bindVarCount, Guid?userProfileId = null)
     : base(miaManagement, simpleSelectAttributes, null, requiredMIATypes, new List <MediaItemAspectMetadata> {
 },
            filter, subQueryFilter, null, userProfileId)
 {
     _bindVarCount = bindVarCount;
 }
Пример #7
0
 public CompiledCountItemsQuery(MIA_Management miaManagement, IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIATypes,
                                IFilter filter, IFilter subqueryFilter)
 {
     _miaManagement = miaManagement;
     _necessaryRequestedMIATypes = necessaryRequestedMIATypes;
     _filter         = filter;
     _subqueryFilter = subqueryFilter;
 }
Пример #8
0
 public CompiledFilter(MIA_Management miaManagement, IFilter filter, Namespace ns, BindVarNamespace bvNamespace, string outerMIIDJoinVariable, ICollection<TableJoin> tableJoins)
 {
   _statementParts = new List<object>();
   _statementBindVars = new List<BindVar>();
   _requiredMIATypes = new List<MediaItemAspectMetadata>();
   CompileStatementParts(miaManagement, filter, ns, bvNamespace, _requiredMIATypes, outerMIIDJoinVariable, tableJoins,
       _statementParts, _statementBindVars);
   _requiredAttributes = _statementParts.OfType<QueryAttribute>().ToList();
 }
Пример #9
0
 public MIAQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                        SelectProjectionFunction selectProjectionFunction,
                        IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIAs, IEnumerable <MediaItemAspectMetadata> optionalRequestedMIAs,
                        IFilter filter, IFilter subqueryFilter, IList <ISortInformation> sortInformation, Guid?userProfileId = null) : base(miaManagement, simpleSelectAttributes,
                                                                                                                                            selectProjectionFunction,
                                                                                                                                            necessaryRequestedMIAs, optionalRequestedMIAs,
                                                                                                                                            filter, subqueryFilter, sortInformation, userProfileId)
 {
 }
Пример #10
0
 public CompiledFilter(MIA_Management miaManagement, IFilter filter, IFilter subqueryFilter, Namespace ns, BindVarNamespace bvNamespace, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins)
 {
     _statementParts    = new List <object>();
     _statementBindVars = new List <BindVar>();
     _requiredMIATypes  = new List <MediaItemAspectMetadata>();
     CompileStatementParts(miaManagement, filter, subqueryFilter, ns, bvNamespace, _requiredMIATypes, outerMIIDJoinVariable, tableJoins,
                           _statementParts, _statementBindVars);
     _requiredAttributes = _statementParts.OfType <QueryAttribute>().ToList();
 }
 /// <summary>
 /// Creates a new <see cref="ComplexAttributeQueryBuilder"/> instance.
 /// </summary>
 /// <param name="miaManagement">MIAM management instance from media library.</param>
 /// <param name="complexQueryAttribute">Complex attribute, which is requested by this query. Only attributes
 /// with a cardinality different from <see cref="Cardinality.Inline"/> are allowed here.</param>
 /// <param name="selectProjectionFunction">This delegate function will be called for the selected attribute.
 /// It must return an SQL projection expression whose return value is the requested value for that attribute.
 /// If this delegate function is <c>null</c>, the actual attribute is selected without a projection function.</param>
 /// <param name="necessaryRequestedMIAs">MIAs which must be present for the media item to match the query.</param>
 /// <param name="filter">Filter which must be applied to the media items to match the query.</param>
 public ComplexAttributeQueryBuilder(
     MIA_Management miaManagement,
     MediaItemAspectMetadata.AttributeSpecification complexQueryAttribute,
     SelectProjectionFunction selectProjectionFunction,
     IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIAs, IFilter filter) : base(miaManagement)
 {
     _queryAttribute           = complexQueryAttribute;
     _selectProjectionFunction = selectProjectionFunction;
     _necessaryRequestedMIAs   = necessaryRequestedMIAs;
     _filter = filter;
 }
Пример #12
0
 public InverseRelationshipQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                                        Guid[] linkedIds)
     : base(miaManagement, simpleSelectAttributes,
            null,
            new List <MediaItemAspectMetadata> {
     RelationshipAspect.Metadata
 }, new List <MediaItemAspectMetadata> {
 },
            new MediaItemIdFilter(linkedIds), null)
 {
 }
 /// <summary>
 /// Creates a new <see cref="ComplexAttributeQueryBuilder"/> instance.
 /// </summary>
 /// <param name="miaManagement">MIAM management instance from media library.</param>
 /// <param name="complexQueryAttribute">Complex attribute, which is requested by this query. Only attributes
 /// with a cardinality different from <see cref="Cardinality.Inline"/> are allowed here.</param>
 /// <param name="selectProjectionFunction">This delegate function will be called for the selected attribute.
 /// It must return an SQL projection expression whose return value is the requested value for that attribute.
 /// If this delegate function is <c>null</c>, the actual attribute is selected without a projection function.</param>
 /// <param name="necessaryRequestedMIAs">MIAs which must be present for the media item to match the query.</param>
 /// <param name="filter">Filter which must be applied to the media items to match the query.</param>
 public ComplexAttributeQueryBuilder(
     MIA_Management miaManagement,
     MediaItemAspectMetadata.AttributeSpecification complexQueryAttribute,
     SelectProjectionFunction selectProjectionFunction,
     IEnumerable<MediaItemAspectMetadata> necessaryRequestedMIAs, IFilter filter) : base(miaManagement)
 {
   _queryAttribute = complexQueryAttribute;
   _selectProjectionFunction = selectProjectionFunction;
   _necessaryRequestedMIAs = necessaryRequestedMIAs;
   _filter = filter;
 }
Пример #14
0
 /// <summary>
 /// Creates a new <see cref="MainQueryBuilder"/> instance.
 /// </summary>
 /// <param name="miaManagement">MIAM management instance from media library.</param>
 /// <param name="simpleSelectAttributes">Enumeration of media item aspect attributes, given as
 /// <see cref="QueryAttribute"/> instances, which should be selected by this main query. Only attributes with
 /// cardinalities of <see cref="Cardinality.Inline"/> and <see cref="Cardinality.ManyToOne"/> are allowed here.
 /// Both necessary and optional attributes are allowed in this enumeration.</param>
 /// <param name="selectProjectionFunction">This delegate function will be called for each selected attribute.
 /// It must return an SQL projection expression whose return value is the requested value for that attribute.
 /// If this delegate function is <c>null</c>, the actual attribute is selected without a projection function.</param>
 /// <param name="necessaryRequestedMIAs">MIAs which must be present for the media item to match the query.</param>
 /// <param name="optionalRequestedMIAs">MIAs which will be returned if they are attached to items which are
 /// already returned.</param>
 /// <param name="filter">Filter to restrict the result set.</param>
 /// <param name="sortInformation">List of sorting criteria.</param>
 public MainQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                         SelectProjectionFunction selectProjectionFunction,
                         IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIAs, IEnumerable <MediaItemAspectMetadata> optionalRequestedMIAs,
                         IFilter filter, IList <SortInformation> sortInformation) : base(miaManagement)
 {
     _necessaryRequestedMIAs   = necessaryRequestedMIAs;
     _optionalRequestedMIAs    = optionalRequestedMIAs;
     _selectAttributes         = new List <QueryAttribute>(simpleSelectAttributes);
     _selectProjectionFunction = selectProjectionFunction;
     _filter          = filter;
     _sortInformation = sortInformation;
 }
Пример #15
0
 public MultipleMIAQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                                MultipleMediaItemAspectMetadata requestedMIA,
                                Guid[] mediaItemIds)
     : base(miaManagement, simpleSelectAttributes,
            null,
            new List <MediaItemAspectMetadata> {
     requestedMIA
 }, new List <MediaItemAspectMetadata> {
 },
            new MediaItemIdFilter(mediaItemIds), null, null)
 {
 }
 public CompiledGroupedAttributeValueQuery(
     MIA_Management miaManagement,
     IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIATypes,
     MediaItemAspectMetadata.AttributeSpecification selectedAttribute, IAttributeFilter selectAttributeFilter,
     SelectProjectionFunction selectProjectionFunction, Type projectionValueType,
     IFilter filter)
 {
     _miaManagement = miaManagement;
     _necessaryRequestedMIATypes = necessaryRequestedMIATypes;
     _selectAttribute            = selectedAttribute;
     _selectAttributeFilter      = selectAttributeFilter;
     _selectProjectionFunction   = selectProjectionFunction;
     _projectionValueType        = projectionValueType;
     _filter = filter;
 }
 public CompiledGroupedAttributeValueQuery(
     MIA_Management miaManagement,
     IEnumerable<MediaItemAspectMetadata> necessaryRequestedMIATypes,
     MediaItemAspectMetadata.AttributeSpecification selectedAttribute, IAttributeFilter selectAttributeFilter,
     SelectProjectionFunction selectProjectionFunction, Type projectionValueType,
     IFilter filter)
 {
   _miaManagement = miaManagement;
   _necessaryRequestedMIATypes = necessaryRequestedMIATypes;
   _selectAttribute = selectedAttribute;
   _selectAttributeFilter = selectAttributeFilter;
   _selectProjectionFunction = selectProjectionFunction;
   _projectionValueType = projectionValueType;
   _filter = filter;
 }
 public static CompiledCountItemsQuery Compile(MIA_Management miaManagement,
     IEnumerable<Guid> necessaryRequestedMIATypeIDs, IFilter filter)
 {
   IDictionary<Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;
   ICollection<MediaItemAspectMetadata> necessaryMIATypes = new List<MediaItemAspectMetadata>();
   // Raise exception if necessary MIA types are not present
   foreach (Guid miaTypeID in necessaryRequestedMIATypeIDs)
   {
     MediaItemAspectMetadata miam;
     if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
       throw new InvalidDataException("Necessary requested MIA type of ID '{0}' is not present in the media library", miaTypeID);
     necessaryMIATypes.Add(miam);
   }
   return new CompiledCountItemsQuery(miaManagement, necessaryMIATypes, filter);
 }
 public CompiledMediaItemQuery(
     MIA_Management miaManagement,
     ICollection<MediaItemAspectMetadata> necessaryRequestedMIAs,
     ICollection<MediaItemAspectMetadata> optionalRequestedMIAs,
     IDictionary<MediaItemAspectMetadata.AttributeSpecification, QueryAttribute> mainSelectedAttributes,
     ICollection<MediaItemAspectMetadata.AttributeSpecification> explicitSelectedAttributes,
     IFilter filter, IList<SortInformation> sortInformation)
 {
   _miaManagement = miaManagement;
   _necessaryRequestedMIAs = necessaryRequestedMIAs;
   _optionalRequestedMIAs = optionalRequestedMIAs;
   _mainSelectAttributes = mainSelectedAttributes;
   _explicitSelectAttributes = explicitSelectedAttributes;
   _filter = filter;
   _sortInformation = sortInformation;
 }
Пример #20
0
 public CompiledMediaItemQuery(
     MIA_Management miaManagement,
     ICollection <MediaItemAspectMetadata> necessaryRequestedMIAs,
     ICollection <MediaItemAspectMetadata> optionalRequestedMIAs,
     IDictionary <MediaItemAspectMetadata.AttributeSpecification, QueryAttribute> mainSelectedAttributes,
     ICollection <MediaItemAspectMetadata.AttributeSpecification> explicitSelectedAttributes,
     IFilter filter, IList <SortInformation> sortInformation)
 {
     _miaManagement            = miaManagement;
     _necessaryRequestedMIAs   = necessaryRequestedMIAs;
     _optionalRequestedMIAs    = optionalRequestedMIAs;
     _mainSelectAttributes     = mainSelectedAttributes;
     _explicitSelectAttributes = explicitSelectedAttributes;
     _filter          = filter;
     _sortInformation = sortInformation;
 }
Пример #21
0
 /// <summary>
 /// Creates a new <see cref="MainQueryBuilder"/> instance.
 /// </summary>
 /// <param name="miaManagement">MIAM management instance from media library.</param>
 /// <param name="simpleSelectAttributes">Enumeration of media item aspect attributes, given as
 /// <see cref="QueryAttribute"/> instances, which should be selected by this main query. Only attributes with
 /// cardinalities of <see cref="Cardinality.Inline"/> and <see cref="Cardinality.ManyToOne"/> are allowed here.
 /// Both necessary and optional attributes are allowed in this enumeration.</param>
 /// <param name="selectProjectionFunction">This delegate function will be called for each selected attribute.
 /// It must return an SQL projection expression whose return value is the requested value for that attribute.
 /// If this delegate function is <c>null</c>, the actual attribute is selected without a projection function.</param>
 /// <param name="necessaryRequestedMIAs">MIAs which must be present for the media item to match the query.</param>
 /// <param name="optionalRequestedMIAs">MIAs which will be returned if they are attached to items which are
 /// already returned.</param>
 /// <param name="filter">Filter to restrict the result set.</param>
 /// <param name="sortInformation">List of sorting criteria.</param>
 public MainQueryBuilder(MIA_Management miaManagement, IEnumerable <QueryAttribute> simpleSelectAttributes,
                         SelectProjectionFunction selectProjectionFunction,
                         IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIAs, IEnumerable <MediaItemAspectMetadata> optionalRequestedMIAs,
                         IFilter filter, IFilter subqueryFilter, IList <ISortInformation> sortInformation, Guid?userProfileId = null, uint?limit = null, uint?offset = null)
     : base(miaManagement)
 {
     _necessaryRequestedMIAs   = necessaryRequestedMIAs;
     _optionalRequestedMIAs    = optionalRequestedMIAs;
     _selectAttributes         = new List <QueryAttribute>(simpleSelectAttributes);
     _selectProjectionFunction = selectProjectionFunction;
     _filter          = filter;
     _subqueryFilter  = subqueryFilter;
     _sortInformation = sortInformation;
     _limit           = limit;
     _offset          = offset;
     _userProfileId   = userProfileId;
 }
        public static CompiledCountItemsQuery Compile(MIA_Management miaManagement,
                                                      IEnumerable <Guid> necessaryRequestedMIATypeIDs, IFilter filter)
        {
            IDictionary <Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;
            ICollection <MediaItemAspectMetadata>       necessaryMIATypes = new List <MediaItemAspectMetadata>();

            // Raise exception if necessary MIA types are not present
            foreach (Guid miaTypeID in necessaryRequestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    throw new InvalidDataException("Necessary requested MIA type of ID '{0}' is not present in the media library", miaTypeID);
                }
                necessaryMIATypes.Add(miam);
            }
            return(new CompiledCountItemsQuery(miaManagement, necessaryMIATypes, filter));
        }
Пример #23
0
        /// <summary>
        /// Builds a subquery that returns the ids of the media items returned by the <paramref name="filter"/>.
        /// </summary>
        /// <param name="filter">Relationship filter instance to create the sub query for.</param>
        /// <param name="subqueryFilter">Additional filter to apply to all subqueries.</param>
        /// <param name="miaManagement">MIA_Management instance to generate attribute column names.</param>
        /// <param name="bvNamespace">Namespace used to build bind var names.</param>
        /// <param name="resultParts">Statement parts for the filter.</param>
        /// <param name="resultBindVars">Bind variables for the filter.</param>
        public static void BuildRelationshipSubquery(AbstractRelationshipFilter filter, IFilter subqueryFilter, MIA_Management miaManagement,
                                                     BindVarNamespace bvNamespace, IList <object> resultParts, IList <BindVar> resultBindVars)
        {
            //Simple relationship filter with linked id
            BindVar            linkedIdVar        = null;
            RelationshipFilter relationshipFilter = filter as RelationshipFilter;

            if (relationshipFilter != null && relationshipFilter.LinkedMediaItemId != Guid.Empty)
            {
                linkedIdVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), relationshipFilter.LinkedMediaItemId, typeof(Guid));
                resultBindVars.Add(linkedIdVar);
            }

            //Role
            BindVar roleVar = null;

            if (filter.Role != Guid.Empty)
            {
                roleVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), filter.Role, typeof(Guid));
                resultBindVars.Add(roleVar);
            }

            //Linked role
            BindVar linkedRoleVar = null;

            if (filter.LinkedRole != Guid.Empty)
            {
                linkedRoleVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), filter.LinkedRole, typeof(Guid));
                resultBindVars.Add(linkedRoleVar);
            }

            //Complex relationship filter with linked filter
            string                     sqlStatement = null;
            IList <BindVar>            bindVars     = null;
            FilteredRelationshipFilter filteredRelationshipFilter = filter as FilteredRelationshipFilter;

            if (filteredRelationshipFilter != null && filteredRelationshipFilter.Filter != null)
            {
                //Build a sub query for the linked filter
                string idAlias = null;
                ICollection <QueryAttribute> requiredAttributes = new List <QueryAttribute>();
                SubQueryBuilder filterBuilder = new SubQueryBuilder(miaManagement, requiredAttributes,
                                                                    new List <MediaItemAspectMetadata>(), filteredRelationshipFilter.Filter, subqueryFilter, bvNamespace.BindVarCounter);
                filterBuilder.GenerateSqlStatement(out idAlias, out sqlStatement, out bindVars);
                sqlStatement = " SELECT TS." + idAlias + " FROM (" + sqlStatement + ") TS";

                bvNamespace.BindVarCounter += bindVars.Count;
                CollectionUtils.AddAll(resultBindVars, bindVars);
            }

            //Relationships are only stored for one party in the relationship so we need to union the query with a query
            //that reverses the relationship to ensure that all relationships are selected
            BuildRelationshipSubqueryPart(roleVar, linkedRoleVar, linkedIdVar, sqlStatement, false, miaManagement, resultParts);
            resultParts.Add(" UNION ");
            BuildRelationshipSubqueryPart(roleVar, linkedRoleVar, linkedIdVar, sqlStatement, true, miaManagement, resultParts);
        }
Пример #24
0
        public static void BuildRelationshipSubqueryPart(BindVar roleVar, BindVar linkedRoleVar, BindVar linkedIdVar, string sqlStatement, bool reverse,
                                                         MIA_Management miaManagement, IList <object> resultParts)
        {
            string selectColumn;
            string roleColumn;
            string linkedRoleColumn;
            string linkedIdColumn;

            if (reverse)
            {
                //if this is the reverse part, reverse the column names
                selectColumn     = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_LINKED_ID);
                roleColumn       = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_LINKED_ROLE);
                linkedRoleColumn = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_ROLE);
                linkedIdColumn   = MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME;
            }
            else
            {
                selectColumn     = MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME;
                roleColumn       = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_ROLE);
                linkedRoleColumn = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_LINKED_ROLE);
                linkedIdColumn   = miaManagement.GetMIAAttributeColumnName(RelationshipAspect.ATTR_LINKED_ID);
            }

            resultParts.Add("SELECT R1.");
            resultParts.Add(selectColumn);
            resultParts.Add(" FROM ");
            resultParts.Add(miaManagement.GetMIATableName(RelationshipAspect.Metadata));
            resultParts.Add(" R1");

            //Check if we actually have any conditions
            if (roleVar == null && linkedRoleVar == null && linkedIdVar == null && string.IsNullOrEmpty(sqlStatement))
            {
                return;
            }

            resultParts.Add(" WHERE");

            bool hasCondition = false;

            //Linked id
            if (linkedIdVar != null)
            {
                hasCondition = true;
                resultParts.Add(" R1.");
                resultParts.Add(linkedIdColumn);
                resultParts.Add("=@" + linkedIdVar.Name);
            }

            //Role
            if (roleVar != null)
            {
                if (hasCondition)
                {
                    resultParts.Add(" AND");
                }
                hasCondition = true;
                resultParts.Add(" R1.");
                resultParts.Add(roleColumn);
                resultParts.Add("=@" + roleVar.Name);
            }

            //Linked role
            if (linkedRoleVar != null)
            {
                if (hasCondition)
                {
                    resultParts.Add(" AND");
                }
                resultParts.Add(" R1.");
                resultParts.Add(linkedRoleColumn);
                resultParts.Add("=@" + linkedRoleVar.Name);
            }

            //Linked id subquery
            if (!string.IsNullOrEmpty(sqlStatement))
            {
                if (hasCondition)
                {
                    resultParts.Add(" AND");
                }
                hasCondition = true;
                resultParts.Add(" R1." + linkedIdColumn);
                resultParts.Add(" IN(");
                resultParts.Add(sqlStatement);
                resultParts.Add(")");
            }
        }
Пример #25
0
        protected void CompileStatementParts(MIA_Management miaManagement, IFilter filter, Namespace ns, BindVarNamespace bvNamespace,
                                             ICollection <MediaItemAspectMetadata> requiredMIATypes, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins,
                                             IList <object> resultParts, IList <BindVar> resultBindVars)
        {
            if (filter == null)
            {
                return;
            }

            MediaItemIdFilter mediaItemIdFilter = filter as MediaItemIdFilter;

            if (mediaItemIdFilter != null)
            {
                ICollection <Guid> mediaItemIds = mediaItemIdFilter.MediaItemIds;
                if (mediaItemIds.Count == 0)
                {
                    resultParts.Add("1 = 2");
                }
                else
                {
                    if (mediaItemIds.Count == 1)
                    {
                        resultParts.Add(outerMIIDJoinVariable);
                        BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemIds.First(), typeof(Guid));
                        resultParts.Add(" = @" + bindVar.Name);
                        resultBindVars.Add(bindVar);
                    }
                    else
                    {
                        bool first = true;
                        ICollection <string> clusterExpressions = new List <string>();
                        foreach (IList <Guid> mediaItemIdsCluster in CollectionUtils.Cluster(mediaItemIds, MAX_IN_VALUES_SIZE))
                        {
                            IList <string> bindVarRefs = new List <string>(MAX_IN_VALUES_SIZE);
                            foreach (Guid mediaItemId in mediaItemIdsCluster)
                            {
                                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemId, typeof(Guid));
                                bindVarRefs.Add("@" + bindVar.Name);
                                resultBindVars.Add(bindVar);
                            }
                            if (!first)
                            {
                                resultParts.Add(" OR ");
                            }
                            first = false;
                            resultParts.Add(outerMIIDJoinVariable);
                            resultParts.Add(" IN (" + StringUtils.Join(", ", bindVarRefs) + ")");
                        }
                        resultParts.Add(StringUtils.Join(" OR ", clusterExpressions));
                    }
                }
                return;
            }

            BooleanCombinationFilter boolFilter = filter as BooleanCombinationFilter;

            if (boolFilter != null)
            {
                int         numOperands  = boolFilter.Operands.Count;
                IEnumerator enumOperands = boolFilter.Operands.GetEnumerator();
                if (!enumOperands.MoveNext())
                {
                    return;
                }
                if (numOperands > 1)
                {
                    resultParts.Add("(");
                }
                CompileStatementParts(miaManagement, (IFilter)enumOperands.Current, ns, bvNamespace,
                                      requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                while (enumOperands.MoveNext())
                {
                    switch (boolFilter.Operator)
                    {
                    case BooleanOperator.And:
                        resultParts.Add(" AND ");
                        break;

                    case BooleanOperator.Or:
                        resultParts.Add(" OR ");
                        break;

                    default:
                        throw new NotImplementedException(string.Format(
                                                              "Boolean filter operator '{0}' isn't supported by the media library", boolFilter.Operator));
                    }
                    CompileStatementParts(miaManagement, (IFilter)enumOperands.Current, ns, bvNamespace,
                                          requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                }
                if (numOperands > 1)
                {
                    resultParts.Add(")");
                }
                return;
            }

            NotFilter notFilter = filter as NotFilter;

            if (notFilter != null)
            {
                resultParts.Add("NOT (");
                CompileStatementParts(miaManagement, notFilter.InnerFilter, ns, bvNamespace,
                                      requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                resultParts.Add(")");
                return;
            }

            FalseFilter falseFilter = filter as FalseFilter;

            if (falseFilter != null)
            {
                resultParts.Add("1 = 2");
                return;
            }

            // Must be done before checking IAttributeFilter - EmptyFilter is also an IAttributeFilter but must be
            // compiled in a different way
            EmptyFilter emptyFilter = filter as EmptyFilter;

            if (emptyFilter != null)
            {
                MediaItemAspectMetadata.AttributeSpecification attributeType = emptyFilter.AttributeType;
                requiredMIATypes.Add(attributeType.ParentMIAM);
                Cardinality cardinality = attributeType.Cardinality;
                if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
                {
                    resultParts.Add(new QueryAttribute(attributeType));
                    resultParts.Add(" IS NULL"); // MTO attributes are joined with left outer joins and thus can also be checked for NULL
                }
                else if (cardinality == Cardinality.OneToMany)
                {
                    resultParts.Add("NOT EXISTS(");
                    resultParts.Add("SELECT V.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add(" FROM ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
                    resultParts.Add(" V WHERE V.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add("=");
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(")");
                }
                else if (cardinality == Cardinality.ManyToMany)
                {
                    resultParts.Add("NOT EXISTS(");
                    resultParts.Add("SELECT NM.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add(" FROM ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeNMTableName(attributeType));
                    resultParts.Add(" NM INNER JOIN ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
                    resultParts.Add(" V ON NM.");
                    resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
                    resultParts.Add(" = V.");
                    resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
                    resultParts.Add(" WHERE NM.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add("=");
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(")");
                }
                return;
            }

            IAttributeFilter attributeFilter = filter as IAttributeFilter;

            if (attributeFilter != null)
            {
                // For attribute filters, we have to create different kinds of expressions, depending on the
                // cardinality of the attribute to be filtered.
                // For Inline and MTO attributes, we simply create
                //
                // QA [Operator] [Comparison-Value]
                //
                // for OTM attributes, we create
                //
                // INNER JOIN [OTM-Value-Table] V ON V.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
                // WHERE [...] and V.VALUE [Operator] [Comparison-Value])
                //
                // for MTM attributes, we create
                //
                // INNER JOIN [MTM-NM-Table] NM ON NM.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
                // INNER JOIN [MTM-Value-Table] V ON NM.ID = V.ID
                // WHERE [...] AND V.VALUE [Operator] [Comparison-Value])

                MediaItemAspectMetadata.AttributeSpecification attributeType = attributeFilter.AttributeType;
                requiredMIATypes.Add(attributeType.ParentMIAM);
                Cardinality cardinality = attributeType.Cardinality;
                if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
                {
                    BuildAttributeFilterExpression(attributeFilter, new QueryAttribute(attributeType), bvNamespace,
                                                   resultParts, resultBindVars);
                }
                else if (cardinality == Cardinality.OneToMany)
                {
                    string joinTable = miaManagement.GetMIACollectionAttributeTableName(attributeType);
                    string attrName;
                    if (!_innerJoinedTables.TryGetValue(joinTable, out attrName))
                    {
                        TableQueryData tqd = new TableQueryData(joinTable);

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqd,
                                                     new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));
                        attrName = new RequestedAttribute(tqd, MIA_Management.COLL_ATTR_VALUE_COL_NAME).GetQualifiedName(ns);
                        _innerJoinedTables.Add(joinTable, attrName);
                    }
                    BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
                }
                else if (cardinality == Cardinality.ManyToMany)
                {
                    string miaCollectionAttributeNMTableName = miaManagement.GetMIACollectionAttributeNMTableName(attributeType);
                    string attrName;
                    if (!_innerJoinedTables.TryGetValue(miaCollectionAttributeNMTableName, out attrName))
                    {
                        TableQueryData tqdMiaCollectionAttributeNMTable = new TableQueryData(miaCollectionAttributeNMTableName);

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeNMTable,
                                                     new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));

                        TableQueryData tqdMiaCollectionAttributeTable = new TableQueryData(miaManagement.GetMIACollectionAttributeTableName(attributeType));

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeTable,
                                                     new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME),
                                                     new RequestedAttribute(tqdMiaCollectionAttributeTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME)));
                        attrName = tqdMiaCollectionAttributeTable.GetAlias(ns) + "." + MIA_Management.COLL_ATTR_VALUE_COL_NAME;
                        _innerJoinedTables.Add(miaCollectionAttributeNMTableName, attrName);
                    }
                    BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
                }
                return;
            }
            throw new InvalidDataException("Filter type '{0}' isn't supported by the media library", filter.GetType().Name);
        }
Пример #26
0
        protected virtual void CompileStatementParts(MIA_Management miaManagement, IFilter filter, IFilter subqueryFilter, Namespace ns, BindVarNamespace bvNamespace,
                                                     ICollection <MediaItemAspectMetadata> requiredMIATypes, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins,
                                                     IList <object> resultParts, IList <BindVar> resultBindVars)
        {
            if (filter == null)
            {
                return;
            }

            MediaItemIdFilter mediaItemIdFilter = filter as MediaItemIdFilter;

            if (mediaItemIdFilter != null)
            {
                ICollection <Guid> mediaItemIds = mediaItemIdFilter.MediaItemIds;
                if (mediaItemIds.Count == 0)
                {
                    resultParts.Add("1 = 2");
                }
                else
                {
                    if (mediaItemIds.Count == 1)
                    {
                        resultParts.Add(outerMIIDJoinVariable);
                        BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemIds.First(), typeof(Guid));
                        resultParts.Add(" = @" + bindVar.Name);
                        resultBindVars.Add(bindVar);
                    }
                    else
                    {
                        bool first = true;
                        ICollection <string> clusterExpressions = new List <string>();
                        foreach (IList <Guid> mediaItemIdsCluster in CollectionUtils.Cluster(mediaItemIds, MAX_IN_VALUES_SIZE))
                        {
                            IList <string> bindVarRefs = new List <string>(MAX_IN_VALUES_SIZE);
                            foreach (Guid mediaItemId in mediaItemIdsCluster)
                            {
                                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemId, typeof(Guid));
                                bindVarRefs.Add("@" + bindVar.Name);
                                resultBindVars.Add(bindVar);
                            }
                            if (!first)
                            {
                                resultParts.Add(" OR ");
                            }
                            first = false;
                            resultParts.Add(outerMIIDJoinVariable);
                            resultParts.Add(" IN (" + StringUtils.Join(", ", bindVarRefs) + ")");
                        }
                        resultParts.Add(StringUtils.Join(" OR ", clusterExpressions));
                    }
                }
                return;
            }

            BooleanCombinationFilter boolFilter     = filter as BooleanCombinationFilter;
            ICollection <IFilter>    filterOperands = boolFilter?.Operands; //Work on collection reference to avoid chaning original

            if (boolFilter != null && boolFilter.Operator == BooleanOperator.And && boolFilter.Operands.Count > 1 && boolFilter.Operands.ToList().All(x => x is IAttributeFilter))
            {
                ICollection <IFilter> remainingOperands = new List <IFilter>();

                // Special case to do multiple MIA boolean logic first
                IDictionary <Guid, ICollection <IAttributeFilter> > multiGroups = new Dictionary <Guid, ICollection <IAttributeFilter> >();
                foreach (IAttributeFilter operand in filterOperands)
                {
                    MultipleMediaItemAspectMetadata mmiam = operand.AttributeType.ParentMIAM as MultipleMediaItemAspectMetadata;
                    if (mmiam != null)
                    {
                        Guid key = operand.AttributeType.ParentMIAM.AspectId;
                        if (!multiGroups.ContainsKey(key))
                        {
                            multiGroups[key] = new List <IAttributeFilter>();
                        }
                        multiGroups[key].Add(operand);
                    }
                    else
                    {
                        remainingOperands.Add(operand);
                    }
                }

                if (multiGroups.Keys.Count > 0)
                {
                    bool firstGroup = true;
                    foreach (ICollection <IAttributeFilter> filterGroup in multiGroups.Values)
                    {
                        if (firstGroup)
                        {
                            firstGroup = false;
                        }
                        else
                        {
                            resultParts.Add(" AND ");
                        }

                        bool firstItem = true;
                        foreach (IAttributeFilter filterItem in filterGroup)
                        {
                            MediaItemAspectMetadata.AttributeSpecification attributeType = filterItem.AttributeType;
                            if (firstItem)
                            {
                                resultParts.Add(outerMIIDJoinVariable);
                                resultParts.Add(" IN(");
                                resultParts.Add("SELECT ");
                                resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                                resultParts.Add(" FROM ");
                                resultParts.Add(miaManagement.GetMIATableName(attributeType.ParentMIAM));
                                resultParts.Add(" WHERE ");

                                firstItem = false;
                            }
                            else
                            {
                                resultParts.Add(" AND ");
                            }
                            //Empty filter needs to be handled differently to other IAttribute filters
                            if (filterItem is EmptyFilter)
                            {
                                resultParts.Add(miaManagement.GetMIAAttributeColumnName(attributeType));
                                resultParts.Add(" IS NULL");
                            }
                            else
                            {
                                BuildAttributeFilterExpression(filterItem, miaManagement.GetMIAAttributeColumnName(attributeType), bvNamespace, resultParts, resultBindVars);
                            }
                        }
                        resultParts.Add(")");
                    }

                    // Process remaining operands ?
                    if (remainingOperands.Count == 0)
                    {
                        return;
                    }

                    resultParts.Add(" AND ");
                    filterOperands = remainingOperands;
                }
            }
            if (boolFilter != null)
            {
                int         numOperands  = filterOperands.Count;
                IEnumerator enumOperands = filterOperands.GetEnumerator();
                if (!enumOperands.MoveNext())
                {
                    return;
                }
                if (numOperands > 1)
                {
                    resultParts.Add("(");
                }
                CompileStatementParts(miaManagement, (IFilter)enumOperands.Current, subqueryFilter, ns, bvNamespace,
                                      requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                while (enumOperands.MoveNext())
                {
                    switch (boolFilter.Operator)
                    {
                    case BooleanOperator.And:
                        resultParts.Add(" AND ");
                        break;

                    case BooleanOperator.Or:
                        resultParts.Add(" OR ");
                        break;

                    default:
                        throw new NotImplementedException(string.Format(
                                                              "Boolean filter operator '{0}' isn't supported by the media library", boolFilter.Operator));
                    }
                    CompileStatementParts(miaManagement, (IFilter)enumOperands.Current, subqueryFilter, ns, bvNamespace,
                                          requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                }
                if (numOperands > 1)
                {
                    resultParts.Add(")");
                }
                return;
            }

            NotFilter notFilter = filter as NotFilter;

            if (notFilter != null)
            {
                resultParts.Add("NOT (");
                CompileStatementParts(miaManagement, notFilter.InnerFilter, subqueryFilter, ns, bvNamespace,
                                      requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
                resultParts.Add(")");
                return;
            }

            FalseFilter falseFilter = filter as FalseFilter;

            if (falseFilter != null)
            {
                resultParts.Add("1 = 2");
                return;
            }

            // Must be done before checking IAttributeFilter - EmptyFilter is also an IAttributeFilter but must be
            // compiled in a different way
            EmptyFilter emptyFilter = filter as EmptyFilter;

            if (emptyFilter != null)
            {
                MediaItemAspectMetadata.AttributeSpecification attributeType = emptyFilter.AttributeType;
                requiredMIATypes.Add(attributeType.ParentMIAM);
                Cardinality cardinality = attributeType.Cardinality;
                if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
                {
                    resultParts.Add(new QueryAttribute(attributeType));
                    resultParts.Add(" IS NULL"); // MTO attributes are joined with left outer joins and thus can also be checked for NULL
                }
                else if (cardinality == Cardinality.OneToMany)
                {
                    resultParts.Add("NOT EXISTS(");
                    resultParts.Add("SELECT 1");
                    resultParts.Add(" FROM ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
                    resultParts.Add(" V WHERE V.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add("=");
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(")");
                }
                else if (cardinality == Cardinality.ManyToMany)
                {
                    resultParts.Add("NOT EXISTS(");
                    resultParts.Add("SELECT 1");
                    resultParts.Add(" FROM ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeNMTableName(attributeType));
                    resultParts.Add(" NM INNER JOIN ");
                    resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
                    resultParts.Add(" V ON NM.");
                    resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
                    resultParts.Add(" = V.");
                    resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
                    resultParts.Add(" WHERE NM.");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add("=");
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(")");
                }
                return;
            }

            // Must be done before checking IAttributeFilter - EmptyUserDataFilter is also an IAttributeFilter but must be
            // compiled in a different way
            EmptyUserDataFilter emptyUserDataFilter = filter as EmptyUserDataFilter;

            if (emptyUserDataFilter != null)
            {
                BindVar userIdVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), emptyUserDataFilter.UserProfileId, typeof(Guid));

                resultParts.Add("NOT EXISTS(");
                resultParts.Add("SELECT 1");
                resultParts.Add(" FROM ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_MEDIA_ITEM_DATA_TABLE_NAME);
                resultParts.Add(" WHERE ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_PROFILE_ID_COL_NAME);
                resultParts.Add(" = @" + userIdVar.Name);
                resultBindVars.Add(userIdVar);
                resultParts.Add(" AND ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_KEY_COL_NAME);
                resultParts.Add(" = '");
                resultParts.Add(emptyUserDataFilter.UserDataKey);
                resultParts.Add("' AND ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_VALUE_COL_NAME);
                resultParts.Add(" IS NOT NULL ");
                resultParts.Add(" AND ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_VALUE_COL_NAME);
                resultParts.Add(" <> '' ");
                resultParts.Add(" AND ");
                resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                resultParts.Add("=");
                resultParts.Add(outerMIIDJoinVariable);
                resultParts.Add(")");

                return;
            }

            AbstractRelationshipFilter relationshipFilter = filter as AbstractRelationshipFilter;

            if (relationshipFilter != null)
            {
                resultParts.Add(outerMIIDJoinVariable);
                resultParts.Add(" IN(");
                BuildRelationshipSubquery(relationshipFilter, subqueryFilter, miaManagement, bvNamespace, resultParts, resultBindVars);
                resultParts.Add(")");
                return;
            }

            RelationalUserDataFilter relationalUserDataFilter = filter as RelationalUserDataFilter;

            if (relationalUserDataFilter != null)
            {
                BindVar userIdVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), relationalUserDataFilter.UserProfileId, typeof(Guid));
                BindVar bindVar   = new BindVar(bvNamespace.CreateNewBindVarName("V"), relationalUserDataFilter.FilterValue, typeof(string));

                resultParts.Add("(EXISTS(");
                resultParts.Add("SELECT 1");
                resultParts.Add(" FROM ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_MEDIA_ITEM_DATA_TABLE_NAME);
                resultParts.Add(" WHERE ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_PROFILE_ID_COL_NAME);
                resultParts.Add(" = @" + userIdVar.Name);
                resultBindVars.Add(userIdVar);
                resultParts.Add(" AND ");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_KEY_COL_NAME);
                resultParts.Add(" = '");
                resultParts.Add(relationalUserDataFilter.UserDataKey);
                resultParts.Add("' AND (");
                resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_VALUE_COL_NAME);
                switch (relationalUserDataFilter.Operator)
                {
                case RelationalOperator.EQ:
                    resultParts.Add(" = ");
                    break;

                case RelationalOperator.NEQ:
                    resultParts.Add(" <> ");
                    break;

                case RelationalOperator.LT:
                    resultParts.Add(" < ");
                    break;

                case RelationalOperator.LE:
                    resultParts.Add(" <= ");
                    break;

                case RelationalOperator.GT:
                    resultParts.Add(" > ");
                    break;

                case RelationalOperator.GE:
                    resultParts.Add(" >= ");
                    break;

                default:
                    throw new NotImplementedException(string.Format(
                                                          "Relational user data filter operator '{0}' isn't supported by the media library", relationalUserDataFilter.Operator));
                }
                resultParts.Add("@" + bindVar.Name);
                resultBindVars.Add(bindVar);
                if (relationalUserDataFilter.IncludeEmpty)
                {
                    resultParts.Add(" OR ");
                    resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_VALUE_COL_NAME);
                    resultParts.Add(" IS NULL ");
                }
                resultParts.Add(") AND ");
                resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                resultParts.Add("=");
                resultParts.Add(outerMIIDJoinVariable);
                resultParts.Add(")");
                if (relationalUserDataFilter.IncludeEmpty)
                {
                    resultParts.Add(" OR NOT EXISTS(");
                    resultParts.Add("SELECT 1");
                    resultParts.Add(" FROM ");
                    resultParts.Add(UserProfileDataManagement_SubSchema.USER_MEDIA_ITEM_DATA_TABLE_NAME);
                    resultParts.Add(" WHERE ");
                    resultParts.Add(UserProfileDataManagement_SubSchema.USER_PROFILE_ID_COL_NAME);
                    resultParts.Add(" = @" + userIdVar.Name);
                    resultParts.Add(" AND ");
                    resultParts.Add(UserProfileDataManagement_SubSchema.USER_DATA_KEY_COL_NAME);
                    resultParts.Add(" = '");
                    resultParts.Add(relationalUserDataFilter.UserDataKey);
                    resultParts.Add("'");
                    resultParts.Add(" AND ");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add("=");
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(")");
                }
                resultParts.Add(")");
                return;
            }

            IAttributeFilter attributeFilter = filter as IAttributeFilter;

            if (attributeFilter != null)
            {
                MediaItemAspectMetadata.AttributeSpecification attributeType = attributeFilter.AttributeType;
                if (attributeType.ParentMIAM is MultipleMediaItemAspectMetadata)
                {
                    resultParts.Add(outerMIIDJoinVariable);
                    resultParts.Add(" IN(");
                    resultParts.Add("SELECT ");
                    resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
                    resultParts.Add(" FROM ");
                    resultParts.Add(miaManagement.GetMIATableName(attributeType.ParentMIAM));
                    resultParts.Add(" WHERE ");
                    BuildAttributeFilterExpression(attributeFilter, miaManagement.GetMIAAttributeColumnName(attributeType), bvNamespace, resultParts, resultBindVars);
                    resultParts.Add(")");

                    return;
                }

                // For attribute filters, we have to create different kinds of expressions, depending on the
                // cardinality of the attribute to be filtered.
                // For Inline and MTO attributes, we simply create
                //
                // QA [Operator] [Comparison-Value]
                //
                // for OTM attributes, we create
                //
                // INNER JOIN [OTM-Value-Table] V ON V.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
                // WHERE [...] and V.VALUE [Operator] [Comparison-Value])
                //
                // for MTM attributes, we create
                //
                // INNER JOIN [MTM-NM-Table] NM ON NM.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
                // INNER JOIN [MTM-Value-Table] V ON NM.ID = V.ID
                // WHERE [...] AND V.VALUE [Operator] [Comparison-Value])

                requiredMIATypes.Add(attributeType.ParentMIAM);
                Cardinality cardinality = attributeType.Cardinality;
                if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
                {
                    BuildAttributeFilterExpression(attributeFilter, new QueryAttribute(attributeType), bvNamespace,
                                                   resultParts, resultBindVars);
                }
                else if (cardinality == Cardinality.OneToMany)
                {
                    string joinTable = miaManagement.GetMIACollectionAttributeTableName(attributeType);
                    string attrName;
                    if (!_innerJoinedTables.TryGetValue(joinTable, out attrName))
                    {
                        TableQueryData tqd = new TableQueryData(joinTable);

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqd,
                                                     new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));
                        attrName = new RequestedAttribute(tqd, MIA_Management.COLL_ATTR_VALUE_COL_NAME).GetQualifiedName(ns);
                        _innerJoinedTables.Add(joinTable, attrName);
                    }
                    BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
                }
                else if (cardinality == Cardinality.ManyToMany)
                {
                    string miaCollectionAttributeNMTableName = miaManagement.GetMIACollectionAttributeNMTableName(attributeType);
                    string attrName;
                    if (!_innerJoinedTables.TryGetValue(miaCollectionAttributeNMTableName, out attrName))
                    {
                        TableQueryData tqdMiaCollectionAttributeNMTable = new TableQueryData(miaCollectionAttributeNMTableName);

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeNMTable,
                                                     new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));

                        TableQueryData tqdMiaCollectionAttributeTable = new TableQueryData(miaManagement.GetMIACollectionAttributeTableName(attributeType));

                        tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeTable,
                                                     new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME),
                                                     new RequestedAttribute(tqdMiaCollectionAttributeTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME)));
                        attrName = tqdMiaCollectionAttributeTable.GetAlias(ns) + "." + MIA_Management.COLL_ATTR_VALUE_COL_NAME;
                        _innerJoinedTables.Add(miaCollectionAttributeNMTableName, attrName);
                    }
                    BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
                }
                return;
            }
            throw new InvalidDataException("Filter type '{0}' isn't supported by the media library", filter.GetType().Name);
        }
Пример #27
0
 /// <summary>
 /// Creates a table query of the main media item aspect table of the given <paramref name="miaType"/>.
 /// </summary>
 /// <param name="miaManagement">MIA management instance.</param>
 /// <param name="miaType">Type of the MIA to request.</param>
 /// <returns>Table query for the given MIA.</returns>
 public static TableQueryData CreateTableQueryOfMIATable(MIA_Management miaManagement,
     MediaItemAspectMetadata miaType)
 {
   return new TableQueryData(miaManagement.GetMIATableName(miaType));
 }
    public static CompiledMediaItemQuery Compile(MIA_Management miaManagement, MediaItemQuery query)
    {
      IDictionary<Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;
      ICollection<MediaItemAspectMetadata> necessaryMIATypes = new List<MediaItemAspectMetadata>();
      ICollection<MediaItemAspectMetadata> optionalMIATypes = new List<MediaItemAspectMetadata>();
      // Raise exception if necessary MIA types are not present
      foreach (Guid miaTypeID in query.NecessaryRequestedMIATypeIDs)
      {
        MediaItemAspectMetadata miam;
        if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
          throw new InvalidDataException("Necessary requested MIA type '{0}' is not present in the media library", miaTypeID);
        necessaryMIATypes.Add(miam);
      }
      // For optional MIA types, we don't raise an exception if the type is not present
      foreach (Guid miaTypeID in query.OptionalRequestedMIATypeIDs)
      {
        MediaItemAspectMetadata miam;
        if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
          continue;
        optionalMIATypes.Add(miam);
      }

      // Maps (all selected main) MIAM.Attributes to QueryAttributes
      IDictionary<MediaItemAspectMetadata.AttributeSpecification, QueryAttribute> mainSelectedAttributes =
          new Dictionary<MediaItemAspectMetadata.AttributeSpecification, QueryAttribute>();

      // Attributes selected in explicit queries
      ICollection<MediaItemAspectMetadata.AttributeSpecification> explicitSelectAttributes =
          new List<MediaItemAspectMetadata.AttributeSpecification>();

      // Allocate selected attributes to main query and explicit selects
      ICollection<Guid> requestedMIATypeIDs = CollectionUtils.UnionSet(
          query.NecessaryRequestedMIATypeIDs, query.OptionalRequestedMIATypeIDs);
      foreach (Guid miaTypeID in requestedMIATypeIDs)
      {
        MediaItemAspectMetadata miam;
        if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
          // If one of the necessary MIA types is not available, an exception was raised above. So we only
          // come to here if an optional MIA type is not present - simply ignore that.
          continue;
        foreach (MediaItemAspectMetadata.AttributeSpecification attr in miam.AttributeSpecifications.Values)
        {
          if (attr.Cardinality == Cardinality.Inline || attr.Cardinality == Cardinality.ManyToOne)
            mainSelectedAttributes[attr] = new QueryAttribute(attr);
          else
            explicitSelectAttributes.Add(attr);
        }
      }

      return new CompiledMediaItemQuery(miaManagement, necessaryMIATypes, optionalMIATypes,
          mainSelectedAttributes, explicitSelectAttributes, query.Filter, query.SortInformation);
    }
 public CompiledCountItemsQuery(MIA_Management miaManagement, IEnumerable<MediaItemAspectMetadata> necessaryRequestedMIATypes, IFilter filter)
 {
   _miaManagement = miaManagement;
   _necessaryRequestedMIATypes = necessaryRequestedMIATypes;
   _filter = filter;
 }
Пример #30
0
 /// <summary>
 /// Creates a table query of the external table of an attribute of cardinality <see cref="Cardinality.ManyToOne"/>.
 /// </summary>
 /// <param name="miaManagement">MIA management instance.</param>
 /// <param name="spec">Attribute type of cardinality <see cref="Cardinality.ManyToOne"/> whose table should be requested.</param>
 /// <returns>Table query for the table of the given attribute type.</returns>
 public static TableQueryData CreateTableQueryOfMTOTable(MIA_Management miaManagement,
     MediaItemAspectMetadata.AttributeSpecification spec)
 {
   return new TableQueryData(miaManagement.GetMIACollectionAttributeTableName(spec));
 }
    public static CompiledGroupedAttributeValueQuery Compile(MIA_Management miaManagement,
        IEnumerable<Guid> necessaryRequestedMIATypeIDs,
        MediaItemAspectMetadata.AttributeSpecification selectAttribute, IAttributeFilter selectAttributeFilter,
        SelectProjectionFunction selectProjectionFunction, Type projectionValueType, IFilter filter)
    {
      IDictionary<Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;

      // If we're doing a complex query, we can optimize if we have an extra select attribute filter, i.e. a restriction
      // on the result set of values. See ComplexAttributeQueryBuilder.GenerateSqlGroupByStatement().
      bool simpleQuery = selectAttribute.Cardinality == Cardinality.Inline || selectAttribute.Cardinality == Cardinality.ManyToOne;
      IFilter combinedFilter = simpleQuery ?
          BooleanCombinationFilter.CombineFilters(BooleanOperator.And, new IFilter[] {filter, selectAttributeFilter}) : filter;
      selectAttributeFilter = simpleQuery ? null : selectAttributeFilter;

      ICollection<MediaItemAspectMetadata> necessaryMIATypes = new List<MediaItemAspectMetadata>();
      // Raise exception if necessary MIA types are not present
      foreach (Guid miaTypeID in necessaryRequestedMIATypeIDs)
      {
        MediaItemAspectMetadata miam;
        if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
          throw new InvalidDataException("Necessary requested MIA type of ID '{0}' is not present in the media library", miaTypeID);
        necessaryMIATypes.Add(miam);
      }
      return new CompiledGroupedAttributeValueQuery(miaManagement, necessaryMIATypes, selectAttribute, selectAttributeFilter,
          selectProjectionFunction, projectionValueType, combinedFilter);
    }
Пример #32
0
 public PreparedStatements(MIA_Management miaManagement)
 {
     _miaManagement = miaManagement;
 }
Пример #33
0
 /// <summary>
 /// Creates a table query of the main media item aspect table of the given <paramref name="miaType"/>.
 /// </summary>
 /// <param name="miaManagement">MIA management instance.</param>
 /// <param name="miaType">Type of the MIA to request.</param>
 /// <returns>Table query for the given MIA.</returns>
 public static TableQueryData CreateTableQueryOfMIATable(MIA_Management miaManagement,
                                                         MediaItemAspectMetadata miaType)
 {
     return(new TableQueryData(miaManagement.GetMIATableName(miaType)));
 }
Пример #34
0
 public BaseQueryBuilder(MIA_Management miaManagement)
 {
   _miaManagement = miaManagement;
 }
Пример #35
0
 /// <summary>
 /// Creates a table query of the external table of an attribute of cardinality <see cref="Cardinality.ManyToOne"/>.
 /// </summary>
 /// <param name="miaManagement">MIA management instance.</param>
 /// <param name="spec">Attribute type of cardinality <see cref="Cardinality.ManyToOne"/> whose table should be requested.</param>
 /// <returns>Table query for the table of the given attribute type.</returns>
 public static TableQueryData CreateTableQueryOfMTOTable(MIA_Management miaManagement,
                                                         MediaItemAspectMetadata.AttributeSpecification spec)
 {
     return(new TableQueryData(miaManagement.GetMIACollectionAttributeTableName(spec)));
 }
Пример #36
0
 public InverseRelationshipCompiledFilter(MIA_Management miaManagement, MediaItemIdFilter filter, IFilter subqueryFilter, Namespace ns, BindVarNamespace bvNamespace, string outerMIIDJoinVariable, ICollection <TableJoin> tableJoins)
     : base(miaManagement, filter, subqueryFilter, ns, bvNamespace, outerMIIDJoinVariable, tableJoins)
 {
 }
Пример #37
0
    protected void CompileStatementParts(MIA_Management miaManagement, IFilter filter, Namespace ns, BindVarNamespace bvNamespace,
        ICollection<MediaItemAspectMetadata> requiredMIATypes, string outerMIIDJoinVariable, ICollection<TableJoin> tableJoins,
        IList<object> resultParts, IList<BindVar> resultBindVars)
    {
      if (filter == null)
        return;

      MediaItemIdFilter mediaItemIdFilter = filter as MediaItemIdFilter;
      if (mediaItemIdFilter != null)
      {
        ICollection<Guid> mediaItemIds = mediaItemIdFilter.MediaItemIds;
        if (mediaItemIds.Count == 0)
          resultParts.Add("1 = 2");
        else
        {
          if (mediaItemIds.Count == 1)
          {
            resultParts.Add(outerMIIDJoinVariable);
            BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemIds.First(), typeof(Guid));
            resultParts.Add(" = @" + bindVar.Name);
            resultBindVars.Add(bindVar);
          }
          else
          {
            bool first = true;
            ICollection<string> clusterExpressions = new List<string>();
            foreach (IList<Guid> mediaItemIdsCluster in CollectionUtils.Cluster(mediaItemIds, MAX_IN_VALUES_SIZE))
            {
              IList<string> bindVarRefs = new List<string>(MAX_IN_VALUES_SIZE);
              foreach (Guid mediaItemId in mediaItemIdsCluster)
              {
                BindVar bindVar = new BindVar(bvNamespace.CreateNewBindVarName("V"), mediaItemId, typeof(Guid));
                bindVarRefs.Add("@" + bindVar.Name);
                resultBindVars.Add(bindVar);
              }
              if (!first)
                resultParts.Add(" OR ");
              first = false;
              resultParts.Add(outerMIIDJoinVariable);
              resultParts.Add(" IN (" + StringUtils.Join(", ", bindVarRefs) + ")");
            }
            resultParts.Add(StringUtils.Join(" OR ", clusterExpressions));
          }
        }
        return;
      }

      BooleanCombinationFilter boolFilter = filter as BooleanCombinationFilter;
      if (boolFilter != null)
      {
        int numOperands = boolFilter.Operands.Count;
        IEnumerator enumOperands = boolFilter.Operands.GetEnumerator();
        if (!enumOperands.MoveNext())
          return;
        if (numOperands > 1)
          resultParts.Add("(");
        CompileStatementParts(miaManagement, (IFilter) enumOperands.Current, ns, bvNamespace,
            requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
        while (enumOperands.MoveNext())
        {
          switch (boolFilter.Operator)
          {
            case BooleanOperator.And:
              resultParts.Add(" AND ");
              break;
            case BooleanOperator.Or:
              resultParts.Add(" OR ");
              break;
            default:
              throw new NotImplementedException(string.Format(
                  "Boolean filter operator '{0}' isn't supported by the media library", boolFilter.Operator));
          }
          CompileStatementParts(miaManagement, (IFilter) enumOperands.Current, ns, bvNamespace,
              requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
        }
        if (numOperands > 1)
          resultParts.Add(")");
        return;
      }

      NotFilter notFilter = filter as NotFilter;
      if (notFilter != null)
      {
        resultParts.Add("NOT (");
        CompileStatementParts(miaManagement, notFilter.InnerFilter, ns, bvNamespace,
            requiredMIATypes, outerMIIDJoinVariable, tableJoins, resultParts, resultBindVars);
        resultParts.Add(")");
        return;
      }

      FalseFilter falseFilter = filter as FalseFilter;
      if (falseFilter != null)
      {
        resultParts.Add("1 = 2");
        return;
      }

      // Must be done before checking IAttributeFilter - EmptyFilter is also an IAttributeFilter but must be
      // compiled in a different way
      EmptyFilter emptyFilter = filter as EmptyFilter;
      if (emptyFilter != null)
      {
        MediaItemAspectMetadata.AttributeSpecification attributeType = emptyFilter.AttributeType;
        requiredMIATypes.Add(attributeType.ParentMIAM);
        Cardinality cardinality = attributeType.Cardinality;
        if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
        {
          resultParts.Add(new QueryAttribute(attributeType));
          resultParts.Add(" IS NULL"); // MTO attributes are joined with left outer joins and thus can also be checked for NULL
        }
        else if (cardinality == Cardinality.OneToMany)
        {
          resultParts.Add("NOT EXISTS(");
          resultParts.Add("SELECT V.");
          resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
          resultParts.Add(" FROM ");
          resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
          resultParts.Add(" V WHERE V.");
          resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
          resultParts.Add("=");
          resultParts.Add(outerMIIDJoinVariable);
          resultParts.Add(")");
        }
        else if (cardinality == Cardinality.ManyToMany)
        {
          resultParts.Add("NOT EXISTS(");
          resultParts.Add("SELECT NM.");
          resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
          resultParts.Add(" FROM ");
          resultParts.Add(miaManagement.GetMIACollectionAttributeNMTableName(attributeType));
          resultParts.Add(" NM INNER JOIN ");
          resultParts.Add(miaManagement.GetMIACollectionAttributeTableName(attributeType));
          resultParts.Add(" V ON NM.");
          resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
          resultParts.Add(" = V.");
          resultParts.Add(MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME);
          resultParts.Add(" WHERE NM.");
          resultParts.Add(MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);
          resultParts.Add("=");
          resultParts.Add(outerMIIDJoinVariable);
          resultParts.Add(")");
        }
        return;
      }

      IAttributeFilter attributeFilter = filter as IAttributeFilter;
      if (attributeFilter != null)
      {
        // For attribute filters, we have to create different kinds of expressions, depending on the
        // cardinality of the attribute to be filtered.
        // For Inline and MTO attributes, we simply create
        //
        // QA [Operator] [Comparison-Value]
        //
        // for OTM attributes, we create
        //
        // INNER JOIN [OTM-Value-Table] V ON V.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
        // WHERE [...] and V.VALUE [Operator] [Comparison-Value])
        //
        // for MTM attributes, we create
        //
        // INNER JOIN [MTM-NM-Table] NM ON NM.MEDIA_ITEM_ID=[Outer-Join-Variable-Placeholder]
        // INNER JOIN [MTM-Value-Table] V ON NM.ID = V.ID
        // WHERE [...] AND V.VALUE [Operator] [Comparison-Value])

        MediaItemAspectMetadata.AttributeSpecification attributeType = attributeFilter.AttributeType;
        requiredMIATypes.Add(attributeType.ParentMIAM);
        Cardinality cardinality = attributeType.Cardinality;
        if (cardinality == Cardinality.Inline || cardinality == Cardinality.ManyToOne)
          BuildAttributeFilterExpression(attributeFilter, new QueryAttribute(attributeType), bvNamespace,
              resultParts, resultBindVars);
        else if (cardinality == Cardinality.OneToMany)
        {
          string joinTable = miaManagement.GetMIACollectionAttributeTableName(attributeType);
          string attrName;
          if (!_innerJoinedTables.TryGetValue(joinTable, out attrName))
          {
            TableQueryData tqd = new TableQueryData(joinTable);

            tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqd,
                new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));
            attrName = new RequestedAttribute(tqd, MIA_Management.COLL_ATTR_VALUE_COL_NAME).GetQualifiedName(ns);
            _innerJoinedTables.Add(joinTable, attrName);
          }
          BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
        }
        else if (cardinality == Cardinality.ManyToMany)
        {
          string miaCollectionAttributeNMTableName = miaManagement.GetMIACollectionAttributeNMTableName(attributeType);
          string attrName;
          if (!_innerJoinedTables.TryGetValue(miaCollectionAttributeNMTableName, out attrName))
          {
            TableQueryData tqdMiaCollectionAttributeNMTable = new TableQueryData(miaCollectionAttributeNMTableName);

            tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeNMTable,
                new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), outerMIIDJoinVariable));

            TableQueryData tqdMiaCollectionAttributeTable = new TableQueryData(miaManagement.GetMIACollectionAttributeTableName(attributeType));

            tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqdMiaCollectionAttributeTable,
                new RequestedAttribute(tqdMiaCollectionAttributeNMTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME),
                new RequestedAttribute(tqdMiaCollectionAttributeTable, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME)));
            attrName = tqdMiaCollectionAttributeTable.GetAlias(ns) + "." + MIA_Management.COLL_ATTR_VALUE_COL_NAME;
            _innerJoinedTables.Add(miaCollectionAttributeNMTableName, attrName);
          }
          BuildAttributeFilterExpression(attributeFilter, attrName, bvNamespace, resultParts, resultBindVars);
        }
        return;
      }
      throw new InvalidDataException("Filter type '{0}' isn't supported by the media library", filter.GetType().Name);
    }
Пример #38
0
        public static CompiledMediaItemQuery Compile(MIA_Management miaManagement, MediaItemQuery query)
        {
            IDictionary <Guid, MediaItemAspectMetadata> availableMIATypes = miaManagement.ManagedMediaItemAspectTypes;
            ICollection <MediaItemAspectMetadata>       necessaryMIATypes = new List <MediaItemAspectMetadata>();
            ICollection <MediaItemAspectMetadata>       optionalMIATypes  = new List <MediaItemAspectMetadata>();

            // Raise exception if necessary MIA types are not present
            foreach (Guid miaTypeID in query.NecessaryRequestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    throw new InvalidDataException("Necessary requested MIA type '{0}' is not present in the media library", miaTypeID);
                }
                necessaryMIATypes.Add(miam);
            }
            // For optional MIA types, we don't raise an exception if the type is not present
            foreach (Guid miaTypeID in query.OptionalRequestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    continue;
                }
                optionalMIATypes.Add(miam);
            }

            // Maps (all selected main) MIAM.Attributes to QueryAttributes
            IDictionary <MediaItemAspectMetadata.AttributeSpecification, QueryAttribute> mainSelectedAttributes =
                new Dictionary <MediaItemAspectMetadata.AttributeSpecification, QueryAttribute>();

            // Attributes selected in explicit queries
            ICollection <MediaItemAspectMetadata.AttributeSpecification> explicitSelectAttributes =
                new List <MediaItemAspectMetadata.AttributeSpecification>();

            // Allocate selected attributes to main query and explicit selects
            ICollection <Guid> requestedMIATypeIDs = CollectionUtils.UnionSet(
                query.NecessaryRequestedMIATypeIDs, query.OptionalRequestedMIATypeIDs);

            foreach (Guid miaTypeID in requestedMIATypeIDs)
            {
                MediaItemAspectMetadata miam;
                if (!availableMIATypes.TryGetValue(miaTypeID, out miam))
                {
                    // If one of the necessary MIA types is not available, an exception was raised above. So we only
                    // come to here if an optional MIA type is not present - simply ignore that.
                    continue;
                }
                foreach (MediaItemAspectMetadata.AttributeSpecification attr in miam.AttributeSpecifications.Values)
                {
                    if (attr.Cardinality == Cardinality.Inline || attr.Cardinality == Cardinality.ManyToOne)
                    {
                        mainSelectedAttributes[attr] = new QueryAttribute(attr);
                    }
                    else
                    {
                        explicitSelectAttributes.Add(attr);
                    }
                }
            }

            return(new CompiledMediaItemQuery(miaManagement, necessaryMIATypes, optionalMIATypes,
                                              mainSelectedAttributes, explicitSelectAttributes, query.Filter, query.SortInformation));
        }
Пример #39
0
        protected DatabaseMigrationManager GetMiaMigrationManager(Guid miaId, string miaName)
        {
            if (_miaManagement == null)
            {
                _miaManagement = new MIA_Management();
            }

            //Check if table for mia can be found
            var    metaData  = _miaManagement.GetMediaItemAspectMetadata(miaId);
            string tableName = _miaManagement.GetMIATableName(metaData);

            if (string.IsNullOrEmpty(tableName))
            {
                return(null);
            }

            //Check if backup table exists
            ISQLDatabase database = ServiceRegistration.Get <ISQLDatabase>(false);

            if (!database.TableExists($"{tableName}{BACKUP_TABLE_SUFFIX}"))
            {
                return(null);
            }

            //Add main table
            IDictionary <string, IList <string> > defaultScriptPlaceholderTables = new Dictionary <string, IList <string> >();

            defaultScriptPlaceholderTables.Add(MIA_TABLE_PLACEHOLDER, new List <string> {
                tableName
            });

            //Add collection tables
            foreach (var attribute in metaData.AttributeSpecifications)
            {
                if (attribute.Value.IsCollectionAttribute)
                {
                    if (attribute.Value.Cardinality == Common.MediaManagement.Cardinality.OneToMany ||
                        attribute.Value.Cardinality == Common.MediaManagement.Cardinality.ManyToMany)
                    {
                        tableName = _miaManagement.GetMIACollectionAttributeTableName(attribute.Value);
                        if (string.IsNullOrEmpty(tableName))
                        {
                            continue;
                        }
                        if (!database.TableExists($"{tableName}{BACKUP_TABLE_SUFFIX}"))
                        {
                            continue;
                        }

                        if (!defaultScriptPlaceholderTables.ContainsKey(MIA_V_TABLE_PLACEHOLDER))
                        {
                            defaultScriptPlaceholderTables.Add(MIA_V_TABLE_PLACEHOLDER, new List <string>());
                        }
                        defaultScriptPlaceholderTables[MIA_V_TABLE_PLACEHOLDER].Add(tableName);
                    }
                    if (attribute.Value.Cardinality == Common.MediaManagement.Cardinality.ManyToMany)
                    {
                        tableName = _miaManagement.GetMIACollectionAttributeNMTableName(attribute.Value);
                        if (string.IsNullOrEmpty(tableName))
                        {
                            continue;
                        }
                        if (!database.TableExists($"{tableName}{BACKUP_TABLE_SUFFIX}"))
                        {
                            continue;
                        }

                        if (!defaultScriptPlaceholderTables.ContainsKey(MIA_NM_TABLE_PLACEHOLDER))
                        {
                            defaultScriptPlaceholderTables.Add(MIA_NM_TABLE_PLACEHOLDER, new List <string>());
                        }
                        defaultScriptPlaceholderTables[MIA_NM_TABLE_PLACEHOLDER].Add(tableName);
                    }
                }
            }

            DatabaseMigrationManager manager = new DatabaseMigrationManager(miaName, "DefaultAspect", defaultScriptPlaceholderTables);

            manager.AddDirectory(MediaPortal_Basis_Schema.DatabaseUpgradeScriptDirectory);
            return(manager);
        }
Пример #40
0
 public BaseQueryBuilder(MIA_Management miaManagement)
 {
     _miaManagement = miaManagement;
 }
Пример #41
0
 /// <summary>
 /// Creates a new <see cref="MainQueryBuilder"/> instance.
 /// </summary>
 /// <param name="miaManagement">MIAM management instance from media library.</param>
 /// <param name="simpleSelectAttributes">Enumeration of media item aspect attributes, given as
 /// <see cref="QueryAttribute"/> instances, which should be selected by this main query. Only attributes with
 /// cardinalities of <see cref="Cardinality.Inline"/> and <see cref="Cardinality.ManyToOne"/> are allowed here.
 /// Both necessary and optional attributes are allowed in this enumeration.</param>
 /// <param name="selectProjectionFunction">This delegate function will be called for each selected attribute.
 /// It must return an SQL projection expression whose return value is the requested value for that attribute.
 /// If this delegate function is <c>null</c>, the actual attribute is selected without a projection function.</param>
 /// <param name="necessaryRequestedMIAs">MIAs which must be present for the media item to match the query.</param>
 /// <param name="optionalRequestedMIAs">MIAs which will be returned if they are attached to items which are
 /// already returned.</param>
 /// <param name="filter">Filter to restrict the result set.</param>
 /// <param name="sortInformation">List of sorting criteria.</param>
 public MainQueryBuilder(MIA_Management miaManagement, IEnumerable<QueryAttribute> simpleSelectAttributes,
     SelectProjectionFunction selectProjectionFunction,
     IEnumerable<MediaItemAspectMetadata> necessaryRequestedMIAs, IEnumerable<MediaItemAspectMetadata> optionalRequestedMIAs,
     IFilter filter, IList<SortInformation> sortInformation) : base(miaManagement)
 {
   _necessaryRequestedMIAs = necessaryRequestedMIAs;
   _optionalRequestedMIAs = optionalRequestedMIAs;
   _selectAttributes = new List<QueryAttribute>(simpleSelectAttributes);
   _selectProjectionFunction = selectProjectionFunction;
   _filter = filter;
   _sortInformation = sortInformation;
 }