#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:
Zoltán Lehóczky
2013-04-13 22:51:16 +02:00
parent f7049cd811
commit d773ce8c0a
4 changed files with 93 additions and 7 deletions

View File

@@ -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();

View File

@@ -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();

View File

@@ -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>();
}

View File

@@ -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);