Thanks Andi! I'll give it a try tomorrow. I'll also ask Julian to provide some 
test and sample code for you.

Thank you very much for the great work and effort you're putting into jcc, 
Andi. As far as I can tell, the linking between classes from PyLucene and 
bobo-browse works flawlessly now - cool :)

I have attached the latest version of the Makefile that Christian has modified 
from PyLucene as well as a simple sample test-case based on 
http://snaprojects.jira.com/wiki/display/BOBO/Getting+Started#GettingStarted-Example%3A

Julian
# Makefile for building bobo-browser bindings for Python
#
# Based on PyLucene's Makefile

VERSION=2.5.0-rc1
BOBO_SVN_VER=HEAD
BOBO_VER=2.5.0-rc1
BOBO_SVN=http://bobo-browse.googlecode.com/svn/trunk
PYBOBO:=$(shell pwd)
BOBO_BROWSE=bobo-browse-$(BOBO_VER)
BOBO_BROWSE_JAR=$(BOBO_BROWSE)/dist/bobo-browse-$(BOBO_VER).jar

ANT_OPTS=
#ANT_OPTS=-Dhttp.proxyHost=192.168.1.1 -Dhttp.proxyPort=3128
ANT=ANT_OPTS="${ANT_OPTS}" ant
PYTHON=python2.6
JCC=$(PYTHON) -m jcc.__main__ --shared
NUM_FILES=2

ifeq ($(DEBUG),1)
DEBUG_OPT=--debug
endif


.PHONY: generate compile install default all clean realclean \
        sources test testfast jars distrib

default: all

$(BOBO_BROWSE):
        svn co -r $(BOBO_SVN_VER) $(BOBO_SVN) $(BOBO_BROWSE)

sources: $(BOBO_BROWSE)

#to-orig: sources
#       mkdir -p $(LUCENE)-orig
#       tar -C $(LUCENE) -cf - . | tar -C $(LUCENE)-orig -xvf -

#from-orig: $(LUCENE)-orig
#       mkdir -p $(LUCENE)
#       tar -C $(LUCENE)-orig -cf - . | tar -C $(LUCENE) -xvf -

bobobrowse:
        rm -f $(BOBO_BROWSE_JAR)
        $(MAKE) $(BOBO_BROWSE_JAR)

$(BOBO_BROWSE_JAR): $(BOBO_BROWSE)
        cd $(BOBO_BROWSE); $(ANT) -Dversion=$(BOBO_VER) jars

JARS=$(BOBO_BROWSE_JAR)

INCLUDES= \
    $(BOBO_BROWSE)/lib/master/servlet-api.jar \
    $(BOBO_BROWSE)/lib/master/spring-webmvc.jar \
    $(BOBO_BROWSE)/lib/master/spring.jar \
    $(BOBO_BROWSE)/lib/master/log4j.jar \
    $(BOBO_BROWSE)/lib/master/protobuf-java-2.2.0.jar \
    $(BOBO_BROWSE)/lib/master/xstream.jar \
    $(BOBO_BROWSE)/lib/master/fastutil.jar \
    $(BOBO_BROWSE)/lib/master/kamikaze-2.0.0.jar

CLASSPATHS= \
    $(BOBO_BROWSE)/lib/master/ant.jar \
    $(BOBO_BROWSE)/lib/master/xercesImpl.jar \
    $(BOBO_BROWSE)/lib/master/commons-collections.jar \
    $(BOBO_BROWSE)/lib/master/commons-cli.jar \
    $(BOBO_BROWSE)/lib/master/commons-configuration.jar \
    $(BOBO_BROWSE)/lib/master/commons-logging.jar \
    $(BOBO_BROWSE)/lib/master/commons-lang.jar \
    $(BOBO_BROWSE)/lib/master/commons-digester.jar \
    $(BOBO_BROWSE)/lib/master/commons-httpclient.jar \
    $(BOBO_BROWSE)/lib/master/zoie-2.0.0-rc1.jar \
    $(BOBO_BROWSE)/lib/master/json.jar \
    $(BOBO_BROWSE)/lib/master/dwr.jar \
    $(BOBO_BROWSE)/lib/master/xmlParserAPIs.jar 


jars: $(JARS)

GENERATE=$(JCC) $(foreach jar,$(JARS),--jar $(jar)) \
           $(foreach jar,$(INCLUDES),--include $(jar)) \
           $(foreach jar,$(CLASSPATHS),--classpath $(jar)) \
           --import lucene \
           --package java.lang java.lang.System \
                               java.lang.Runtime \
           --package java.util \
                     java.util.Arrays \
                     java.text.SimpleDateFormat \
           --package java.io java.io.StringReader \
                             java.io.InputStreamReader \
                             java.io.FileInputStream \
           --python bobobrowse \
           --version $(BOBO_VER) \
           --files $(NUM_FILES)

generate: jars
        $(GENERATE)

compile: jars
        $(GENERATE) --build $(DEBUG_OPT)

install: jars
        $(GENERATE) --install $(DEBUG_OPT) $(INSTALL_OPT)

bdist: jars
        $(GENERATE) --bdist

all: sources jars compile
        @echo build of bobo-browse complete

clean:
        if test -f $(BOBO_BROWSE)/build.xml; then cd $(BOBO_BROWSE); $(ANT) 
clean; fi
        rm -rf build

realclean: 
        rm -rf $(BOBO_BROWSE)
        rm -rf build dist


BUILD_TEST:=$(PYBOBO)/build/test

ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN)
BUILD_TEST:=`cygpath -aw $(BUILD_TEST)`
endif

install-test:
        mkdir -p $(BUILD_TEST)
        PYTHONPATH=$(BUILD_TEST) $(GENERATE) --install $(DEBUG_OPT) 
--install-dir $(BUILD_TEST)
        
test-clean:
        rm -rf $(BUILD_TEST)

testfast:
        PYTHONPATH=$(BUILD_TEST) $(PYTHON) test_bobobrowse.py 
$(CURDIR)/$(BOBO_BROWSE)

test: install-test testfast


ARCHIVE=bobo_browse-$(VERSION)-src.tar.gz

#distrib:
#       mkdir -p distrib
#       svn export . distrib/pylucene-$(VERSION)
#       tar -cf - --exclude build $(LUCENE) | tar -C 
distrib/pylucene-$(VERSION) -xvf -
#       mkdir distrib/pylucene-$(VERSION)/doc
#       tar -C $(SITE) -cf - . | tar -C distrib/pylucene-$(VERSION)/doc -xvf -
#       cd distrib; tar -cvzf $(ARCHIVE) pylucene-$(VERSION)
#       cd distrib; gpg2 --armor --output $(ARCHIVE).asc --detach-sig $(ARCHIVE)
#       cd distrib; openssl md5 < $(ARCHIVE) > $(ARCHIVE).md5
#
#stage:
#       cd distrib; scp -p $(ARCHIVE) $(ARCHIVE).asc $(ARCHIVE).md5 \
#                           people.apache.org:public_html/staging_area
#
#release:
#       cd distrib; scp -p $(ARCHIVE) $(ARCHIVE).asc $(ARCHIVE).md5 \
                           
people.apache.org:/www/www.apache.org/dist/lucene/pylucene

print-%:
        @echo $* = $($*)
#!/usr/bin/env python2.6

import os
import sys
import unittest
import lucene
import bobobrowse as bobo

HERE = os.path.dirname(os.path.abspath(__file__))
if len(sys.argv) == 2:
    BOBO = sys.argv[1]
else:
    BOBO = os.path.join(HERE, "bobo-browse-2.5.0-rc1")


class TestBoboBrowse(unittest.TestCase):
    cartag_index = os.path.join(BOBO, "cardata", "cartag")

    def openStore(self):
        return lucene.FSDirectory.getDirectory(self.cartag_index, False)

    def closeStore(self, store, *args):
        for arg in args:
            if arg is not None:
                arg.close()
        store.close()

    def test_000bobobrowse(self):
        self.assertEqual(repr(bobo.BoboService.class_),
                         "<Class: class com.browseengine.bobo.service.BoboService>")
        self.assertEqual(repr(bobo.FacetSpec.FacetSortSpec.OrderHitsDesc.class_),
                         "<Class: class com.browseengine.bobo.api.FacetSpec$FacetSortSpec>")

        handler_field1 = bobo.MultiValueFacetHandler("field1")
        handler_field2 = bobo.MultiValueFacetHandler("field2")
        facet_handlers = lucene.JArray('object')(2, bobo.FacetHandler)
        facet_handlers[0] = handler_field1
        facet_handlers[1] = handler_field2

        store = self.openStore()
        reader = None
        try:
            reader = lucene.IndexReader.open(store, True)
            facet_handlers = bobo.Arrays.asList(facet_handlers)
            lucene_index_reader = bobo.BoboIndexReader.getInstance(reader, facet_handlers)
            bobo_index_reader = bobo.BoboIndexReader.getInstance(lucene_index_reader, facet_handlers)
            bobo_browser = bobo.BoboBrowser(bobo_index_reader)
        finally:
            self.closeStore(store, reader)


    def test_runBobobrowseExample(self):
        #This is the Example on http://snaprojects.jira.com/wiki/display/BOBO/Getting+Started translated into Python.
        
        # define facet handlers
        
        # color facet handler
        color_handler = bobo.SimpleFacetHandler("color")
        
        # category facet handler
        category_handler = bobo.SimpleFacetHandler("category")
        
        facet_handler_array = lucene.JArray('object')(2, bobo.FacetHandler)
        facet_handler_array[0] = color_handler
        facet_handler_array[1] = category_handler
        handler_list = lucene.Arrays.asList(facet_handler_array)
                
        # opening a lucene index
        idx = lucene.FSDirectory.open(lucene.File(self.cartag_index))
        reader = lucene.IndexReader.open(idx, True)
        
        # decorate it with a bobo index reader
        boboReader = bobo.BoboIndexReader.getInstance(reader, handler_list)
         
        # creating a browse request
        br = bobo.BrowseRequest()
        br.setCount(10)
        br.setOffset(0)
         
        # add a selection
        sel = bobo.BrowseSelection("color")
        sel.addValue("red")
        br.addSelection(sel)
         
        # parse a query
        lucene_version = lucene.Version.LUCENE_29
        parser = lucene.QueryParser(lucene_version, "contents", lucene.StandardAnalyzer(lucene_version))
        q = parser.parse("cool car")
        br.setQuery(q)
        
        # add the facet output specs
        color_spec = bobo.FacetSpec()
        color_spec.setOrderBy(bobo.FacetSpec.FacetSortSpec.OrderHitsDesc)
         
        category_spec = bobo.FacetSpec()
        category_spec.setMinHitCount(2)
        category_spec.setOrderBy(bobo.FacetSpec.FacetSortSpec.OrderHitsDesc)
         
        br.setFacetSpec("color", color_spec)
        br.setFacetSpec("category", category_spec)
         
        # perform browse
        browser = bobo.BoboBrowser(boboReader)
        result = browser.browse(br) #type: BrowseResult
         
        total_hits = result.getNumHits()
        self.assertEqual(total_hits, 1316)
        
        hits = tuple(result.getHits()) #type: BrowseHit[]
        self.assertEqual(hits[0].getField('color'), "red")

        facet_map = result.getFacetMap() #type: Map<String,FacetAccessible>
        
        color_facets = facet_map.get("color") #type: FacetAccessible
        color_facet_vals = tuple(color_facets.getFacets()) #type: List<BrowseFacet>
        self.assertEqual(len(color_facet_vals), 1)
        self.assertEqual(color_facet_vals[0].getValue(), "red") # see 'add a selection' - there should only be red here
        
        category_facets = facet_map.get("category") #type: FacetAccessible
        category_facet_vals = tuple(category_facets.getFacets()) #type: List<BrowseFacet>
        self.assertEqual(category_facet_vals[0].getValue(), u'sports car')
        self.assertEqual(category_facet_vals[0].getHitCount(), 509)
        
        found_categories = set([e.getValue() for e in category_facet_vals]) 
        expected_categories = set((u'sports car', u'compact', u'exotic', u'suv', u'sedan', u'mini-van', u'truck', u'sub-compact', u'station wagon', u'van'))
        self.assertEqual(len(expected_categories.difference(found_categories)), 0) #we want at least the expected_categories
        
        idx.close()

def initialize():
    lucene.initVM()
    bobo.initVM()

def test_main():
    initialize()
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestBoboBrowse))
    return suite

if __name__ == "__main__": # pragma: no cover
    unittest.TextTestRunner(verbosity=2).run(test_main())

Reply via email to