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); }
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; }
public CompiledCountItemsQuery(MIA_Management miaManagement, IEnumerable <MediaItemAspectMetadata> necessaryRequestedMIATypes, IFilter filter, IFilter subqueryFilter) { _miaManagement = miaManagement; _necessaryRequestedMIATypes = necessaryRequestedMIATypes; _filter = filter; _subqueryFilter = subqueryFilter; }
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(); }
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) { }
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; }
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; }
/// <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; }
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; }
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; }
/// <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)); }
/// <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); }
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(")"); } }
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); }
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); }
/// <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; }
/// <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); }
public PreparedStatements(MIA_Management miaManagement) { _miaManagement = miaManagement; }
/// <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 BaseQueryBuilder(MIA_Management miaManagement) { _miaManagement = miaManagement; }
/// <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 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) { }
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); }
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)); }
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); }
/// <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; }