Personal tools
You are here: Home Статьи Как использовать mtime в индексах
Document Actions

Как использовать mtime в индексах

by cray last modified 2007-12-23 14:34

Эта статья рассказывает, скорее, о том, как работают транзакции, так как именно благодаря мезанизму транзакций поддерживается mtime и удается отследить то, что изменение этого поля уже произошло.

Как использовать mtime в индексах:

Статья написана по мотивам разработки Zope3 адаптера для объектов с интерфейсами IPersistent к специально введённому интерфейсу IMTime, содержащему одно единственное свойство mtime.

mtime - это поле _p_mtime у Persistent объектов, которое содержит время последней модификации, что порождает понятное желание проиндексировать по этому полю и использовать его, скажем, для сортировки по времени модификации (всем известно, что удобнее видеть первыми статьи, которые только что модифицировали; конечно это не общее решение, но все-таки...).

На пути к реализации указанного замысла встает проблема: поле _p_mtime получает значение в тот момент, когда объект транзакция уже закрыта. Т.е. в индексе отобразится время предыдущей модификации. Это тоже неплохо, но как-то не очень, и хочется эту досадную ситуацию поправить.

Сразу предостережем против индексации текущего времени: такой адаптер написать можно, и действительно, при изменении объекта в индексе будет отображатся время последнего изменения. Проблема с подобной реализацией будет заключаться в том, что при полной переиндексации в индекс будет занесено время индексации конкретного объекта, т.е. на наивном уровне - случайная величина, что не очень хорошо.

Однако, решение поставленной задачи есть, и в рамках Zope3 код, делающий то, что нам нужно, будет выглядеть следующим образом (ниже):

        def mtime(self):
            if IPersistent(self.ob)._p_changed :
                return time.time()
            else:
                return IPersistent(ob)._p_mtime

Этот код вернет текущее время, если объект был изменен в текущей транзакции и время модификации объекта в противном случае. Таким образом сочетаются лучшие черты обоих подходов. Адаптер, который выполняет необходимые действия с помощью приведённого кода, вы можете найти в продукте адаптер mtime, доступном на PyPI.


Powered by Plone CMS, the Open Source Content Management System