mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-12-03 12:03:51 +08:00
#18664: ForContentItems() method on ContentQuery that takes a collection of ids
for querying items by id; adding tests Work Item: 18664 --HG-- branch : 1.x
This commit is contained in:
@@ -18,6 +18,7 @@ using Orchard.DisplayManagement.Implementation;
|
||||
using Orchard.Tests.Stubs;
|
||||
using NHibernate.Impl;
|
||||
using Orchard.UI.PageClass;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Orchard.Tests.ContentManagement {
|
||||
[TestFixture]
|
||||
@@ -64,7 +65,7 @@ namespace Orchard.Tests.ContentManagement {
|
||||
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
|
||||
|
||||
builder.RegisterType<StubExtensionManager>().As<IExtensionManager>();
|
||||
builder.RegisterInstance(new Mock<IPageClassBuilder>().Object);
|
||||
builder.RegisterInstance(new Mock<IPageClassBuilder>().Object);
|
||||
builder.RegisterType<DefaultContentDisplay>().As<IContentDisplay>();
|
||||
|
||||
_session = _sessionFactory.OpenSession();
|
||||
@@ -84,12 +85,17 @@ namespace Orchard.Tests.ContentManagement {
|
||||
|
||||
}
|
||||
|
||||
private void AddSampleData() {
|
||||
_manager.Create<AlphaPart>("alpha", init => { });
|
||||
_manager.Create<BetaPart>("beta", init => { });
|
||||
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "the frap value"; });
|
||||
_manager.Create<DeltaPart>("delta", init => { init.Record.Quux = "the quux value"; });
|
||||
private List<IContent> AddSampleData() {
|
||||
var items = new List<IContent> {
|
||||
_manager.Create<AlphaPart>("alpha", init => { }),
|
||||
_manager.Create<BetaPart>("beta", init => { }),
|
||||
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "the frap value"; }),
|
||||
_manager.Create<DeltaPart>("delta", init => { init.Record.Quux = "the quux value"; })
|
||||
};
|
||||
|
||||
_session.Flush();
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -161,6 +167,66 @@ namespace Orchard.Tests.ContentManagement {
|
||||
Assert.That(gammaDelta.Count(x => x.Has<DeltaPart>()), Is.EqualTo(1));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void NoItemIsReturnedIfNoItemsSpecified() {
|
||||
AddSampleData();
|
||||
|
||||
var items = _manager.Query().ForContentItems(new int[] { }).List();
|
||||
|
||||
Assert.That(items.Count(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ItemsSpecifiedAreReturnedWhenSpecified() {
|
||||
var samples = AddSampleData();
|
||||
|
||||
|
||||
var betaGamma = _manager.Query().ForContentItems(new int[] { samples[1].ContentItem.Id, samples[2].ContentItem.Id }).List();
|
||||
|
||||
Assert.That(betaGamma.Count(), Is.EqualTo(2));
|
||||
Assert.That(betaGamma.Count(x => x.Has<AlphaPart>()), Is.EqualTo(0));
|
||||
Assert.That(betaGamma.Count(x => x.Has<BetaPart>()), Is.EqualTo(1));
|
||||
Assert.That(betaGamma.Count(x => x.Has<GammaPart>()), Is.EqualTo(1));
|
||||
Assert.That(betaGamma.Count(x => x.Has<DeltaPart>()), Is.EqualTo(0));
|
||||
|
||||
var alphaDelta = _manager.Query()
|
||||
.ForContentItems(new int[] { samples[0].ContentItem.Id, samples[3].ContentItem.Id })
|
||||
.List();
|
||||
|
||||
Assert.That(alphaDelta.Count(), Is.EqualTo(2));
|
||||
Assert.That(alphaDelta.Count(x => x.Has<AlphaPart>()), Is.EqualTo(1));
|
||||
Assert.That(alphaDelta.Count(x => x.Has<BetaPart>()), Is.EqualTo(0));
|
||||
Assert.That(alphaDelta.Count(x => x.Has<GammaPart>()), Is.EqualTo(0));
|
||||
Assert.That(alphaDelta.Count(x => x.Has<DeltaPart>()), Is.EqualTo(1));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ItemsSpecifiedCanBeFiltered() {
|
||||
AddSampleData();
|
||||
var oneId = _manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "one"; }).ContentItem.Id;
|
||||
var twoId = _manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "two"; }).ContentItem.Id;
|
||||
_manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "three"; });
|
||||
var fourId = _manager.Create<GammaPart>("gamma", init => { init.Record.Frap = "four"; }).ContentItem.Id;
|
||||
_session.Flush();
|
||||
|
||||
|
||||
var two = _manager.Query()
|
||||
.ForContentItems(new int[] { oneId, twoId, fourId })
|
||||
.Where<GammaRecord>(x => x.Frap == "two")
|
||||
.List();
|
||||
|
||||
Assert.That(two.Count(), Is.EqualTo(1));
|
||||
Assert.That(two.Count(x => x.Has<GammaPart>()), Is.EqualTo(1));
|
||||
Assert.That(two.Count(x => x.Get<GammaPart>().Record.Frap == "two"), Is.EqualTo(1));
|
||||
|
||||
var none = _manager.Query()
|
||||
.ForContentItems(new int[] { oneId, twoId, fourId })
|
||||
.Where<GammaRecord>(x => x.Frap == "three")
|
||||
.List();
|
||||
|
||||
Assert.That(none.Count(), Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void WherePredicateRestrictsResults() {
|
||||
AddSampleData();
|
||||
|
||||
@@ -125,6 +125,10 @@ namespace Orchard.ContentManagement {
|
||||
}
|
||||
|
||||
|
||||
public static IContentQuery<T> ForContentItems<T>(this IContentQuery<T> query, params int[] ids) where T : IContent {
|
||||
return query.ForContentItems(ids);
|
||||
}
|
||||
|
||||
|
||||
public static IEnumerable<T> List<T>(this IContentManager manager, params string[] contentTypeNames) where T : ContentPart {
|
||||
return manager.Query<T>(contentTypeNames).List();
|
||||
|
||||
@@ -73,13 +73,23 @@ namespace Orchard.ContentManagement {
|
||||
_versionOptions = options;
|
||||
}
|
||||
|
||||
private void ForContentItems(IEnumerable<int> ids) {
|
||||
if (ids == null) throw new ArgumentNullException("ids");
|
||||
|
||||
// Converting to array as otherwise an exception "Expression argument must be of type ICollection." is thrown.
|
||||
Where<ContentItemRecord>(record => ids.ToArray().Contains(record.Id), BindCriteriaByPath(BindItemCriteria(), typeof(ContentItemRecord).Name));
|
||||
}
|
||||
|
||||
private void Where<TRecord>() where TRecord : ContentPartRecord {
|
||||
// this simply demands an inner join
|
||||
BindPartCriteria<TRecord>();
|
||||
}
|
||||
|
||||
private void Where<TRecord>(Expression<Func<TRecord, bool>> predicate) where TRecord : ContentPartRecord {
|
||||
Where<TRecord>(predicate, BindPartCriteria<TRecord>());
|
||||
}
|
||||
|
||||
private void Where<TRecord>(Expression<Func<TRecord, bool>> predicate, ICriteria bindCriteria) {
|
||||
// build a linq to nhibernate expression
|
||||
var options = new QueryOptions();
|
||||
var queryProvider = new NHibernateQueryProvider(BindSession(), options);
|
||||
@@ -89,7 +99,7 @@ namespace Orchard.ContentManagement {
|
||||
var criteria = (CriteriaImpl)queryProvider.TranslateExpression(queryable.Expression);
|
||||
|
||||
// attach the criterion from the predicate to this query's criteria for the record
|
||||
var recordCriteria = BindPartCriteria<TRecord>();
|
||||
var recordCriteria = bindCriteria;
|
||||
foreach (var expressionEntry in criteria.IterateExpressionEntries()) {
|
||||
recordCriteria.Add(expressionEntry.Criterion);
|
||||
}
|
||||
@@ -187,6 +197,11 @@ namespace Orchard.ContentManagement {
|
||||
return this;
|
||||
}
|
||||
|
||||
IContentQuery<T> IContentQuery<T>.ForContentItems(IEnumerable<int> ids) {
|
||||
_query.ForContentItems(ids);
|
||||
return this;
|
||||
}
|
||||
|
||||
IEnumerable<T> IContentQuery<T>.List() {
|
||||
return _query.Slice(0, 0).AsPart<T>();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Orchard.ContentManagement {
|
||||
public interface IContentQuery<TPart> : IContentQuery where TPart : IContent {
|
||||
IContentQuery<TPart> ForType(params string[] contentTypes);
|
||||
IContentQuery<TPart> ForVersion(VersionOptions options);
|
||||
IContentQuery<TPart> ForContentItems(IEnumerable<int> ids);
|
||||
|
||||
IEnumerable<TPart> List();
|
||||
IEnumerable<TPart> Slice(int skip, int count);
|
||||
|
||||
Reference in New Issue
Block a user