[Zope-Checkins] CVS: Zope/lib/python/Products/PluginIndexes/TextIndexNG/queryparser - Collector.py:1.1.2.1
Andreas Jung
andreas@digicool.com
Wed, 16 Jan 2002 10:18:51 -0500
Update of /cvs-repository/Zope/lib/python/Products/PluginIndexes/TextIndexNG/queryparser
In directory cvs.zope.org:/tmp/cvs-serv28714
Added Files:
Tag: ajung-textindexng-branch
Collector.py
Log Message:
stack-like class to transform query to a suitable Python expression
=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/queryparser/Collector.py ===
##############################################################################
#
# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
#
##############################################################################
from Stack import Stack
from types import StringType
class Operator:
def __init__(self, op):
self.op = op
def __str__(self): return "Op('%s')" % self.op
def __repr__(self): return self.op
class Word:
def __init__(self, word):
self.word = word
def __str__(self): return "LL('%s')" % self.word
__repr__ = __str__
class Parens:
def __init__(self, p):
self.p = p
def __cmp__(self,p): return cmp(self.p, p.p)
def __str__(self): return "'%s'" % self.p
__repr__ = __str__
OpenParens = Parens('(')
CloseParens = Parens(')')
OperatorDict = {
'or' : 'txU',
'and' : 'txI',
'near' : 'txN'
}
class Collector(Stack):
result = ''
def __init__(self, default_op='and'):
Stack.__init__(self)
self.default_op = default_op
def addWord(self,word): self.push( Word(word) )
def addOp(self, op): self.push( Operator(op) )
def addOpenParens(self, p): self.push( Parens(p) )
def addCloseParens(self, p): self.grabStack()
def grabStack(self):
running = 1
items = []
op = None
while running:
item = self.pop()
if isinstance(item, StringType):
items.insert(0, item )
elif isinstance(item,Word):
items.insert(0, str(item) )
elif isinstance(item, Operator):
op = OperatorDict[ repr(item) ]
if isinstance(item,Parens):
if item==OpenParens:
running = 0
if len(self.lst)==0:
running = 0
if op is None: op = OperatorDict[self.default_op]
r = '%s(%s)' % (op, ','.join(items))
self.push(r)
def getResult(self):
assert len(self.lst)==1
self.grabStack()
res = self.pop()
return res