diff --git a/.hgsubstate b/.hgsubstate index 1ad313649..c9275d1fb 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -3,6 +3,6 @@ bdbb631a4a7ba0ffcd59269b79a5084065c0a9f7 src/Orchard.Web/Modules/Orchard.Alias ec573e5476f7e8a5a61593d6393e9985e9484fcc src/Orchard.Web/Modules/Orchard.Forms 7c88e691cc47dbb6e628f6b288ce9b9d4cd8a5c7 src/Orchard.Web/Modules/Orchard.Projections bf1f2857f36786c66013e0dee3c37e94cd26465e src/Orchard.Web/Modules/Orchard.Routable -01b83c05050bb731d9f69256bbe8884d458ea1c9 src/Orchard.Web/Modules/Orchard.Rules +3153ea8e0e869664ce841016b020dd5e67667bdf src/Orchard.Web/Modules/Orchard.Rules 65057c6a5cd71f7994ba9bcbeece50dbb737620e src/Orchard.Web/Modules/Orchard.TaskLease ff19551decac9829f4f6cd94b61e69b22a796653 src/Orchard.Web/Modules/Orchard.Tokens diff --git a/src/Orchard.Azure/Environment/Configuration/AzureShellSettingsManager.cs b/src/Orchard.Azure/Environment/Configuration/AzureShellSettingsManager.cs index 0f6d5a34d..59559deb9 100644 --- a/src/Orchard.Azure/Environment/Configuration/AzureShellSettingsManager.cs +++ b/src/Orchard.Azure/Environment/Configuration/AzureShellSettingsManager.cs @@ -31,7 +31,7 @@ namespace Orchard.Azure.Environment.Configuration { } void IShellSettingsManager.SaveSettings(ShellSettings settings) { - var content = ComposeSettings(settings); + var content = ShellSettingsSerializer.ComposeSettings(settings); var filePath = _fileSystem.Combine(settings.Name, SettingsFilename); var file = _fileSystem.FileExists(filePath) @@ -55,83 +55,8 @@ namespace Orchard.Azure.Environment.Configuration { using (var stream = file.OpenRead()) using (var reader = new StreamReader(stream)) - yield return ParseSettings(reader.ReadToEnd()); + yield return ShellSettingsSerializer.ParseSettings(reader.ReadToEnd()); } } - - static ShellSettings ParseSettings(string text) { - var shellSettings = new ShellSettings(); - if (String.IsNullOrEmpty(text)) - return shellSettings; - - var settings = text.Split(new[] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries); - foreach (var setting in settings) { - var separatorIndex = setting.IndexOf(Separator); - if(separatorIndex == -1) { - continue; - } - string key = setting.Substring(0, separatorIndex).Trim(); - string value = setting.Substring(separatorIndex + 1).Trim(); - - if (value != EmptyValue) { - switch (key) { - case "Name": - shellSettings.Name = value; - break; - case "DataProvider": - shellSettings.DataProvider = value; - break; - case "State": - shellSettings.State = new TenantState(value); - break; - case "DataConnectionString": - shellSettings.DataConnectionString = value; - break; - case "DataPrefix": - shellSettings.DataTablePrefix = value; - break; - case "RequestUrlHost": - shellSettings.RequestUrlHost = value; - break; - case "RequestUrlPrefix": - shellSettings.RequestUrlPrefix = value; - break; - case "EncryptionAlgorithm": - shellSettings.EncryptionAlgorithm = value; - break; - case "EncryptionKey": - shellSettings.EncryptionKey = value; - break; - case "HashAlgorithm": - shellSettings.HashAlgorithm = value; - break; - case "HashKey": - shellSettings.HashKey = value; - break; - } - } - } - - return shellSettings; - } - - static string ComposeSettings(ShellSettings settings) { - if (settings == null) - return ""; - - return string.Format("Name: {0}\r\nDataProvider: {1}\r\nDataConnectionString: {2}\r\nDataPrefix: {3}\r\nRequestUrlHost: {4}\r\nRequestUrlPrefix: {5}\r\nState: {6}\r\nEncryptionAlgorithm: {7}\r\nEncryptionKey: {8}\r\nHashAlgorithm: {9}\r\nHashKey: {10}\r\n", - settings.Name, - settings.DataProvider, - settings.DataConnectionString ?? EmptyValue, - settings.DataTablePrefix ?? EmptyValue, - settings.RequestUrlHost ?? EmptyValue, - settings.RequestUrlPrefix ?? EmptyValue, - settings.State != null ? settings.State.ToString() : String.Empty, - settings.EncryptionAlgorithm ?? EmptyValue, - settings.EncryptionKey ?? EmptyValue, - settings.HashAlgorithm ?? EmptyValue, - settings.HashKey ?? EmptyValue - ); - } } } diff --git a/src/Orchard.Profile/Go.cmd b/src/Orchard.Profile/Go.cmd index 05fe49c11..33add4a42 100644 --- a/src/Orchard.Profile/Go.cmd +++ b/src/Orchard.Profile/Go.cmd @@ -1,3 +1,3 @@ @echo off call "%~dp0\_environment" -"%wcatfiles%\wcat.wsf" -terminate -run -clients localhost -t "%~dp0\Scripts\%1.txt" -f "%~dp0\settings.txt" -s localhost -singleip -x +"%wcatfiles%\wcat.wsf" -terminate -run -clients localhost -t ".\Scripts\%1.txt" -f ".\settings.txt" -s localhost -singleip -x diff --git a/src/Orchard.Profile/Readme.txt b/src/Orchard.Profile/Readme.txt index b9c1b967e..e3590e9cd 100644 --- a/src/Orchard.Profile/Readme.txt +++ b/src/Orchard.Profile/Readme.txt @@ -1,6 +1,8 @@  == creating profiling image == +Create a SQL Server database named Orchard, on the . instance. This can be changed in profiling-setup-commands.txt + From the base of the checkout, execute >./build.cmd profiling diff --git a/src/Orchard.Profile/Scripts/homepage.txt b/src/Orchard.Profile/Scripts/homepage.txt new file mode 100644 index 000000000..e4cdb99f8 --- /dev/null +++ b/src/Orchard.Profile/Scripts/homepage.txt @@ -0,0 +1,63 @@ +scenario +{ + name = "Fiddler WCAT Script "; + warmup = 10; + duration = 30; + cooldown = 1; + + default + { + version = HTTP11; + setheader + { + name = "Connection"; + value = "keep-alive"; + } + close = ka; + } + + transaction + { + id = "1"; + weight = 1; + request + { + url = "/"; + setheader + { + name="Host"; + value="localhost"; + } + setheader + { + name="Connection"; + value="keep-alive"; + } + setheader + { + name="User-Agent"; + value="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7"; + } + setheader + { + name="Accept"; + value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; + } + setheader + { + name="Accept-Encoding"; + value="gzip,deflate,sdch"; + } + setheader + { + name="Accept-Language"; + value="en-US,en;q=0.8"; + } + setheader + { + name="Accept-Charset"; + value="ISO-8859-1,utf-8;q=0.7,*;q=0.3"; + } + } + } +} diff --git a/src/Orchard.Specs/Bindings/ContentRights.cs b/src/Orchard.Specs/Bindings/ContentRights.cs index 9d47cc7d6..e4c2f8274 100644 --- a/src/Orchard.Specs/Bindings/ContentRights.cs +++ b/src/Orchard.Specs/Bindings/ContentRights.cs @@ -22,7 +22,7 @@ namespace Orchard.Specs.Bindings { webApp.Host.Execute(() => { using ( var environment = MvcApplication.CreateStandaloneEnvironment("Default") ) { var memberShipService = environment.Resolve(); - var athorizationService = environment.Resolve(); + var authorizationService = environment.Resolve(); var contentManager = environment.Resolve(); var contentItem = contentManager.Create(contentType); @@ -30,7 +30,7 @@ namespace Orchard.Specs.Bindings { var otherUser = memberShipService.GetUser(otherName); contentItem.As().Owner = otherUser; - Assert.That(athorizationService.TryCheckAccess(GetPermissionForAction(action), user, contentItem), Is.True); + Assert.That(authorizationService.TryCheckAccess(GetPermissionForAction(action), user, contentItem), Is.True); } }); } diff --git a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs index 67478b692..300ef38ca 100644 --- a/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs +++ b/src/Orchard.Tests.Modules/Recipes/Services/RecipeManagerTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Xml; using Autofac; +using Moq; using NUnit.Framework; using Orchard.Caching; using Orchard.Environment.Extensions; @@ -62,7 +63,7 @@ namespace Orchard.Tests.Modules.Recipes.Services { } var builder = new ContainerBuilder(); - var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock().Object); _folders = new ModuleFolders(new[] { _tempFolderName }, harvester); builder.RegisterType().As(); builder.RegisterType().As(); diff --git a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs index 51f90a5be..2b1df1716 100644 --- a/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs +++ b/src/Orchard.Tests/ContentManagement/DynamicContentQueryTests.cs @@ -93,7 +93,7 @@ namespace Orchard.Tests.ContentManagement { public void SpecificTypeIsReturnedWhenSpecified() { AddSampleData(); - var alphaBeta = _manager.Query().Where(x => x.WithRecord("ContentType").In("Name", new [] {"alpha", "beta"})).List(); + var alphaBeta = _manager.HqlQuery().ForType("alpha", "beta").List(); Assert.That(alphaBeta.Count(), Is.EqualTo(2)); Assert.That(alphaBeta.Count(x => x.Has()), Is.EqualTo(1)); @@ -101,7 +101,7 @@ namespace Orchard.Tests.ContentManagement { Assert.That(alphaBeta.Count(x => x.Has()), Is.EqualTo(0)); Assert.That(alphaBeta.Count(x => x.Has()), Is.EqualTo(0)); - var gammaDelta = _manager.Query().Where(x => x.WithRecord("ContentType").In("Name", new[] { "gamma", "delta" })).List(); + var gammaDelta = _manager.HqlQuery().ForType("gamma", "delta").List(); Assert.That(gammaDelta.Count(), Is.EqualTo(2)); Assert.That(gammaDelta.Count(x => x.Has()), Is.EqualTo(0)); @@ -119,8 +119,11 @@ namespace Orchard.Tests.ContentManagement { _manager.Create("gamma", init => { init.Record.Frap = "four"; }); _session.Flush(); - var twoOrFour = _manager.Query() - .Where(x => x.WithRecord("GammaRecord").Or(a => a.Eq("Frap", "one"), b => b.Eq("Frap", "four"))) + var twoOrFour = _manager + .HqlQuery() + .Where( + alias => alias.ContentPartRecord(), + x => x.Or(a => a.Eq("Frap", "one"), b => b.Eq("Frap", "four"))) .List(); Assert.That(twoOrFour.Count(), Is.EqualTo(2)); @@ -133,8 +136,8 @@ namespace Orchard.Tests.ContentManagement { [Test] public void EmptyWherePredicateRequiresRecord() { AddSampleData(); - var gammas = _manager.Query().Where(x => x.WithRecord("GammaRecord")).List(); // simulates an inner join - var deltas = _manager.Query().Where(x => x.WithRecord("DeltaRecord")).List(); + var gammas = _manager.HqlQuery().Join(alias => alias.ContentPartRecord()).List(); + var deltas = _manager.HqlQuery().Join(alias => alias.ContentPartRecord()).List(); Assert.That(gammas.Count(), Is.EqualTo(1)); Assert.That(deltas.Count(), Is.EqualTo(1)); @@ -152,9 +155,10 @@ namespace Orchard.Tests.ContentManagement { _session.Flush(); _session.Clear(); - var ascending = _manager.Query("gamma") - .OrderBy(x => x.WithRecord("GammaRecord").Asc("Frap")) - .List().ToList(); + var ascending = _manager.HqlQuery() + .ForType("gamma") + .OrderBy(alias => alias.ContentPartRecord(), x => x.Asc("Frap")) + .List().ToList(); Assert.That(ascending.Count(), Is.EqualTo(5)); Assert.That(ascending.First().Record.Frap, Is.EqualTo("four")); @@ -162,8 +166,9 @@ namespace Orchard.Tests.ContentManagement { _session.Clear(); - var descending = _manager.Query() - .OrderBy(x => x.WithRecord("GammaRecord").Desc("Frap")) + var descending = _manager.HqlQuery() + .ForType("gamma") + .OrderBy(alias => alias.ContentPartRecord(), x => x.Desc("Frap")) .List().ToList(); Assert.That(descending.Count(), Is.EqualTo(5)); @@ -180,12 +185,12 @@ namespace Orchard.Tests.ContentManagement { _manager.Create("gamma", init => { init.Record.Frap = "four"; }); _session.Flush(); - var reverseById = _manager.Query() - .OrderBy(x => x.WithRecord("GammaRecord").Desc("Id")) + var reverseById = _manager.HqlQuery() + .OrderBy(alias => alias.ContentPartRecord(), x => x.Desc("Id")) .List(); - var subset = _manager.Query() - .OrderBy(x => x.WithRecord("GammaRecord").Desc("Id")) + var subset = _manager.HqlQuery() + .OrderBy(alias => alias.ContentPartRecord(), x => x.Desc("Id")) .Slice(2, 3); Assert.That(subset.Count(), Is.EqualTo(3)); @@ -217,15 +222,18 @@ namespace Orchard.Tests.ContentManagement { _session.Flush(); _session.Clear(); - var results = _manager.Query("gamma") - .Where(x => x.WithVersionRecord("EpsilonRecord").Or(a => a.Eq("Quad", "2"), b => b.Eq("Quad", "3"))) - .OrderBy(x => x.WithVersionRecord("EpsilonRecord").Desc("Quad")) - .List(); + var results = _manager.HqlQuery() + .Where(alias => alias.ContentPartRecord(), x => x.Or(a => a.Eq("Quad", "2"), b => b.Eq("Quad", "3"))) + .OrderBy(alias => alias.ContentPartRecord(), x => x.Desc("Quad")) + .ForType("gamma") + .List(); Assert.That(results.Count(), Is.EqualTo(2)); Assert.That(results.First().Record, Has.Property("Quad").EqualTo("3")); Assert.That(results.Last().Record, Has.Property("Quad").EqualTo("2")); } + + } } diff --git a/src/Orchard.Tests/ContentManagement/Handlers/LambdaPartHandler.cs b/src/Orchard.Tests/ContentManagement/Handlers/LambdaPartHandler.cs new file mode 100644 index 000000000..33cd2ae6f --- /dev/null +++ b/src/Orchard.Tests/ContentManagement/Handlers/LambdaPartHandler.cs @@ -0,0 +1,14 @@ +using Orchard.ContentManagement.Handlers; +using Orchard.Data; +using Orchard.Tests.ContentManagement.Models; +using Orchard.Tests.ContentManagement.Records; + +namespace Orchard.Tests.ContentManagement.Handlers { + public class LambdaPartHandler : ContentHandler { + public LambdaPartHandler(IRepository repository) { + Filters.Add(new ActivatingFilter("lambda")); + Filters.Add(StorageFilter.For(repository)); + + } + } +} diff --git a/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs new file mode 100644 index 000000000..24d0be972 --- /dev/null +++ b/src/Orchard.Tests/ContentManagement/HqlExpressionTests.cs @@ -0,0 +1,981 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Autofac; +using Moq; +using NHibernate; +using NUnit.Framework; +using Orchard.ContentManagement.MetaData; +using Orchard.Data; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Handlers; +using Orchard.ContentManagement.Records; +using Orchard.DisplayManagement; +using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Extensions; +using Orchard.Tests.ContentManagement.Handlers; +using Orchard.Tests.ContentManagement.Records; +using Orchard.Tests.ContentManagement.Models; +using Orchard.DisplayManagement.Implementation; +using Orchard.Tests.Stubs; + +namespace Orchard.Tests.ContentManagement { + [TestFixture] + public class HqlExpressionTests { + private IContainer _container; + private IContentManager _manager; + private ISessionFactory _sessionFactory; + private ISession _session; + + [TestFixtureSetUp] + public void InitFixture() { + var databaseFileName = System.IO.Path.GetTempFileName(); + _sessionFactory = DataUtility.CreateSessionFactory( + databaseFileName, + typeof(GammaRecord), + typeof(DeltaRecord), + typeof(EpsilonRecord), + typeof(LambdaRecord), + typeof(ContentItemVersionRecord), + typeof(ContentItemRecord), + typeof(ContentTypeRecord)); + } + + [SetUp] + public void Init() { + var builder = new ContainerBuilder(); + + builder.RegisterModule(new ContentModule()); + builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As(); + builder.RegisterInstance(new Mock().Object); + builder.RegisterInstance(new Mock().Object); + + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + builder.RegisterType().As(); + + builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); + + builder.RegisterType().As(); + builder.RegisterType().As(); + + _session = _sessionFactory.OpenSession(); + builder.RegisterInstance(new DefaultContentManagerTests.TestSessionLocator(_session)).As(); + + _session.Delete(string.Format("from {0}", typeof(GammaRecord).FullName)); + _session.Delete(string.Format("from {0}", typeof(DeltaRecord).FullName)); + _session.Delete(string.Format("from {0}", typeof(EpsilonRecord).FullName)); + _session.Delete(string.Format("from {0}", typeof(LambdaRecord).FullName)); + + _session.Delete(string.Format("from {0}", typeof(ContentItemVersionRecord).FullName)); + _session.Delete(string.Format("from {0}", typeof(ContentItemRecord).FullName)); + _session.Delete(string.Format("from {0}", typeof(ContentTypeRecord).FullName)); + _session.Flush(); + _session.Clear(); + + _container = builder.Build(); + _manager = _container.Resolve(); + + } + + [Test] + public void AllDataTypesCanBeQueried() { + var dt = DateTime.Now; + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = true; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var lambda = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("BooleanStuff", true)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("DecimalStuff", (decimal)0.0)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("DoubleStuff", 0.0)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("FloatStuff", (float)0.0)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("IntegerStuff", 0)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("LongStuff", (long)0)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("StringStuff", "0")).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + + lambda = _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), x => x.Eq("DateTimeStuff", dt)).List(); + Assert.That(lambda.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorLike() { + _manager.Create("lambda", init => { + init.Record.StringStuff = "abcdef"; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.Like("StringStuff", "bc", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "ab", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "ef", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "gh", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Like("StringStuff", "ab", HqlMatchMode.Start)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "ef", HqlMatchMode.End)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "abcdef", HqlMatchMode.Exact)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Like("StringStuff", "abcde", HqlMatchMode.Exact)); + Assert.That(result.Count(), Is.EqualTo(0)); + + // default collation in SQL Ce/Server but can be changed during db creation + result = queryWhere(x => x.Like("StringStuff", "EF", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorInsensitiveLike() { + _manager.Create("lambda", init => { + init.Record.StringStuff = "abcdef"; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "bc", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "ab", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "ef", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "gh", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "ab", HqlMatchMode.Start)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "ef", HqlMatchMode.End)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "abcdef", HqlMatchMode.Exact)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "abcde", HqlMatchMode.Exact)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.InsensitiveLike("StringStuff", "EF", HqlMatchMode.Anywhere)); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorGt() { + var dt = new DateTime(1980,1,1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = true; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.Gt("BooleanStuff", true)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("DecimalStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("DoubleStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("FloatStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("IntegerStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("LongStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("StringStuff", "0")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("DateTimeStuff", dt)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Gt("BooleanStuff", false)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("DecimalStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("DoubleStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("FloatStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("IntegerStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("LongStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("StringStuff", "")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Gt("DateTimeStuff", dt.AddDays(-1))); + Assert.That(result.Count(), Is.EqualTo(1)); + + } + + [Test] + public void ShouldQueryUsingOperatorLt() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.Lt("BooleanStuff", false)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("DecimalStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("DoubleStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("FloatStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("IntegerStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("LongStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("StringStuff", "0")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("DateTimeStuff", dt)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Lt("BooleanStuff", true)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("DecimalStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("DoubleStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("FloatStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("IntegerStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("LongStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("StringStuff", "00")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Lt("DateTimeStuff", dt.AddDays(1))); + Assert.That(result.Count(), Is.EqualTo(1)); + + } + + + [Test] + public void ShouldQueryUsingOperatorLe() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.Le("BooleanStuff", false)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DecimalStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DoubleStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("FloatStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("IntegerStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("LongStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("StringStuff", "0")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DateTimeStuff", dt)); + Assert.That(result.Count(), Is.EqualTo(1)); + + // greater values + result = queryWhere(x => x.Le("BooleanStuff", true)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DecimalStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DoubleStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("FloatStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("IntegerStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("LongStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("StringStuff", "00")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Le("DateTimeStuff", dt.AddDays(1))); + Assert.That(result.Count(), Is.EqualTo(1)); + + // lower values + result = queryWhere(x => x.Le("DecimalStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("DoubleStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("FloatStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("IntegerStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("LongStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("StringStuff", "")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Le("DateTimeStuff", dt.AddDays(-1))); + Assert.That(result.Count(), Is.EqualTo(0)); + + } + + [Test] + public void ShouldQueryUsingOperatorGe() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.Ge("BooleanStuff", false)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("DecimalStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("DoubleStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("FloatStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("IntegerStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("LongStuff", 0)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("StringStuff", "0")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("DateTimeStuff", dt)); + Assert.That(result.Count(), Is.EqualTo(1)); + + // greater values + result = queryWhere(x => x.Ge("BooleanStuff", true)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("DecimalStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("DoubleStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("FloatStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("IntegerStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("LongStuff", 1)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("StringStuff", "00")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Ge("DateTimeStuff", dt.AddDays(1))); + Assert.That(result.Count(), Is.EqualTo(0)); + + // lower values + result = queryWhere(x => x.Ge("DecimalStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("DoubleStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("FloatStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("IntegerStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("LongStuff", -1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("StringStuff", "")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Ge("DateTimeStuff", dt.AddDays(-1))); + Assert.That(result.Count(), Is.EqualTo(1)); + + } + + [Test] + public void ShouldQueryUsingOperatorBetween() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // include + result = queryWhere(x => x.Between("DecimalStuff", 0, 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("DoubleStuff", 0, 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("FloatStuff", 0, 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("IntegerStuff", 0, 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("LongStuff", 0, 1)); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("StringStuff", "0", "1")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.Between("DateTimeStuff", dt, dt.AddDays(1))); + Assert.That(result.Count(), Is.EqualTo(1)); + + // exclude + result = queryWhere(x => x.Between("DecimalStuff", 1, 2)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("DoubleStuff", 1, 2)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("FloatStuff", 1, 2)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("IntegerStuff", 1, 2)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("LongStuff", 1, 2)); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("StringStuff", "1", "2")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.Between("DateTimeStuff", dt.AddDays(1), dt.AddDays(2))); + Assert.That(result.Count(), Is.EqualTo(0)); + + } + + [Test] + public void ShouldQueryUsingOperatorIn() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // include + result = queryWhere(x => x.In("BooleanStuff", new[] { false })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("DecimalStuff", new[] { 0, 1 })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("DoubleStuff", new[] { 0, 1 })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("FloatStuff", new[] { 0, 1 })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("IntegerStuff", new[] { 0, 1 })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("LongStuff", new[] { 0, 1 })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("StringStuff", new[] { "0", "1" })); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.In("DateTimeStuff", new [] {dt, dt.AddDays(1)})); + Assert.That(result.Count(), Is.EqualTo(1)); + + // exclude + result = queryWhere(x => x.In("BooleanStuff", new[] { true })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("DecimalStuff", new[] { 1, 2 })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("DoubleStuff", new[] { 1, 2 })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("FloatStuff", new[] { 1, 2 })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("IntegerStuff", new[] { 1, 2 })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("LongStuff", new[] { 1, 2 })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("StringStuff", new[] { "1", "2" })); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.In("DateTimeStuff", new [] {dt.AddDays(1), dt.AddDays(2)})); + Assert.That(result.Count(), Is.EqualTo(0)); + + } + + [Test] + public void ShouldQueryUsingOperatorIsNull() { + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.StringStuff = null; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.IsNull("BooleanStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.IsNull("StringStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorIsNotNull() { + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.StringStuff = null; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.IsNotNull("BooleanStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.IsNotNull("StringStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + } + + [Test] + public void ShouldQueryUsingOperatorEqProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.EqProperty("BooleanStuff", "LongStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + result = queryWhere(x => x.EqProperty("DateTimeStuff", "LongStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + } + + [Test] + public void ShouldQueryUsingOperatorNotEqProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 0; + init.Record.LongStuff = 0; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + result = queryWhere(x => x.NotEqProperty("BooleanStuff", "LongStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + result = queryWhere(x => x.NotEqProperty("DateTimeStuff", "LongStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorGtProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 1; + init.Record.LongStuff = 2; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.GtProperty("DoubleStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + // lesser + result = queryWhere(x => x.GtProperty("FloatStuff", "IntegerStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + // greater + result = queryWhere(x => x.GtProperty("IntegerStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + + [Test] + public void ShouldQueryUsingOperatorGeProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 1; + init.Record.LongStuff = 2; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.GeProperty("DoubleStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + // lesser + result = queryWhere(x => x.GeProperty("FloatStuff", "IntegerStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + // greater + result = queryWhere(x => x.GeProperty("IntegerStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + } + + [Test] + public void ShouldQueryUsingOperatorLeProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 1; + init.Record.LongStuff = 2; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.LeProperty("DoubleStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + // lesser + result = queryWhere(x => x.LeProperty("FloatStuff", "IntegerStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + // greater + result = queryWhere(x => x.LeProperty("IntegerStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + } + + + [Test] + public void ShouldQueryUsingOperatorLtProperty() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 1; + init.Record.LongStuff = 2; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.LtProperty("DoubleStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + + // lesser + result = queryWhere(x => x.LtProperty("FloatStuff", "IntegerStuff")); + Assert.That(result.Count(), Is.EqualTo(1)); + + // greater + result = queryWhere(x => x.LtProperty("IntegerStuff", "FloatStuff")); + Assert.That(result.Count(), Is.EqualTo(0)); + } + + [Test] + public void ShouldSortRandomly() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.IntegerStuff = 1; + }); + + _manager.Create("lambda", init => { + init.Record.IntegerStuff = 2; + }); + + _manager.Create("lambda", init => { + init.Record.IntegerStuff = 3; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(3)); + + var firstResults = new List(); + + for (int i = 0; i < 10; i++) { + result = _manager.HqlQuery().Join(alias => alias.ContentPartRecord()).OrderBy(x => x.Named("civ"), order => order.Random()).List(); + firstResults.Add(result.First().As().Record.IntegerStuff); + } + + Assert.That(firstResults.Distinct().Count(), Is.GreaterThan(1)); + } + + [Test] + public void ShouldQueryUsingOperatorNot() { + var dt = new DateTime(1980, 1, 1); + + _manager.Create("lambda", init => { + init.Record.BooleanStuff = false; + init.Record.DecimalStuff = 0; + init.Record.DoubleStuff = 0; + init.Record.FloatStuff = 0; + init.Record.IntegerStuff = 1; + init.Record.LongStuff = 2; + init.Record.StringStuff = "0"; + init.Record.DateTimeStuff = dt; + }); + _session.Flush(); + + var result = _manager.HqlQuery().ForType("lambda").List(); + Assert.That(result.Count(), Is.EqualTo(1)); + + Func, IEnumerable> queryWhere = predicate => _manager.HqlQuery().Where(alias => alias.ContentPartRecord(), predicate).List(); + + // equal + result = queryWhere(x => x.Not(y => y.LtProperty("DoubleStuff", "FloatStuff"))); + Assert.That(result.Count(), Is.EqualTo(1)); + } + } +} + + + diff --git a/src/Orchard.Tests/ContentManagement/Models/LambdaPart.cs b/src/Orchard.Tests/ContentManagement/Models/LambdaPart.cs new file mode 100644 index 000000000..bde3d84e1 --- /dev/null +++ b/src/Orchard.Tests/ContentManagement/Models/LambdaPart.cs @@ -0,0 +1,7 @@ +using Orchard.ContentManagement; +using Orchard.Tests.ContentManagement.Records; + +namespace Orchard.Tests.ContentManagement.Models { + public class LambdaPart : ContentPart { + } +} \ No newline at end of file diff --git a/src/Orchard.Tests/ContentManagement/Records/LambdaRecord.cs b/src/Orchard.Tests/ContentManagement/Records/LambdaRecord.cs new file mode 100644 index 000000000..5234c1b2f --- /dev/null +++ b/src/Orchard.Tests/ContentManagement/Records/LambdaRecord.cs @@ -0,0 +1,19 @@ +using System; +using Orchard.ContentManagement.Records; + +namespace Orchard.Tests.ContentManagement.Records { + public class LambdaRecord : ContentPartRecord { + public LambdaRecord() { + DateTimeStuff = new DateTime(1980,1,1); + } + + public virtual int IntegerStuff { get; set; } + public virtual long LongStuff { get; set; } + public virtual bool BooleanStuff { get; set; } + public virtual float FloatStuff { get; set; } + public virtual double DoubleStuff { get; set; } + public virtual Decimal DecimalStuff { get; set; } + public virtual string StringStuff { get; set; } + public virtual DateTime DateTimeStuff { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Tests/DataMigration/SchemaBuilderTests.cs b/src/Orchard.Tests/DataMigration/SchemaBuilderTests.cs index 0bf6a3e89..d54d02dd1 100644 --- a/src/Orchard.Tests/DataMigration/SchemaBuilderTests.cs +++ b/src/Orchard.Tests/DataMigration/SchemaBuilderTests.cs @@ -224,5 +224,22 @@ namespace Orchard.Tests.DataMigration { .AlterColumn("Data", column => column.WithLength(2048))); } + + [Test] + public void PrecisionAndScaleAreApplied() { + + _schemaBuilder + .CreateTable("Product", table => table + .Column("Price", DbType.Decimal, column => column.WithPrecision(6).WithScale(9)) + ); + + _schemaBuilder + .ExecuteSql(String.Format("INSERT INTO TEST_Product (Price) VALUES ({0})", "123456.123456789")); + + var command = _session.Connection.CreateCommand(); + command.CommandText = "SELECT MAX(Price) FROM TEST_Product"; + Assert.That(command.ExecuteScalar(), Is.EqualTo(123456.123456789m)); + + } } } diff --git a/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs b/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs index bf677980d..99b4fa82c 100644 --- a/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs +++ b/src/Orchard.Tests/Environment/Extensions/ExtensionFoldersTests.cs @@ -1,6 +1,8 @@ using System.IO; using System.Linq; +using Moq; using NUnit.Framework; +using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Folders; using Orchard.Tests.Stubs; @@ -49,7 +51,7 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void IdsFromFoldersWithModuleTxtShouldBeListed() { - var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock().Object); IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var ids = folders.AvailableExtensions().Select(d => d.Id); Assert.That(ids.Count(), Is.EqualTo(5)); @@ -62,7 +64,7 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void ModuleTxtShouldBeParsedAndReturnedAsYamlDocument() { - var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock().Object); IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var sample1 = folders.AvailableExtensions().Single(d => d.Id == "Sample1"); Assert.That(sample1.Id, Is.Not.Empty); @@ -71,7 +73,7 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void NamesFromFoldersWithModuleTxtShouldFallBackToIdIfNotGiven() { - var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock().Object); IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var names = folders.AvailableExtensions().Select(d => d.Name); Assert.That(names.Count(), Is.EqualTo(5)); @@ -84,7 +86,7 @@ namespace Orchard.Tests.Environment.Extensions { [Test] public void PathsFromFoldersWithModuleTxtShouldFallBackAppropriatelyIfNotGiven() { - var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder()); + var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock().Object); IExtensionFolders folders = new ModuleFolders(new[] { _tempFolderName }, harvester); var paths = folders.AvailableExtensions().Select(d => d.Path); Assert.That(paths.Count(), Is.EqualTo(5)); diff --git a/src/Orchard.Tests/Orchard.Framework.Tests.csproj b/src/Orchard.Tests/Orchard.Framework.Tests.csproj index 33102a64e..46a7febf0 100644 --- a/src/Orchard.Tests/Orchard.Framework.Tests.csproj +++ b/src/Orchard.Tests/Orchard.Framework.Tests.csproj @@ -168,6 +168,8 @@ Code + + Code @@ -187,6 +189,7 @@ + @@ -198,6 +201,7 @@ Code + Code diff --git a/src/Orchard.Tests/Storage/FileSystemStorageProviderTests.cs b/src/Orchard.Tests/Storage/FileSystemStorageProviderTests.cs index 740af7a5c..f153c7909 100644 --- a/src/Orchard.Tests/Storage/FileSystemStorageProviderTests.cs +++ b/src/Orchard.Tests/Storage/FileSystemStorageProviderTests.cs @@ -17,7 +17,12 @@ namespace Orchard.Tests.Storage { _filePath = _folderPath + "\\testfile.txt"; if (Directory.Exists(_folderPath)) { - Directory.Delete(_folderPath, true); + try { + Directory.Delete(_folderPath, true); + } + catch { + // happens sometimes + } } Directory.CreateDirectory(_folderPath); diff --git a/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml b/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml index c0bab8363..7f8dc9013 100644 --- a/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml +++ b/src/Orchard.Web/Core/Common/Views/Fields.Common.Text.cshtml @@ -1,5 +1,5 @@ @{ - string name = Model.Field.DisplayName; + string name = Model.ContentField.DisplayName; string value = Model.Value; } @if (HasText(name) && HasText(value)) { diff --git a/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs b/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs index f9e997ee9..cede58211 100644 --- a/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs +++ b/src/Orchard.Web/Core/Containers/Drivers/ContainerPartDriver.cs @@ -23,20 +23,17 @@ namespace Orchard.Core.Containers.Drivers { private readonly IContentDefinitionManager _contentDefinitionManager; private readonly IOrchardServices _orchardServices; private readonly IContentManager _contentManager; - private readonly dynamic _shapeFactory; private readonly ISiteService _siteService; private readonly IFeedManager _feedManager; public ContainerPartDriver( IContentDefinitionManager contentDefinitionManager, IOrchardServices orchardServices, - IShapeFactory shapeFactory, ISiteService siteService, IFeedManager feedManager) { _contentDefinitionManager = contentDefinitionManager; _orchardServices = orchardServices; _contentManager = orchardServices.ContentManager; - _shapeFactory = shapeFactory; _siteService = siteService; _feedManager = feedManager; @@ -49,43 +46,40 @@ namespace Orchard.Core.Containers.Drivers { if (!part.ItemsShown) return null; - return Combined( - ContentShape("Parts_Container_Contained", - () => { - var container = part.ContentItem; + return ContentShape("Parts_Container_Contained", + () => { + var container = part.ContentItem; - IContentQuery query = _contentManager - .Query(VersionOptions.Published) - .Join().Where(cr => cr.Container.Id == container.Id); + IContentQuery query = _contentManager + .Query(VersionOptions.Published) + .Join().Where(cr => cr.Container.Id == container.Id); - var descendingOrder = part.OrderByDirection == (int)OrderByDirection.Descending; - query = query.OrderBy(part.OrderByProperty, descendingOrder); + var descendingOrder = part.OrderByDirection == (int)OrderByDirection.Descending; + query = query.OrderBy(part.OrderByProperty, descendingOrder); var metadata = container.ContentManager.GetItemMetadata(container); if (metadata!=null) _feedManager.Register(metadata.DisplayText, "rss", new RouteValueDictionary { { "containerid", container.Id } }); - var pager = new Pager(_siteService.GetSiteSettings(), part.PagerParameters); - pager.PageSize = part.PagerParameters.PageSize != null && part.Paginated - ? pager.PageSize - : part.PageSize; + var pager = new Pager(_siteService.GetSiteSettings(), part.PagerParameters); + pager.PageSize = part.PagerParameters.PageSize != null && part.Paginated + ? pager.PageSize + : part.PageSize; - // var pagerShape = _shapeFactory.Pager(pager).TotalItemCount(query.Count()); + var pagerShape = shapeHelper.Pager(pager).TotalItemCount(query.Count()); - var startIndex = part.Paginated ? pager.GetStartIndex() : 0; - var pageOfItems = query.Slice(startIndex, pager.PageSize).ToList(); + var startIndex = part.Paginated ? pager.GetStartIndex() : 0; + var pageOfItems = query.Slice(startIndex, pager.PageSize).ToList(); - var list = _shapeFactory.List(); - list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary"))); - list.Classes.Add("content-items"); - list.Classes.Add("list-items"); + var listShape = shapeHelper.List(); + listShape.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary"))); + listShape.Classes.Add("content-items"); + listShape.Classes.Add("list-items"); - return list; - }), - ContentShape("Parts_Container_Contained_Summary", - () => shapeHelper.Parts_Container_Contained_Summary(ContentPart: part)), - ContentShape("Parts_Container_Contained_SummaryAdmin", - () => shapeHelper.Parts_Container_Contained_SummaryAdmin(ContentPart: part)) - ); + return shapeHelper.Parts_Container_Contained( + List: listShape, + Pager: pagerShape + ); + }); } protected override DriverResult Editor(ContainerPart part, dynamic shapeHelper) { diff --git a/src/Orchard.Web/Core/Containers/Drivers/ContainerWidgetPartDriver.cs b/src/Orchard.Web/Core/Containers/Drivers/ContainerWidgetPartDriver.cs index bc95121eb..e0b418fbb 100644 --- a/src/Orchard.Web/Core/Containers/Drivers/ContainerWidgetPartDriver.cs +++ b/src/Orchard.Web/Core/Containers/Drivers/ContainerWidgetPartDriver.cs @@ -63,7 +63,7 @@ namespace Orchard.Core.Containers.Drivers { } var containers = _contentManager.Query(VersionOptions.Latest).List(); - var listItems = containers.Count() < 1 + var listItems = !containers.Any() ? new[] {new SelectListItem {Text = T("(None - create container enabled items first)").Text, Value = "0"}} : containers.Select(x => new SelectListItem { Value = Convert.ToString(x.Id), diff --git a/src/Orchard.Web/Core/Containers/Views/Parts.Container.Contained.cshtml b/src/Orchard.Web/Core/Containers/Views/Parts.Container.Contained.cshtml new file mode 100644 index 000000000..31455c080 --- /dev/null +++ b/src/Orchard.Web/Core/Containers/Views/Parts.Container.Contained.cshtml @@ -0,0 +1,3 @@ +@Display(Model.List) + +@Display(Model.Pager) \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/ControlWrapper.cs b/src/Orchard.Web/Core/Contents/ControlWrapper.cs new file mode 100644 index 000000000..b3021e08a --- /dev/null +++ b/src/Orchard.Web/Core/Contents/ControlWrapper.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.DisplayManagement.Descriptors; +using Orchard.Environment.Extensions; + +namespace Orchard.Core.Contents { + [OrchardFeature("Contents.ControlWrapper")] + public class ControlWrapper : IShapeTableProvider { + public void Discover(ShapeTableBuilder builder) { + builder.Describe("Content").OnDisplaying(displaying => { + if (!displaying.ShapeMetadata.DisplayType.Contains("Admin")) { + displaying.ShapeMetadata.Wrappers.Add("Content_ControlWrapper"); + } + }); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Contents/Module.txt b/src/Orchard.Web/Core/Contents/Module.txt index 7db853480..a9ee2346f 100644 --- a/src/Orchard.Web/Core/Contents/Module.txt +++ b/src/Orchard.Web/Core/Contents/Module.txt @@ -15,3 +15,8 @@ Features: Description: Rules for the Contents modules Category: Rules Dependencies: Orchard.Rules, Contents + Contents.ControlWrapper: + Name: Content Control Wrapper + Description: Add an Edit button on the front-end for authenticated users + Category: Content + Dependencies: Contents diff --git a/src/Orchard.Web/Core/Contents/Shapes.cs b/src/Orchard.Web/Core/Contents/Shapes.cs index 688a6e8aa..abfbcfa9d 100644 --- a/src/Orchard.Web/Core/Contents/Shapes.cs +++ b/src/Orchard.Web/Core/Contents/Shapes.cs @@ -29,9 +29,6 @@ namespace Orchard.Core.Contents { // Content_[DisplayType]__[Id] e.g. Content-42.Summary displaying.ShapeMetadata.Alternates.Add("Content_" + displaying.ShapeMetadata.DisplayType + "__" + contentItem.Id); - - if ( !displaying.ShapeMetadata.DisplayType.Contains("Admin") ) - displaying.ShapeMetadata.Wrappers.Add("Content_ControlWrapper"); } }); } diff --git a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml index a76fbfe77..3e77d7210 100644 --- a/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Core/Contents/Views/Content.SummaryAdmin.cshtml @@ -18,7 +18,7 @@ @if (Model.Content != null) {
@Display(Model.Content)
diff --git a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs index a6996aeef..cd24a218d 100644 --- a/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs +++ b/src/Orchard.Web/Core/Navigation/Controllers/AdminController.cs @@ -109,7 +109,7 @@ namespace Orchard.Core.Navigation.Controllers { return RedirectToAction("Index"); } - [ValidateAntiForgeryTokenOrchard] + [HttpPost] public ActionResult Delete(int id) { if (!_services.Authorizer.Authorize(Permissions.ManageMainMenu, T("Couldn't manage the main menu"))) return new HttpUnauthorizedResult(); diff --git a/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs b/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs index b5dd18bd4..32a2cdbfb 100644 --- a/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs +++ b/src/Orchard.Web/Core/Navigation/Services/MainMenuNavigationProvider.cs @@ -17,7 +17,7 @@ namespace Orchard.Core.Navigation.Services { public string MenuName { get { return "main"; } } public void GetNavigation(NavigationBuilder builder) { - var menuParts = _contentManager.Query().Where(x => x.OnMainMenu).List(); + var menuParts = _contentManager.Query().Where(x => x.OnMainMenu).WithQueryHints(new QueryHints().ExpandRecords()).List(); foreach (var menuPart in menuParts) { if (menuPart != null) { var part = menuPart; diff --git a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml index 855edb6e4..83c531456 100644 --- a/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Core/Navigation/Views/Admin/Index.cshtml @@ -29,7 +29,7 @@ @if (!menuPartEntry.IsMenuItem) { } else {} - @T("Delete") + @Html.ActionLink(T("Delete").Text, "Delete", new { id = menuPartEntry.MenuItemId }, new { @class="remove", itemprop="RemoveUrl UnsafeUrl" }) ++menuPartEntryIndex; } diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 9bb366070..f39596a62 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -102,6 +102,7 @@ + @@ -458,7 +459,7 @@ - + diff --git a/src/Orchard.Web/Core/Settings/Services/SiteService.cs b/src/Orchard.Web/Core/Settings/Services/SiteService.cs index e9a9f140f..5fc76e488 100644 --- a/src/Orchard.Web/Core/Settings/Services/SiteService.cs +++ b/src/Orchard.Web/Core/Settings/Services/SiteService.cs @@ -42,7 +42,7 @@ namespace Orchard.Core.Settings.Services { return site.Id; }); - return _contentManager.Get(siteId); + return _contentManager.Get(siteId, VersionOptions.Published, new QueryHints().ExpandRecords()); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Core/Shapes/Scripts/base.js b/src/Orchard.Web/Core/Shapes/Scripts/base.js index a52bb0e86..d94688056 100644 --- a/src/Orchard.Web/Core/Shapes/Scripts/base.js +++ b/src/Orchard.Web/Core/Shapes/Scripts/base.js @@ -208,7 +208,14 @@ } form.css({ "position": "absolute", "left": "-9999em" }); $("body").append(form); - _this.click(function () { form.submit(); return false; }); + _this.click(function () { + if (_this.filter("[itemprop~='RemoveUrl']").length == 1) { + if (!confirm(confirmRemoveMessage)) { + return false; + } + } + form.submit(); + }); }); }); })(jQuery); diff --git a/src/Orchard.Web/Core/Shapes/Views/ErrorPage.cshtml b/src/Orchard.Web/Core/Shapes/Views/ErrorPage.cshtml index 5367584ed..3c4d4b371 100644 --- a/src/Orchard.Web/Core/Shapes/Views/ErrorPage.cshtml +++ b/src/Orchard.Web/Core/Shapes/Views/ErrorPage.cshtml @@ -1,6 +1,10 @@ -
+@* + ErrorPage(string Message, Exception Exception) +*@ + +

@Html.TitleForPage(T("Oops. Something went wrong ... sorry"))

-

@T("An unhandled exception has occurred and the request was terminated. Please refresh the page. If the error persists, go back").Text

+

@T("An unhandled exception has occurred and the request was terminated. Please refresh the page. If the error persists, go back").Text

diff --git a/src/Orchard.Web/Core/Shapes/Views/User.cshtml b/src/Orchard.Web/Core/Shapes/Views/User.cshtml index 8819882ad..7e31bfb74 100644 --- a/src/Orchard.Web/Core/Shapes/Views/User.cshtml +++ b/src/Orchard.Web/Core/Shapes/Views/User.cshtml @@ -10,6 +10,6 @@ @Html.ActionLink(T("Dashboard").ToString(), "Index", new { Area = "Dashboard", Controller = "Admin" }) } else { - + }
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs index 2b55d1f64..5c144a140 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Services/BlogPostService.cs @@ -1,12 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using JetBrains.Annotations; using Orchard.Blogs.Models; -using Orchard.ContentManagement.Aspects; -using Orchard.Core.Common.Models; using Orchard.ContentManagement; +using Orchard.ContentManagement.Aspects; +using Orchard.ContentManagement.MetaData; +using Orchard.Core.Common.Models; using Orchard.Data; +using Orchard.Data.Conventions; using Orchard.Tasks.Scheduling; namespace Orchard.Blogs.Services { @@ -16,7 +19,11 @@ namespace Orchard.Blogs.Services { private readonly IRepository _blogArchiveRepository; private readonly IPublishingTaskManager _publishingTaskManager; - public BlogPostService(IContentManager contentManager, IRepository blogArchiveRepository, IPublishingTaskManager publishingTaskManager) { + public BlogPostService( + IContentManager contentManager, + IRepository blogArchiveRepository, + IPublishingTaskManager publishingTaskManager, + IContentDefinitionManager contentDefinitionManager) { _contentManager = contentManager; _blogArchiveRepository = blogArchiveRepository; _publishingTaskManager = publishingTaskManager; @@ -43,7 +50,10 @@ namespace Orchard.Blogs.Services { } public IEnumerable Get(BlogPart blogPart, int skip, int count, VersionOptions versionOptions) { - return GetBlogQuery(blogPart, versionOptions).Slice(skip, count).ToList().Select(ci => ci.As()); + return GetBlogQuery(blogPart, versionOptions) + .Slice(skip, count) + .ToList() + .Select(ci => ci.As()); } public int PostCount(BlogPart blogPart) { @@ -116,8 +126,11 @@ namespace Orchard.Blogs.Services { private IContentQuery GetBlogQuery(ContentPart blog, VersionOptions versionOptions) { return - _contentManager.Query(versionOptions, "BlogPost").Join().Where( - cr => cr.Container == blog.Record.ContentItemRecord).OrderByDescending(cr => cr.CreatedUtc); + _contentManager.Query(versionOptions, "BlogPost") + .Join().Where( + cr => cr.Container == blog.Record.ContentItemRecord).OrderByDescending(cr => cr.CreatedUtc) + .WithQueryHintsFor("BlogPost") + ; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Views/Blog.DeleteButton.cshtml b/src/Orchard.Web/Modules/Orchard.Blogs/Views/Blog.DeleteButton.cshtml index 791c01106..e7cb0a9a5 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Views/Blog.DeleteButton.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Views/Blog.DeleteButton.cshtml @@ -1,3 +1,3 @@ 
- +
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs index e66ea673c..ce14de615 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs @@ -19,14 +19,15 @@ namespace Orchard.Comments.Drivers { return null; var commentsForCommentedContent = _commentService.GetCommentsForCommentedContent(part.ContentItem.Id); + Func pendingCount = () => commentsForCommentedContent.Where(x => x.Status == CommentStatus.Pending).Count(); return Combined( ContentShape("Parts_Comments", () => shapeHelper.Parts_Comments(ContentPart: part)), ContentShape("Parts_Comments_Count", - () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: commentsForCommentedContent.Where(x => x.Status == CommentStatus.Pending).Count())), + () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)), ContentShape("Parts_Comments_Count_SummaryAdmin", - () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: commentsForCommentedContent.Where(x => x.Status == CommentStatus.Pending).Count())) + () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: commentsForCommentedContent.Count(), PendingCount: pendingCount)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Views/Parts.Comments.Count.SummaryAdmin.cshtml b/src/Orchard.Web/Modules/Orchard.Comments/Views/Parts.Comments.Count.SummaryAdmin.cshtml index b544f7fdf..4e9e97c5f 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Views/Parts.Comments.Count.SummaryAdmin.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Comments/Views/Parts.Comments.Count.SummaryAdmin.cshtml @@ -1,6 +1,6 @@ 
  • - @Display.CommentSummaryLinks(item: Model.ContentPart.ContentItem, count: Model.CommentCount, pendingCount: Model.PendingCount) + @Display.CommentSummaryLinks(item: Model.ContentPart.ContentItem, count: Model.CommentCount, pendingCount: ((Func)Model.PendingCount)())) @T(" | ") 
\ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/Edit.cshtml b/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/Edit.cshtml index b26d4ce0a..ce06b9201 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/Edit.cshtml +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/Edit.cshtml @@ -34,7 +34,7 @@
- +
} diff --git a/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/EditPart.cshtml b/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/EditPart.cshtml index 470f6c49b..6fb94fef1 100644 --- a/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/EditPart.cshtml +++ b/src/Orchard.Web/Modules/Orchard.ContentTypes/Views/Admin/EditPart.cshtml @@ -23,7 +23,7 @@
- +
} diff --git a/src/Orchard.Web/Modules/Orchard.Email/Rules/MailActions.cs b/src/Orchard.Web/Modules/Orchard.Email/Rules/MailActions.cs index 336bd4139..055512824 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Rules/MailActions.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Rules/MailActions.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Orchard.ContentManagement.Records; using Orchard.Core.Common.Models; using Orchard.Environment.Extensions; using Orchard.Events; @@ -41,7 +40,9 @@ namespace Orchard.Email.Rules { Func display = context => T("Send an e-mail"); describe.For("Messaging", T("Messaging"), T("Messages")) - .Element("SendEmail", T("Send e-mail"), T("Sends an e-mail to a specific user."), (Func)Send, display, "ActionEmail"); + .Element( + "SendEmail", T("Send e-mail"), T("Sends an e-mail to a specific user."), (Func)Send, + display, "ActionEmail"); } private bool Send(dynamic context) { @@ -55,6 +56,8 @@ namespace Orchard.Email.Rules { if (owner != null && owner.Record != null) { _messageManager.Send(owner.Record, MessageType, "email", properties); } + _messageManager.Send( + SplitEmail(owner.As().Email), MessageType, "email", properties); } } else if (recipient == "author") { @@ -74,15 +77,20 @@ namespace Orchard.Email.Rules { _messageManager.Send(user.ContentItem.Record, MessageType, "email", properties); } } + else if (recipient == "other") { + var email = properties["RecipientOther"]; + _messageManager.Send(SplitEmail(email), MessageType, "email", properties); + } return true; } + + private static IEnumerable SplitEmail(string commaSeparated) { + return commaSeparated.Split(new[] { ',', ';' }); + } } public class MailActionsHandler : IMessageEventHandler { - private readonly IContentManager _contentManager; - - public MailActionsHandler(IContentManager contentManager) { - _contentManager = contentManager; + public MailActionsHandler() { T = NullLocalizer.Instance; } @@ -92,7 +100,8 @@ namespace Orchard.Email.Rules { if (context.MessagePrepared) return; - if (!context.Recipients.Any()) { + if ((context.Recipients == null || !context.Recipients.Any()) && + (context.Addresses == null || !context.Addresses.Any())) { return; } @@ -107,12 +116,10 @@ namespace Orchard.Email.Rules { } private static void FormatEmailBody(MessageContext context) { - context.MailMessage.Body = "

" + context.MailMessage.Body; - context.MailMessage.Body += "

"; + context.MailMessage.Body = "

" + context.MailMessage.Body + "

"; } public void Sent(MessageContext context) { } } - } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Email/Rules/MailForms.cs b/src/Orchard.Web/Modules/Orchard.Email/Rules/MailForms.cs index a9cf0c4ec..8134d60d9 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Rules/MailForms.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Rules/MailForms.cs @@ -1,5 +1,4 @@ using System; -using System.Web.Mvc; using Orchard.DisplayManagement; using Orchard.Environment.Extensions; using Orchard.Events; @@ -21,16 +20,46 @@ namespace Orchard.Email.Rules { } public void Describe(dynamic context) { - Func form = + Func form = shape => Shape.Form( Id: "ActionEmail", - _Type: Shape.SelectList( - Id: "Recipient", Name: "Recipient", + _Type: Shape.FieldSet( Title: T("Send to"), - Description: T("Select who should be the recipient of this e-mail.")) - .Add(new SelectListItem { Value = "owner", Text = T("Owner").Text }) - .Add(new SelectListItem { Value = "author", Text = T("Author").Text }) - .Add(new SelectListItem { Value = "admin", Text = T("Site Admin").Text }), + _RecipientOwner: Shape.Radio( + Id: "recipient-owner", + Name: "Recipient", + Value: "owner", + Title: T("Owner"), + Description: T("The owner of the content item in context, such as a blog post's author.") + ), + _RecipientAuthor: Shape.Radio( + Id: "recipient-author", + Name: "Recipient", + Value: "author", + Title: T("Author"), + Description: T("The current user when this action executes.") + ), + _RecipientAdmin: Shape.Radio( + Id: "recipient-admin", + Name: "Recipient", + Value: "admin", + Title: T("Site Admin"), + Description: T("The site administrator.") + ), + _RecipientOther: Shape.Radio( + Id: "recipient-other", + Name: "Recipient", + Value: "other", + Title: T("Other:") + ), + _OtherEmails: Shape.Textbox( + Id: "recipient-other-email", + Name: "RecipientOther", + Title: T("E-mail"), + Description: T("Specify a comma-separated list of e-mail recipients."), + Classes: new[] { "large", "text", "tokenized" } + ) + ), _Subject: Shape.Textbox( Id: "Subject", Name: "Subject", Title: T("Subject"), @@ -68,6 +97,11 @@ namespace Orchard.Email.Rules { if (context.ValueProvider.GetValue("Body").AttemptedValue == String.Empty) { context.ModelState.AddModelError("Body", T("You must provide a Body").Text); } + + if (context.ValueProvider.GetValue("RecipientOther").AttemptedValue == String.Empty && + context.ValueProvider.GetValue("Recipient").AttemptedValue == "other") { + context.ModelState.AddModelError("Recipient", T("You must provide an e-mail address").Text); + } } } } diff --git a/src/Orchard.Web/Modules/Orchard.Email/Services/EmailMessageEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Email/Services/EmailMessageEventHandler.cs index 33ea9cbf9..03ed2ee44 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Services/EmailMessageEventHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Services/EmailMessageEventHandler.cs @@ -12,19 +12,21 @@ namespace Orchard.Email.Services { } public void Sending(MessageContext context) { - foreach(var rec in context.Recipients) { - var contentItem = _contentManager.Get(rec.Id); - if (contentItem == null) - return; + if (context.Recipients != null) { + foreach (var rec in context.Recipients) { + var contentItem = _contentManager.Get(rec.Id); + if (contentItem == null) + return; - var recipient = contentItem.As(); - if (recipient == null) - return; + var recipient = contentItem.As(); + if (recipient == null) + return; - context.MailMessage.To.Add(recipient.Email); + context.MailMessage.To.Add(recipient.Email); + } } - foreach(var address in context.Addresses) { + foreach (var address in context.Addresses) { context.MailMessage.To.Add(address); } } diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs new file mode 100644 index 000000000..80fe23920 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Lists/Drivers/ContainerPartDriver.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Orchard.ContentManagement.Drivers; +using Orchard.Core.Containers.Models; + +namespace Orchard.Lists.Drivers { + public class ContainerPartDriver : ContentPartDriver{ + protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) { + return ContentShape("Parts_Container_Contained_SummaryAdmin", + () => shapeHelper.Parts_Container_Contained_SummaryAdmin(ContentPart: part) + ); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj index a59b9e679..bbce6447e 100644 --- a/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj +++ b/src/Orchard.Web/Modules/Orchard.Lists/Orchard.Lists.csproj @@ -18,6 +18,7 @@ 3.5 + false true @@ -48,6 +49,7 @@ + @@ -83,7 +85,9 @@
- + + Designer + @@ -102,6 +106,7 @@ +