#!/usr/bin/env python


import sys, os, lucene

from java.io import File
from org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.index import DirectoryReader
from org.apache.lucene.queryparser.classic import QueryParser
from org.apache.lucene.store import SimpleFSDirectory
from org.apache.lucene.search import IndexSearcher
from org.apache.lucene.util import Version

"""
This script is loosely based on the Lucene (java implementation) demo class 
org.apache.lucene.demo.SearchFiles.  It will prompt for a search query, then it
will search the Lucene index in the current directory called 'index' for the
search query entered against the 'contents' field.  It will then display the
'path' and 'name' fields for each of the hits it finds in the index.  Note that
search.close() is currently commented out because it causes a stack overflow in
some cases.
"""

INDEX_DIR = "data/product-index"
lucene.initVM(vmargs=['-Djava.awt.headless=true'])
print 'lucene', lucene.VERSION
base_dir = os.path.abspath(".")
print os.path.join(base_dir,INDEX_DIR)
directory = SimpleFSDirectory(File(os.path.join(base_dir, INDEX_DIR)))
searcher = IndexSearcher(DirectoryReader.open(directory))
analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)

def run(searcher, analyzer):
	while True:
		print
		print "Hit enter with no input to quit."
		command = raw_input("Query:")
		if command == '':
			return

		print "directory: ", directory, INDEX_DIR
		print "searcher: ", searcher
		print "analyzer: ", analyzer
		print "Searching for: ", command
		query = QueryParser(Version.LUCENE_CURRENT, "contents", analyzer).parse(command)
		print query
		scoreDocs = searcher.search(query, 50).scoreDocs
		print "%s total matching documents." % len(scoreDocs)

		for scoreDoc in scoreDocs:
			doc = searcher.doc(scoreDoc.doc)
			print 'path:', doc.get("path"), 'name:', doc.get("name")

# def setupSearch(pathToIndex):
# run(searcher, analyzer)
# del searcher

def queryIndex(command, topK):	
	query = QueryParser(Version.LUCENE_CURRENT, "contents", analyzer).parse(command)
	scoreDocs = searcher.search(query, topK).scoreDocs
	print "%s total matching documents." % len(scoreDocs)
	ret = []
	for scoreDoc in scoreDocs:
		doc = searcher.doc(scoreDoc.doc)
		print 'path:', doc.get("path"), 'name:', doc.get("name")
		ret.append(doc.get("name"))
	return ret	

if __name__ == '__main__':
	if len(sys.argv) < 1:
		print "usage: SearchFiles \nNote that you need to set the INDEX_DIR to your correct index directory."
		sys.exit(1)
	#INDEX_DIR = sys.argv[1]
	#lucene.initVM(vmargs=['-Djava.awt.headless=true'])
	#print 'lucene', lucene.VERSION
	#base_dir = os.path.dirname(os.path.abspath("."))
	#base_dir = os.path.abspath(".")
	#print base_dir
	#directory = SimpleFSDirectory(File(os.path.join(base_dir, INDEX_DIR)))
	#directory = SimpleFSDirectory(File(INDEX_DIR))
	#searcher = IndexSearcher(DirectoryReader.open(directory))
	#analyzer = StandardAnalyzer(Version.LUCENE_CURRENT)
	run(searcher, analyzer)
	del searcher
