def test_DateIndex(self):
     from xml.dom.minidom import parseString
     from Products.PluginIndexes.DateIndex.DateIndex import DateIndex
     from Products.GenericSetup.testing import DummySetupEnviron
     from Products.GenericSetup.PluginIndexes.exportimport \
             import DateIndexNodeAdapter
     environ = DummySetupEnviron()
     def _no_clear(*a):
         raise AssertionError("Don't clear me!")
     index = DateIndex('foo_date')
     index._setPropValue('index_naive_time_as_local', True)
     index.clear = _no_clear 
     adapted = DateIndexNodeAdapter(index, environ)
     adapted.node = parseString(_DATE_XML).documentElement # no raise
Example #2
0
    def test_DateIndex(self):
        from xml.dom.minidom import parseString
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex
        from Products.GenericSetup.testing import DummySetupEnviron
        from Products.GenericSetup.PluginIndexes.exportimport \
                import DateIndexNodeAdapter
        environ = DummySetupEnviron()

        def _no_clear(*a):
            raise AssertionError("Don't clear me!")

        index = DateIndex('foo_date')
        index._setPropValue('index_naive_time_as_local', True)
        index.clear = _no_clear
        adapted = DateIndexNodeAdapter(index, environ)
        adapted.node = parseString(_DATE_XML).documentElement  # no raise
Example #3
0
 def setUp(self):
     self._values = (
         (0, Dummy('a', None)),                            # None
         (1, Dummy('b', DateTime(0))),                     # 1055335680
         (2, Dummy('c', DateTime('2002-05-08 15:16:17'))), # 1072667236
         (3, Dummy('d', DateTime('2032-05-08 15:16:17'))), # 1088737636
         (4, Dummy('e', DateTime('2062-05-08 15:16:17'))), # 1018883325
         (5, Dummy('e', DateTime('2062-05-08 15:16:17'))), # 1018883325
         (6, Dummy('f', 1072742620.0)),                    # 1073545923
         (7, Dummy('f', 1072742900)),                      # 1073545928
         (8, Dummy('g', date(2034,2,5))),                  # 1073599200
         (9, Dummy('h', datetime(2034,2,5,15,20,5))),      # (varies)
         (10, Dummy('i', datetime(2034,2,5,10,17,5,
                                  tzinfo=Eastern))),       # 1073600117
     )
     self._index = DateIndex('date')
     self._noop_req  = {'bar': 123}
     self._request   = {'date': DateTime(0)}
     self._min_req   = {'date': {'query': DateTime('2032-05-08 15:16:17'),
         'range': 'min'}}
     self._max_req   = {'date': {'query': DateTime('2032-05-08 15:16:17'),
         'range': 'max'}}
     self._range_req = {'date': {'query':(DateTime('2002-05-08 15:16:17'),
                                 DateTime('2062-05-08 15:16:17')),
                        'range': 'min:max'}}
     self._zero_req  = {'date': 0}
     self._none_req  = {'date': None}
     self._float_req = {'date': 1072742620.0}
     self._int_req   = {'date': 1072742900}
Example #4
0
class DateIndexNodeAdapterTests(NodeAdapterTestCase, unittest.TestCase):

    layer = ExportImportZCMLLayer

    def _getTargetClass(self):
        from ..exportimport import DateIndexNodeAdapter
        return DateIndexNodeAdapter

    def setUp(self):
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex
        self._obj = DateIndex('foo_date')
        self._obj._setPropValue('precision', 0)
        self._XML = _DATE_XML

    def _verifyImport(self, obj):
        self.assertEqual(obj.id, 'foo_date')
Example #5
0
    def setUp(self):
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex

        PlacelessSetup.setUp(self)
        zcml.load_config('meta.zcml', Products.Five)
        zcml.load_config('configure.zcml', Products.GenericSetup.PluginIndexes)

        self._obj = DateIndex('foo_date')
        self._XML = _DATE_XML
Example #6
0
    def setUp(self):
        import Products.GenericSetup.PluginIndexes
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex

        NodeAdapterTestCase.setUp(self)
        zcml.load_config('configure.zcml', Products.GenericSetup.PluginIndexes)

        self._obj = DateIndex('foo_date')
        self._XML = _DATE_XML
Example #7
0
def recreateCatalog(self, zcm, lang):

    #-- Create catalog
    cat_id = 'catalog_%s' % lang
    root = self.getRootElement()
    if cat_id in root.objectIds():
        root.manage_delObjects([cat_id])
    cat_title = 'Default catalog'
    zcatalog = ZCatalog.ZCatalog(id=cat_id, title=cat_title, container=root)
    root._setObject(zcatalog.id, zcatalog)
    zcatalog = getZCatalog(self, lang)
    writeChangesLog(
        zcatalog, '[recreateCatalog]: ' +
        self.getZMILangStr('MSG_INSERTED') % zcatalog.meta_type)

    #-- Add lexicon
    addLexicon(self, zcatalog)

    #-- Add columns
    for index_name in ['id', 'meta_id'
                       ] + ['zcat_column_%s' % x for x in extra_column_ids]:
        zcatalog.manage_addColumn(index_name)

    #-- Add Indexes (incl. Columns)
    for attr_id in zcm._getAttrIds():
        attr_type = 'string'
        for meta_id in self.getMetaobjIds():
            meta_obj_attr = self.getMetaobjAttr(meta_id, attr_id)
            if meta_obj_attr:
                attr_type = meta_obj_attr['type']
                break
        index_name = 'zcat_index_%s' % attr_id
        index_type = zcm.getConfProperty('ZCatalog.TextIndexType',
                                         'ZCTextIndex')
        if attr_id == 'home_id':
            index_type = KeywordIndex(attr_id)
        elif attr_type == 'date':
            index_type = DateIndex(attr_id)
        extra = None
        if index_type == 'ZCTextIndex':
            extra = Empty()
            extra.doc_attr = index_name
            extra.index_type = 'Okapi BM25 Rank'
            extra.lexicon_id = 'Lexicon'
        elif index_type != 'KeywordIndex':
            extra = {}
            extra['default_encoding'] = 'utf-8'
            extra['indexed_fields'] = index_name
            extra['fields'] = [index_name]
            extra['near_distance'] = 5
            extra['splitter_casefolding'] = 1
            extra['splitter_max_len'] = 64
            extra['splitter_separators'] = '.+-_@'
            extra['splitter_single_chars'] = 0
        zcatalog.manage_addColumn(index_name)
        zcatalog.manage_addIndex(index_name, index_type, extra)
Example #8
0
 def setUp(self):
     self._values = (
         (0, Dummy('a', None)),  # None
         (1, Dummy('b', DateTime(0))),  # 1055335680
         (2, Dummy('c', DateTime('2002-05-08 15:16:17'))),  # 1072667236
         (3, Dummy('d', DateTime('2032-05-08 15:16:17'))),  # 1088737636
         (4, Dummy('e', DateTime('2062-05-08 15:16:17'))),  # 1018883325
         (5, Dummy('e', DateTime('2062-05-08 15:16:17'))),  # 1018883325
         (6, Dummy('f', 1072742620.0)),  # 1073545923
         (7, Dummy('f', 1072742900)),  # 1073545928
         (8, Dummy('g', date(2034, 2, 5))),  # 1073599200
         (9, Dummy('h', datetime(2034, 2, 5, 15, 20, 5))),  # (varies)
         (10, Dummy('i', datetime(2034, 2, 5, 10, 17, 5,
                                  tzinfo=Eastern))),  # 1073600117
     )
     self._index = DateIndex('date')
     self._noop_req = {'bar': 123}
     self._request = {'date': DateTime(0)}
     self._min_req = {
         'date': {
             'query': DateTime('2032-05-08 15:16:17'),
             'range': 'min'
         }
     }
     self._max_req = {
         'date': {
             'query': DateTime('2032-05-08 15:16:17'),
             'range': 'max'
         }
     }
     self._range_req = {
         'date': {
             'query': (DateTime('2002-05-08 15:16:17'),
                       DateTime('2062-05-08 15:16:17')),
             'range':
             'min:max'
         }
     }
     self._zero_req = {'date': 0}
     self._none_req = {'date': None}
     self._float_req = {'date': 1072742620.0}
     self._int_req = {'date': 1072742900}
Example #9
0
    def getCatalog(self):
        try:
            return self._getOb(CATALOG_NAME)
        except AttributeError:
            from Products.ZCatalog.ZCatalog import manage_addZCatalog

            # Make catalog for Devices
            manage_addZCatalog(self, CATALOG_NAME, CATALOG_NAME)
            zcat = self._getOb(CATALOG_NAME)
            cat = zcat._catalog
            for idxname in ['status', 'type', 'user']:
                cat.addIndex(idxname, makeCaseInsensitiveFieldIndex(idxname))
            for idxname in ['scheduled', 'started', 'finished']:
                cat.addIndex(idxname, DateIndex(idxname))
            return zcat
Example #10
0
 def testMeetingValues(self):
     brain = api.content.find(context=self.meeting, portal_type="Item")[0]
     indexes = self.catalog.getIndexDataForRID(brain.getRID())
     # indexed item number is a sortable integer
     self.assertEqual(self.item.number, "1")
     self.assertEqual(self.item.sortable_number, 100)
     self.assertEqual(indexes.get("sortable_number"), 100)
     self.assertEqual(indexes.get("number"), "1")
     self.assertEqual(self.meeting.title, indexes.get("linkedMeetingTitle"))
     self.assertEqual(self.meeting.UID(), indexes.get("linkedMeetingUID"))
     self.assertEqual(
         indexes.get("linkedMeetingDate"),
         DateIndex("test")._convert(
             datetime(2018, 12, 20, 18, 25, 43, 51100)),
     )
     self.assertEqual(str(self.meeting.date_time.year), indexes.get("year"))
Example #11
0
    def setUp(self):
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex

        self._obj = DateIndex('foo_date')
        self._XML = _DATE_XML
Example #12
0
class DI_Tests(unittest.TestCase):
    def setUp(self):
        self._values = (
            (0, Dummy('a', None)),                            # None
            (1, Dummy('b', DateTime(0))),                     # 1055335680
            (2, Dummy('c', DateTime('2002-05-08 15:16:17'))), # 1072667236
            (3, Dummy('d', DateTime('2032-05-08 15:16:17'))), # 1088737636
            (4, Dummy('e', DateTime('2062-05-08 15:16:17'))), # 1018883325
            (5, Dummy('e', DateTime('2062-05-08 15:16:17'))), # 1018883325
            (6, Dummy('f', 1072742620.0)),                    # 1073545923
            (7, Dummy('f', 1072742900)),                      # 1073545928
            (8, Dummy('g', date(2034,2,5))),                  # 1073599200
            (9, Dummy('h', datetime(2034,2,5,15,20,5))),      # (varies)
            (10, Dummy('i', datetime(2034,2,5,10,17,5,
                                     tzinfo=Eastern))),       # 1073600117
        )
        self._index = DateIndex('date')
        self._noop_req  = {'bar': 123}
        self._request   = {'date': DateTime(0)}
        self._min_req   = {'date': {'query': DateTime('2032-05-08 15:16:17'),
            'range': 'min'}}
        self._max_req   = {'date': {'query': DateTime('2032-05-08 15:16:17'),
            'range': 'max'}}
        self._range_req = {'date': {'query':(DateTime('2002-05-08 15:16:17'),
                                    DateTime('2062-05-08 15:16:17')),
                           'range': 'min:max'}}
        self._zero_req  = {'date': 0}
        self._none_req  = {'date': None}
        self._float_req = {'date': 1072742620.0}
        self._int_req   = {'date': 1072742900}

    def _populateIndex( self ):
        for k, v in self._values:
            self._index.index_object(k, v)

    def _checkApply(self, req, expectedValues):
        result, used = self._index._apply_index(req)
        if hasattr(result, 'keys'):
            result = result.keys()
        self.failUnlessEqual(used, ('date',))
        self.failUnlessEqual(len(result), len(expectedValues),
            '%s | %s' % (result, expectedValues))
        for k, v in expectedValues:
            self.failUnless(k in result)

    def _convert(self, dt):
        if type(dt) in (FloatType, IntType):
            yr, mo, dy, hr, mn = time.gmtime(dt)[:5]
        elif type(dt) is date:
            yr, mo, dy, hr, mn = dt.timetuple()[:5]
        elif type(dt) is datetime:
            if dt.tzinfo is None: # default behavior of index
                dt = dt.replace(tzinfo=Local)
            yr, mo, dy, hr, mn = dt.utctimetuple()[:5]
        else:
            yr, mo, dy, hr, mn = dt.toZone('UTC').parts()[:5]
        return (((yr * 12 + mo) * 31 + dy) * 24 + hr) * 60 + mn

    def test_z3interfaces(self):
        from Products.PluginIndexes.interfaces import IDateIndex
        from Products.PluginIndexes.interfaces import IPluggableIndex
        from Products.PluginIndexes.interfaces import ISortIndex
        from Products.PluginIndexes.interfaces import IUniqueValueIndex
        from zope.interface.verify import verifyClass

        verifyClass(IDateIndex, DateIndex)
        verifyClass(IPluggableIndex, DateIndex)
        verifyClass(ISortIndex, DateIndex)
        verifyClass(IUniqueValueIndex, DateIndex)

    def test_empty(self):
        empty = self._index

        self.failUnlessEqual(len(empty), 0)
        self.failUnlessEqual(len(empty.referencedObjects()), 0)

        self.failUnless(empty.getEntryForObject(1234) is None)
        marker = []
        self.failUnless(empty.getEntryForObject(1234, marker) is marker)
        empty.unindex_object(1234) # shouldn't throw

        self.failUnless(empty.hasUniqueValuesFor('date'))
        self.failIf(empty.hasUniqueValuesFor('foo'))
        self.failUnlessEqual(len(empty.uniqueValues('date')), 0)

        self.failUnless(empty._apply_index({'zed': 12345}) is None)

        self._checkApply(self._request, [])
        self._checkApply(self._min_req, [])
        self._checkApply(self._max_req, [])
        self._checkApply(self._range_req, [])

    def test_retrieval( self ):
        self._populateIndex()
        values = self._values
        index = self._index

        self.failUnlessEqual(len(index), len(values) - 2) # One dupe, one empty
        self.failUnlessEqual(len(index.referencedObjects()), len(values) - 1)
            # One empty

        self.failUnless(index.getEntryForObject(1234) is None)
        marker = []
        self.failUnless(index.getEntryForObject(1234, marker) is marker)
        index.unindex_object(1234) # shouldn't throw

        for k, v in values:
            if v.date():
                self.failUnlessEqual(self._index.getEntryForObject(k),
                    self._convert(v.date()))

        self.failUnlessEqual(len(index.uniqueValues('date')), len(values) - 2)
        self.failUnless(index._apply_index(self._noop_req) is None)

        self._checkApply(self._request, values[1:2])
        self._checkApply(self._min_req, values[3:6] + values[8:])
        self._checkApply(self._max_req, values[1:4] + values[6:8])
        self._checkApply(self._range_req, values[2:] )
        self._checkApply(self._float_req, [values[6]] )
        self._checkApply(self._int_req, [values[7]] )

    def test_naive_convert_to_utc(self):
        values = self._values
        index = self._index
        index.index_naive_time_as_local = False
        self._populateIndex()
        for k, v in values[9:]:
            # assert that the timezone is effectively UTC for item 9,
            # and still correct for item 10
            yr, mo, dy, hr, mn = v.date().utctimetuple()[:5]
            val = (((yr * 12 + mo) * 31 + dy) * 24 + hr) * 60 + mn
            self.failUnlessEqual(self._index.getEntryForObject(k), val)

    def test_removal(self):
        """ DateIndex would hand back spurious entries when used as a
            sort_index, because it previously was not removing entries
            from the _unindex when indexing an object with a value of
            None. The catalog consults a sort_index's
            documentToKeyMap() to build the brains.
        """
        values = self._values
        index = self._index
        self._populateIndex()
        self._checkApply(self._int_req, [values[7]])
        index.index_object(7, None)
        self.failIf(7 in index.documentToKeyMap().keys())
Example #13
0
 def setUp(self):
     from Products.PluginIndexes.DateIndex.DateIndex import DateIndex
     self._obj = DateIndex('foo_date')
     self._obj._setPropValue('precision', 0)
     self._XML = _DATE_XML
Example #14
0
    def setUp(self):
        from Products.PluginIndexes.DateIndex.DateIndex import DateIndex

        NodeAdapterTestCase.setUp(self)
        self._obj = DateIndex('foo_date')
        self._XML = _DATE_XML
Example #15
0
class DI_Tests(unittest.TestCase):
    def setUp(self):
        self._values = (
            (0, Dummy('a', None)),  # None
            (1, Dummy('b', DateTime(0))),  # 1055335680
            (2, Dummy('c', DateTime('2002-05-08 15:16:17'))),  # 1072667236
            (3, Dummy('d', DateTime('2032-05-08 15:16:17'))),  # 1088737636
            (4, Dummy('e', DateTime('2062-05-08 15:16:17'))),  # 1018883325
            (5, Dummy('e', DateTime('2062-05-08 15:16:17'))),  # 1018883325
            (6, Dummy('f', 1072742620.0)),  # 1073545923
            (7, Dummy('f', 1072742900)),  # 1073545928
            (8, Dummy('g', date(2034, 2, 5))),  # 1073599200
            (9, Dummy('h', datetime(2034, 2, 5, 15, 20, 5))),  # (varies)
            (10, Dummy('i', datetime(2034, 2, 5, 10, 17, 5,
                                     tzinfo=Eastern))),  # 1073600117
        )
        self._index = DateIndex('date')
        self._noop_req = {'bar': 123}
        self._request = {'date': DateTime(0)}
        self._min_req = {
            'date': {
                'query': DateTime('2032-05-08 15:16:17'),
                'range': 'min'
            }
        }
        self._max_req = {
            'date': {
                'query': DateTime('2032-05-08 15:16:17'),
                'range': 'max'
            }
        }
        self._range_req = {
            'date': {
                'query': (DateTime('2002-05-08 15:16:17'),
                          DateTime('2062-05-08 15:16:17')),
                'range':
                'min:max'
            }
        }
        self._zero_req = {'date': 0}
        self._none_req = {'date': None}
        self._float_req = {'date': 1072742620.0}
        self._int_req = {'date': 1072742900}

    def _populateIndex(self):
        for k, v in self._values:
            self._index.index_object(k, v)

    def _checkApply(self, req, expectedValues):
        result, used = self._index._apply_index(req)
        if hasattr(result, 'keys'):
            result = result.keys()
        self.failUnlessEqual(used, ('date', ))
        self.failUnlessEqual(len(result), len(expectedValues),
                             '%s | %s' % (result, expectedValues))
        for k, v in expectedValues:
            self.failUnless(k in result)

    def _convert(self, dt):
        if type(dt) in (FloatType, IntType):
            yr, mo, dy, hr, mn = time.gmtime(dt)[:5]
        elif type(dt) is date:
            yr, mo, dy, hr, mn = dt.timetuple()[:5]
        elif type(dt) is datetime:
            if dt.tzinfo is None:  # default behavior of index
                dt = dt.replace(tzinfo=Local)
            yr, mo, dy, hr, mn = dt.utctimetuple()[:5]
        else:
            yr, mo, dy, hr, mn = dt.toZone('UTC').parts()[:5]
        return (((yr * 12 + mo) * 31 + dy) * 24 + hr) * 60 + mn

    def test_z3interfaces(self):
        from Products.PluginIndexes.interfaces import IDateIndex
        from Products.PluginIndexes.interfaces import IPluggableIndex
        from Products.PluginIndexes.interfaces import ISortIndex
        from Products.PluginIndexes.interfaces import IUniqueValueIndex
        from zope.interface.verify import verifyClass

        verifyClass(IDateIndex, DateIndex)
        verifyClass(IPluggableIndex, DateIndex)
        verifyClass(ISortIndex, DateIndex)
        verifyClass(IUniqueValueIndex, DateIndex)

    def test_empty(self):
        empty = self._index

        self.failUnlessEqual(len(empty), 0)
        self.failUnlessEqual(len(empty.referencedObjects()), 0)

        self.failUnless(empty.getEntryForObject(1234) is None)
        marker = []
        self.failUnless(empty.getEntryForObject(1234, marker) is marker)
        empty.unindex_object(1234)  # shouldn't throw

        self.failUnless(empty.hasUniqueValuesFor('date'))
        self.failIf(empty.hasUniqueValuesFor('foo'))
        self.failUnlessEqual(len(empty.uniqueValues('date')), 0)

        self.failUnless(empty._apply_index({'zed': 12345}) is None)

        self._checkApply(self._request, [])
        self._checkApply(self._min_req, [])
        self._checkApply(self._max_req, [])
        self._checkApply(self._range_req, [])

    def test_retrieval(self):
        self._populateIndex()
        values = self._values
        index = self._index

        self.failUnlessEqual(len(index),
                             len(values) - 2)  # One dupe, one empty
        self.failUnlessEqual(len(index.referencedObjects()), len(values) - 1)
        # One empty

        self.failUnless(index.getEntryForObject(1234) is None)
        marker = []
        self.failUnless(index.getEntryForObject(1234, marker) is marker)
        index.unindex_object(1234)  # shouldn't throw

        for k, v in values:
            if v.date():
                self.failUnlessEqual(self._index.getEntryForObject(k),
                                     self._convert(v.date()))

        self.failUnlessEqual(len(index.uniqueValues('date')), len(values) - 2)
        self.failUnless(index._apply_index(self._noop_req) is None)

        self._checkApply(self._request, values[1:2])
        self._checkApply(self._min_req, values[3:6] + values[8:])
        self._checkApply(self._max_req, values[1:4] + values[6:8])
        self._checkApply(self._range_req, values[2:])
        self._checkApply(self._float_req, [values[6]])
        self._checkApply(self._int_req, [values[7]])

    def test_naive_convert_to_utc(self):
        values = self._values
        index = self._index
        index.index_naive_time_as_local = False
        self._populateIndex()
        for k, v in values[9:]:
            # assert that the timezone is effectively UTC for item 9,
            # and still correct for item 10
            yr, mo, dy, hr, mn = v.date().utctimetuple()[:5]
            val = (((yr * 12 + mo) * 31 + dy) * 24 + hr) * 60 + mn
            self.failUnlessEqual(self._index.getEntryForObject(k), val)

    def test_removal(self):
        """ DateIndex would hand back spurious entries when used as a
            sort_index, because it previously was not removing entries
            from the _unindex when indexing an object with a value of
            None. The catalog consults a sort_index's
            documentToKeyMap() to build the brains.
        """
        values = self._values
        index = self._index
        self._populateIndex()
        self._checkApply(self._int_req, [values[7]])
        index.index_object(7, None)
        self.failIf(7 in index.documentToKeyMap().keys())