/// <summary> /// Gets the tags that match the specified filter. /// </summary> /// <param name="identity">The identity of the caller.</param> /// <param name="filter">The tag search filter.</param> /// <param name="cancellationToken">The cancellation token for the request.</param> /// <returns> /// A collection of matching tags. /// </returns> protected abstract Task <IEnumerable <TagDefinition> > FindTags(ClaimsPrincipal identity, TagDefinitionFilter filter, CancellationToken cancellationToken);
/// <summary> /// Gets the tags that match the specified filter. /// </summary> /// <param name="identity">The identity of the caller.</param> /// <param name="filter">The tag search filter.</param> /// <param name="cancellationToken">The cancellation token for the request.</param> /// <returns> /// A collection of matching tags. /// </returns> protected override Task <IEnumerable <TagDefinition> > FindTags(ClaimsPrincipal identity, TagDefinitionFilter filter, CancellationToken cancellationToken) { IEnumerable <TagDefinition> allTags = _tags.Values; var result = filter.FilterType == TagDefinitionFilterJoinType.And ? (IEnumerable <TagDefinition>)_tags.Values : new TagDefinition[0]; foreach (var clause in filter.FilterClauses) { switch (clause.Field) { case TagDefinitionFilterField.Name: if (filter.FilterType == TagDefinitionFilterJoinType.And) { result = result.Where(x => x.Name.Like(clause.Value)); } else { result = result.Concat(allTags.Where(x => x.Name.Like(clause.Value))); } break; case TagDefinitionFilterField.Description: if (filter.FilterType == TagDefinitionFilterJoinType.And) { result = result.Where(x => x.Description?.Like(clause.Value) ?? false); } else { result = result.Concat(allTags.Where(x => x.Description?.Like(clause.Value) ?? false)); } break; case TagDefinitionFilterField.Units: if (filter.FilterType == TagDefinitionFilterJoinType.And) { result = result.Where(x => x.Units?.Like(clause.Value) ?? false); } else { result = result.Concat(allTags.Where(x => x.Units?.Like(clause.Value) ?? false)); } break; } } if (filter.FilterType == TagDefinitionFilterJoinType.Or) { result = result.Distinct(); } return(Task.FromResult <IEnumerable <TagDefinition> >(result.OrderBy(x => x.Name, StringComparer.OrdinalIgnoreCase).Skip((filter.Page - 1) * filter.PageSize).Take(filter.PageSize).ToArray())); }
/// <summary> /// Gets the tags that match the specified filter. /// </summary> /// <param name="identity">The identity of the caller.</param> /// <param name="filter">The tag search filter.</param> /// <param name="cancellationToken">The cancellation token for the request.</param> /// <returns> /// A collection of matching tags. /// </returns> async Task <IEnumerable <TagDefinition> > IHistorian.FindTags(ClaimsPrincipal identity, TagDefinitionFilter filter, CancellationToken cancellationToken) { ThrowIfDisposed(); return(await FindTags(identity, filter, cancellationToken).ConfigureAwait(false)); }