/// <summary>Searches for items below an ancestor that matches the given query.</summary> /// <param name="ancestor">The ancestor below which the results should be found.</param> /// <param name="query">The query text.</param> /// <param name="skip">A number of items to skip.</param> /// <param name="take">A number of items to take.</param> /// <returns>An enumeration of items matching the search query.</returns> public IEnumerable <ContentItem> Search(string ancestor, string query, int skip, int take, bool?onlyPages, string[] types, out int totalRecords) { var q = new ParameterCollection(); if (ancestor != null) { q.Add(Parameter.Like("AncestralTrail", ancestor + "%") & Parameter.IsNotNull("Title")); } if (!string.IsNullOrEmpty(query)) { var words = query.Split(' ').Where(w => w.Length > 0).Select(w => "%" + w.Trim('*') + "%"); q.Add(new ParameterCollection(Operator.Or, words.Select(word => (Parameter.Like("Title", word) | Parameter.Like(null, word).Detail())))); } if (onlyPages.HasValue) { if (onlyPages.Value) { q.Add(Parameter.IsNull("ZoneName")); } else { q.Add(Parameter.IsNotNull("ZoneName")); } } if (types != null) { q.Add(Parameter.In("class", types)); } totalRecords = (int)repository.Count(q); return(repository.Find(q.Skip(skip).Take(take))); //var q = finder.Where.AncestralTrail.Like(ancestor + "%") // .And.Title.IsNull(false); //var words = query.Split(' ').Where(w => w.Length > 0).Select(w => "%" + w.Trim('*') + "%"); //foreach (var word in words) //{ // q = q.And.OpenBracket() // .Title.Like(word) // .Or.Detail().Like(word) // .CloseBracket(); //} //if (onlyPages.HasValue) // q = q.And.OpenBracket() // .ZoneName.IsNull(onlyPages.Value) // .Or.ZoneName.Eq("") // .CloseBracket(); //if (types != null) // q = q.And.Property("class").In(types); //totalRecords = q.Count(); //return q.FirstResult(skip).MaxResults(take).Select(); }
public override bool IsApplicable(DatabaseStatus status) { return(status.DatabaseVersion < DatabaseStatus.RequiredDatabaseVersion || !status.HasSchema || repository.Count(new Parameter("ChildState", Collections.CollectionState.Unknown)) > 0); }
public void Replication_Works() { var count = CreateContent(); Assert.AreEqual(0, Storage.GetItems().Count()); // master export all Master.Syncronize(); Assert.AreEqual(count, Storage.GetItems().Count()); // slave import all, master unaffected Slave.Syncronize(); Assert.AreEqual(count, SlaveRepo.Count()); Assert.AreEqual(count, repository.Count()); Assert.IsTrue(SlaveFlushable.Flushed); // delete one item repository.Delete(item2); Assert.IsFalse((repository as XmlContentItemRepository).ExistsLocal(item2)); // ensure file is deleted on disk, too Assert.AreEqual(--count, repository.Count()); Master.Syncronize(); Assert.AreEqual(count, Storage.GetItems().Count()); Slave.Syncronize(); Assert.AreEqual(count, SlaveRepo.Count()); Assert.IsNull(SlaveRepo.Get(item2.ID)); Assert.IsFalse((repository as XmlContentItemRepository).ExistsLocal(item2)); // ensure file is deleted on disk, too // changing an item does nothing ... item1b.Title = "Hello World"; Assert.AreEqual(0, Master.Syncronize()); // TODO // now publish the item by bumping the date item1b.SavedBy = "test"; item1b.Published = Utility.CurrentTime(); persister.Save(item1b); // create a new item ContentItem item3 = CreateOneItem <TestItem>(13, "item3", root); item3.SavedBy = "nobody"; repository.SaveOrUpdate(item3); Assert.AreEqual(2, Master.Syncronize()); Slave.Syncronize(); Assert.AreEqual(++count, SlaveRepo.Count()); var i3 = SlaveRepo.Get(item3.ID); Assert.NotNull(i3); Assert.That(i3 == item3); // TODO verify this check // now update the root root.Title = "new root"; root.Published = Utility.CurrentTime(); persister.Save(root); Master.Syncronize(); Slave.Syncronize(); var sroot = SlaveRepo.Get(root.ID); Assert.AreEqual(root.Title, sroot.Title); Assert.AreEqual(root.Children.Count, sroot.Children.Count); // now update item below the root and move it down Assert.AreEqual(root, item1.Parent); item1.Title = "item1 moved down"; item1.SortOrder += 99; item1.Published = Utility.CurrentTime(); persister.Save(item1); Master.Syncronize(); Slave.Syncronize(); var sitem1 = SlaveRepo.Get(item1.ID); Assert.AreEqual(item1.Title, sitem1.Title); sroot = SlaveRepo.Get(root.ID); Assert.AreEqual(root.Children.Count, sroot.Children.Count); var sitem3 = SlaveRepo.Get(item3.ID); Assert.AreEqual(sitem3, sroot.Children[0]); Assert.AreEqual(sitem1, sroot.Children[1]); // Master never gets flushed Assert.IsFalse(MasterFlushable.Flushed); }