[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