using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
using NPoco;
using Umbraco.Cms.Core.Cache;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Persistence.Querying;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Scoping;
namespace Umbraco.Core.Persistence.Repositories.Implement
{
// TODO: Obsolete this, change all implementations of this like in Dictionary to just use custom Cache policies like in the member repository.
///
/// Simple abstract ReadOnly repository used to simply have PerformGet and PeformGetAll with an underlying cache
///
internal abstract class SimpleGetRepository : EntityRepositoryBase
where TEntity : class, IEntity
where TDto: class
{
protected SimpleGetRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger> logger)
: base(scopeAccessor, cache, logger)
{ }
protected abstract TEntity ConvertToEntity(TDto dto);
protected abstract object GetBaseWhereClauseArguments(TId id);
protected abstract string GetWhereInClauseForGetAll();
protected virtual IEnumerable PerformFetch(Sql sql)
{
return Database.Fetch(sql);
}
protected override TEntity PerformGet(TId id)
{
var sql = GetBaseQuery(false);
sql.Where(GetBaseWhereClause(), GetBaseWhereClauseArguments(id));
var dto = PerformFetch(sql).FirstOrDefault();
if (dto == null)
return null;
var entity = ConvertToEntity(dto);
if (entity is EntityBase dirtyEntity)
{
// reset dirty initial properties (U4-1946)
dirtyEntity.ResetDirtyProperties(false);
}
return entity;
}
protected override IEnumerable PerformGetAll(params TId[] ids)
{
var sql = Sql().From();
if (ids.Any())
{
sql.Where(GetWhereInClauseForGetAll(), new { /*ids =*/ ids });
}
return Database.Fetch(sql).Select(ConvertToEntity);
}
protected sealed override IEnumerable PerformGetByQuery(IQuery query)
{
var sqlClause = GetBaseQuery(false);
var translator = new SqlTranslator(sqlClause, query);
var sql = translator.Translate();
return Database.Fetch(sql).Select(ConvertToEntity);
}
#region Not implemented and not required
protected sealed override IEnumerable GetDeleteClauses()
{
throw new InvalidOperationException("This method won't be implemented.");
}
protected sealed override Guid NodeObjectTypeId => throw new InvalidOperationException("This property won't be implemented.");
protected sealed override void PersistNewItem(TEntity entity)
{
throw new InvalidOperationException("This method won't be implemented.");
}
protected sealed override void PersistUpdatedItem(TEntity entity)
{
throw new InvalidOperationException("This method won't be implemented.");
}
#endregion
}
}