Отложенный поиск RavenDB по индексу возвращает неинициализированные статистические данные

#ravendb #lazy-evaluation

#ravendb #отложенная оценка

Вопрос:

Я пытаюсь запускать отложенные запросы к raven db и получать подсчеты по общим результатам сопоставления. Я обнаружил, что при запросе по статическому индексу отложенный поиск не инициализирует статистику при выполнении запроса, но в остальном все возвращается нормально. Ниже приведен тест, подтверждающий это поведение.

 [TestFixture]
public class CanSearchLazily
{
    private const int ServerPort = 8085;
    private readonly string _serverAddress = @"http://localhost:{0}".For(ServerPort);

    [Test]
    public void CanGetTotalResultsFromStatisticsOnLazySearchAgainstDynamicIndex()
    {
        CanGetTotalResultsFromStatisticsOnLazySearchAgainstAnIndex();
    }

    [Test]
    public void CanGetTotalResultsFromStatisticsOnLazySearchAgainstStaticIndex()
    {
        CanGetTotalResultsFromStatisticsOnLazySearchAgainstAnIndex("UserByFirstName");
    }

    private void CanGetTotalResultsFromStatisticsOnLazySearchAgainstAnIndex(string indexName = "")
    {
        BuilderSetup.DisablePropertyNamingFor<User, string>(x => x.Id);

        var users = Builder<User>.CreateListOfSize(2000).All()
            .With(x => x.FirstName = GetRandom.FirstName())
            .With(x => x.LastName = GetRandom.LastName())
            .Build();

        using (GetNewServer())
        using (var store = new DocumentStore { Url = _serverAddress }.Initialize())
        {
            using (var session = store.OpenSession())
            {
                users.ForEach(session.Store);
                session.SaveChanges();
                IndexCreation.CreateIndexes(typeof(UserByFirstName).Assembly, store);
                session.Query<User, UserByFirstName>().Customize(x => x.WaitForNonStaleResults()).ToList();
            }

            using (var session = store.OpenSession())
            {
                var names = session.Query<User>().Select(u => u.FirstName).Distinct().Take(15).ToList();

                RavenQueryStatistics stats;

                var query = string.IsNullOrEmpty(indexName) 
                        ? session.Query<User>().Statistics(out stats).Where(x => x.FirstName.In(names))
                        : session.Query<User>(indexName).Statistics(out stats).Where(x => x.FirstName.In(names));

                var results = query.Take(8).Lazily();

                Assert.AreEqual(8, results.Value.ToList().Count);
                Assert.AreEqual(DateTime.Now.Year, stats.IndexTimestamp.Year, "the index should have the current year on its timestamp");
                Assert.IsTrue(stats.TotalResults > 0, "The stats should return total results");
            }
        }
    }

    protected RavenDbServer GetNewServer(bool initializeDocumentsByEntitiyName = true)
    {
        var ravenConfiguration = new RavenConfiguration
        {
            Port = ServerPort,
            RunInMemory = true,
            DataDirectory = "Data",
            AnonymousUserAccessMode = AnonymousUserAccessMode.All
        };

        if (ravenConfiguration.RunInMemory == false)
            IOExtensions.DeleteDirectory(ravenConfiguration.DataDirectory);

        var ravenDbServer = new RavenDbServer(ravenConfiguration);

        if (initializeDocumentsByEntitiyName)
        {
            using (var documentStore = new DocumentStore
            {
                Url = _serverAddress
            }.Initialize())
            {
                new RavenDocumentsByEntityName().Execute(documentStore);
            }
        }

        return ravenDbServer;
    }
}

[Serializable]
public class User
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class UserByFirstName : AbstractIndexCreationTask<User>
{
    public UserByFirstName()
    {
        Map = users => from user in users
                       select new {user.FirstName};
    }
}
  

Комментарии:

1. Какую сборку вы используете? Мы только что протестировали это в последней версии, и она работает нормально