Skip to content

Commit

Permalink
PyLucene 8 required.
Browse files Browse the repository at this point in the history
  • Loading branch information
coady committed Sep 12, 2019
1 parent da01328 commit 7814603
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 20 deletions.
2 changes: 1 addition & 1 deletion lupyne/engine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
from .indexers import IndexSearcher, MultiSearcher, IndexWriter, Indexer # noqa

version = tuple(map(int, lucene.VERSION.split('.')))
assert version >= (7, 7), version
assert version >= (8,), version
28 changes: 9 additions & 19 deletions lupyne/engine/indexers.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@
from .documents import Field, Document, Hits, GroupingSearch
from .utils import long, suppress, Atomic, SpellChecker

LU7 = lucene.VERSION < '8'


class closing(set):
"""Manage lifespan of registered objects, similar to contextlib.closing."""
Expand Down Expand Up @@ -106,8 +104,7 @@ def __iter__(self):

@property
def bits(self):
cls = index.MultiFields if LU7 else index.MultiBits
return cls.getLiveDocs(self.indexReader)
return index.MultiBits.getLiveDocs(self.indexReader)

@property
def directory(self):
Expand Down Expand Up @@ -137,8 +134,7 @@ def segments(self):
@property
def fieldinfos(self):
"""mapping of field names to lucene FieldInfos"""
cls = index.MultiFields if LU7 else index.FieldInfos
fieldinfos = cls.getMergedFieldInfos(self.indexReader)
fieldinfos = index.FieldInfos.getMergedFieldInfos(self.indexReader)
return {fieldinfo.name: fieldinfo for fieldinfo in fieldinfos.iterator()}

def suggest(self, name, value, count=1, **attrs):
Expand Down Expand Up @@ -211,8 +207,7 @@ def terms(self, name, value='', stop='', counts=False, distance=0, prefix=0):
:param distance: maximum edit distance for fuzzy terms
:param prefix: prefix length for fuzzy terms
"""
cls = index.MultiFields if LU7 else index.MultiTerms
terms = cls.getTerms(self.indexReader, name)
terms = index.MultiTerms.getTerms(self.indexReader, name)
if not terms:
return iter([])
term, termsenum = index.Term(name, value), terms.iterator()
Expand All @@ -229,15 +224,13 @@ def terms(self, name, value='', stop='', counts=False, distance=0, prefix=0):

def docs(self, name, value, counts=False):
"""Generate doc ids which contain given term, optionally with frequency counts."""
func = index.MultiFields.getTermDocsEnum if LU7 else index.MultiTerms.getTermPostingsEnum
docsenum = func(self.indexReader, name, util.BytesRef(value))
docsenum = index.MultiTerms.getTermPostingsEnum(self.indexReader, name, util.BytesRef(value))
docs = iter(docsenum.nextDoc, index.PostingsEnum.NO_MORE_DOCS) if docsenum else ()
return ((doc, docsenum.freq()) for doc in docs) if counts else iter(docs)

def positions(self, name, value, payloads=False, offsets=False):
"""Generate doc ids and positions which contain given term, optionally with offsets, or only ones with payloads."""
func = index.MultiFields.getTermPositionsEnum if LU7 else index.MultiTerms.getTermPostingsEnum
docsenum = func(self.indexReader, name, util.BytesRef(value))
docsenum = index.MultiTerms.getTermPostingsEnum(self.indexReader, name, util.BytesRef(value))
for doc in iter(docsenum.nextDoc, index.PostingsEnum.NO_MORE_DOCS) if docsenum else ():
positions = (docsenum.nextPosition() for _ in range(docsenum.freq()))
if payloads:
Expand Down Expand Up @@ -342,8 +335,7 @@ def spans(self, query, positions=False):
:param positions: optionally include slice positions instead of counts
"""
offset = 0
scores = False if LU7 else search.ScoreMode.COMPLETE_NO_SCORES
weight = query.createWeight(self, scores, 1.0)
weight = query.createWeight(self, search.ScoreMode.COMPLETE_NO_SCORES, 1.0)
postings = search.spans.SpanWeight.Postings.POSITIONS
for reader in self.readers:
try:
Expand Down Expand Up @@ -387,15 +379,13 @@ def collector(self, count=None, sort=None, reverse=False, scores=False, mincount
return search.CachingCollector.create(True, float('inf'))
count = min(count, self.maxDoc() or 1)
mincount = max(count, mincount)
args = [] if LU7 else [mincount]
if sort is None:
return search.TopScoreDocCollector.create(count, *args)
return search.TopScoreDocCollector.create(count, mincount)
if isinstance(sort, string_types):
sort = self.sortfield(sort, reverse=reverse)
if not isinstance(sort, search.Sort):
sort = search.Sort(sort)
args = [True, scores, False] if LU7 else [mincount]
return search.TopFieldCollector.create(sort, count, *args)
return search.TopFieldCollector.create(sort, count, mincount)

def search(self, query=None, count=None, sort=None, reverse=False, scores=False, mincount=1000, timeout=None, **parser):
"""Run query and return `Hits`_.
Expand Down Expand Up @@ -426,7 +416,7 @@ def search(self, query=None, count=None, sort=None, reverse=False, scores=False,
collector = self.collector(count, sort, reverse, scores, count)
cache.replay(collector)
topdocs = collector.topDocs()
if not LU7 and scores: # pragma: no cover
if scores:
search.TopFieldCollector.populateScores(topdocs.scoreDocs, self, query)
return Hits(self, topdocs.scoreDocs, topdocs.totalHits)

Expand Down

0 comments on commit 7814603

Please sign in to comment.