# ====================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ====================================================================
from random import seed,randint
from unittest import TestCase
from lucene import *
class BaseTestRangeFilter(TestCase):
def __init__(self, *args):
super(BaseTestRangeFilter, self).__init__(*args)
#
# Collation interacts badly with hyphens -- collation produces
# different ordering than Unicode code-point ordering -- so two
# indexes are created: one which can't have negative random
# integers, for testing collated ranges, and the other which can
# have negative random integers, for all other tests.
#
self.MAX_INT = 0x7fffffff
class TestIndex(object):
def __init__(_self, minR, maxR, allowNegativeRandomInts):
_self.minR = minR
_self.maxR = maxR
_self.allowNegativeRandomInts = allowNegativeRandomInts
_self.index = RAMDirectory()
self.signedIndex = TestIndex(self.MAX_INT, ~self.MAX_INT, True)
self.unsignedIndex = TestIndex(self.MAX_INT, 0, False)
self.minId = 0
self.maxId = 10000
self.build(self.signedIndex)
self.build(self.unsignedIndex)
#
# a simple padding function that should work with any int
#
def pad(self, n):
if n < 0:
return "-%0.10d" % (self.MAX_INT + n + 1)
else:
return "0%0.10d" % n
def build(self, index):
writer = IndexWriter(index.index, SimpleAnalyzer(), True,
IndexWriter.MaxFieldLength.LIMITED)
seed(101)
for d in xrange(self.minId, self.maxId + 1):
doc = Document()
doc.add(Field("id", self.pad(d), Field.Store.YES,
Field.Index.NOT_ANALYZED));
if index.allowNegativeRandomInts:
r = randint(~self.MAX_INT, self.MAX_INT)
else:
r = randint(0, self.MAX_INT)
if index.maxR < r:
index.maxR = r
if r < index.minR:
index.minR = r
doc.add(Field("rand", self.pad(r), Field.Store.YES,
Field.Index.NOT_ANALYZED))
doc.add(Field("body", "body", Field.Store.YES,
Field.Index.NOT_ANALYZED));
writer.addDocument(doc)
writer.optimize()
writer.close()
def testPad(self):
tests = [-9999999, -99560, -100, -3, -1, 0, 3, 9, 10, 1000, 999999999]
for i in xrange(0, len(tests) - 1):
a = tests[i]
b = tests[i + 1]
aa = self.pad(a)
bb = self.pad(b)
label = "%s:%s vs %s:%s" %(a, aa, b, bb)
self.assertEqual(len(aa), len(bb), "length of %s" %label)
self.assert_(aa < bb, "compare less than %s" %label)
|