using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Xml.XPath;
using Examine;
using Examine.Search;
using Umbraco.Core;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Xml;
using Umbraco.Examine;
using Umbraco.Web.PublishedCache;
namespace Umbraco.Web
{
///
/// A class used to query for published content, media items
///
public class PublishedContentQuery : IPublishedContentQuery
{
private readonly IExamineManager _examineManager;
private readonly IPublishedSnapshot _publishedSnapshot;
private readonly IVariationContextAccessor _variationContextAccessor;
///
/// Initializes a new instance of the class.
///
public PublishedContentQuery(IPublishedSnapshot publishedSnapshot,
IVariationContextAccessor variationContextAccessor, IExamineManager examineManager)
{
_publishedSnapshot = publishedSnapshot ?? throw new ArgumentNullException(nameof(publishedSnapshot));
_variationContextAccessor = variationContextAccessor ??
throw new ArgumentNullException(nameof(variationContextAccessor));
_examineManager = examineManager ?? throw new ArgumentNullException(nameof(examineManager));
}
#region Convert Helpers
private static bool ConvertIdObjectToInt(object id, out int intId)
{
switch (id)
{
case string s:
return int.TryParse(s, out intId);
case int i:
intId = i;
return true;
default:
intId = default;
return false;
}
}
private static bool ConvertIdObjectToGuid(object id, out Guid guidId)
{
switch (id)
{
case string s:
return Guid.TryParse(s, out guidId);
case Guid g:
guidId = g;
return true;
default:
guidId = default;
return false;
}
}
private static bool ConvertIdObjectToUdi(object id, out Udi guidId)
{
switch (id)
{
case string s:
return UdiParser.TryParse(s, out guidId);
case Udi u:
guidId = u;
return true;
default:
guidId = default;
return false;
}
}
#endregion
#region Content
public IPublishedContent Content(int id) => ItemById(id, _publishedSnapshot.Content);
public IPublishedContent Content(Guid id) => ItemById(id, _publishedSnapshot.Content);
public IPublishedContent Content(Udi id)
{
if (!(id is GuidUdi udi)) return null;
return ItemById(udi.Guid, _publishedSnapshot.Content);
}
public IPublishedContent Content(object id)
{
if (ConvertIdObjectToInt(id, out var intId))
return Content(intId);
if (ConvertIdObjectToGuid(id, out var guidId))
return Content(guidId);
if (ConvertIdObjectToUdi(id, out var udiId))
return Content(udiId);
return null;
}
public IPublishedContent ContentSingleAtXPath(string xpath, params XPathVariable[] vars) =>
ItemByXPath(xpath, vars, _publishedSnapshot.Content);
public IEnumerable Content(IEnumerable ids) =>
ItemsByIds(_publishedSnapshot.Content, ids);
public IEnumerable Content(IEnumerable ids) =>
ItemsByIds(_publishedSnapshot.Content, ids);
public IEnumerable Content(IEnumerable