コード例 #1
0
        /// <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();
        }
コード例 #2
0
 public override bool IsApplicable(DatabaseStatus status)
 {
     return(status.DatabaseVersion < DatabaseStatus.RequiredDatabaseVersion ||
            !status.HasSchema ||
            repository.Count(new Parameter("ChildState", Collections.CollectionState.Unknown)) > 0);
 }
コード例 #3
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);
        }