Created Sunburnt query chains for querying Solr; this is the equivalent of the 
DefaultQueryParser class that creates queries for Whoosh. Also implemented the 
IAdminCommandProvider interface for providing two trac-admin commands to 
pre-poluate BH with existing resources, and for optimising the index. However, 
the two trac-admin commands doesn’t seem to work for the moment (when trying to 
run them, I get a “command not found” error), but I’m currently trying to find 
out why this happens.

On 20 June 2014 at 01:40:08, [email protected] ([email protected]) wrote:

Author: ahorincar  
Date: Fri Jun 20 00:39:42 2014  
New Revision: 1604058  

URL: http://svn.apache.org/r1604058  
Log:  
Added methods to create Sunburnt query chains  

Added:  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py  
Removed:  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/htdocs/  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/templates/  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/web_ui.py  
Modified:  
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py  
bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py  

Added: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py  
URL: 
http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py?rev=1604058&view=auto
  
==============================================================================  
--- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py (added)  
+++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/admin.py Fri Jun 
20 00:39:42 2014  
@@ -0,0 +1,16 @@  
+r"""Administration commands for Bloodhound Solr Search."""  
+from trac.core import Component, implements  
+from trac.admin import IAdminCommandProvider  
+from bhsolr.api import BloodhoundSolrApi  
+  
+class BloodhoundSolrSearchAdmin(Component):  
+ """Bloodhound Solr Search administration component."""  
+ implements(IAdminCommandProvider)  
+  
+ # IAdminCommandProvider methods  
+ def get_admin_commands(self):  
+ yield ('bhsolr populate_index', '', 'Populate Solr search index',  
+ None, BloodhoundSolrApi(self.env).populate_index)  
+ yield ('bhsolr optimize', '', 'Optimize Solr search index',  
+ None, BloodhoundSearchApi(self.env).optimize)  
+  

Added: bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py  
URL: 
http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py?rev=1604058&view=auto
  
==============================================================================  
--- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py (added)  
+++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/api.py Fri Jun 20 
00:39:42 2014  
@@ -0,0 +1,7 @@  
+from bhsolr.search_resources import TicketSearchModel  
+from trac.core import Component, implements  
+  
+class BloodhoundSolrApi(Component):  
+ def populate_index(self):  
+ tickets = TicketSearchModel(self.env).get_entries_for_index()  
+ print tickets  

Modified: 
bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py  
URL: 
http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py?rev=1604058&r1=1604057&r2=1604058&view=diff
  
==============================================================================  
--- bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py 
(original)  
+++ bloodhound/branches/bep_0014_solr/bloodhound_solr/bhsolr/solr_backend.py 
Fri Jun 20 00:39:42 2014  
@@ -7,17 +7,19 @@ from trac.ticket.api import TicketSystem  
from bhsearch.search_resources.ticket_search import TicketIndexer  
from datetime import datetime  
from trac.util.datefmt import utc  
+from bhsearch.api import ISearchBackend  
+from bhsearch.query_parser import DefaultQueryParser  

UNIQUE_ID = "unique_id"  

-class SolrModel(Component):  
+class SolrBackend(Component):  
implements(ISearchBackend)  

def __init__(self):  
resource_filename = pkg_resources.resource_filename  
path = resource_filename(__name__, "schemadoc")  
- # self.solr_interface = Solr("http://localhost:8983/solr/";, path + 
'/schema.xml').solr_interface  
- self.solr_interface = Solr("http://localhost:8983/solr/";).solr_interface  
+ self.solr_interface = Solr("http://localhost:8983/solr/";).solr_interface # 
TODO: Refactor  
+ self.field_boosts = DefaultQueryParser(self.env).field_boosts  


def add_doc(self, doc, operation_context=None):  
@@ -34,13 +36,44 @@ class SolrModel(Component):  
self.solr_interface.delete(unique_id)  


- def optimize():  
+ def optimize(self):  
self.solr_interface.optimize()  

+ def query(self, query, query_string, sort = None, fields = None, filter = 
None,  
+ facets = None, pagenum = 1, pagelen = 20, highlight = False,  
+ highlight_fields = None, context = None):  
+  
+ tokens = set([token.text for token in query.all_tokens()])  
+ final_query_chain = None  
+ for token in tokens:  
+ token_query_chain = self._search_fields_for_token(token)  
+ if final_query_chain == None:  
+ final_query_chain = token_query_chain  
+ else:  
+ final_query_chain |= token_query_chain  
+  
+ print final_query_chain  
+ return None  

- def query(self, query):  
- self.solr_instance.solr_interface.query(query).execute()  
+ def is_index_outdated(self):  
+ return False  

+ def recreate_index(self):  
+ return True  
+  
+ def start_operation(self):  
+ return None  
+  
+ def _search_fields_for_token(self, token):  
+ query_chain = None  
+ for field, boost in self.field_boosts.iteritems():  
+ field_token_dict = {field: token}  
+ if query_chain == None:  
+ query_chain = self.solr_interface.Q(**field_token_dict)**boost  
+ else:  
+ query_chain |= self.solr_interface.Q(**field_token_dict)**boost  
+  
+ return query_chain  

def _reformat_doc(self, doc):  
for key, value in doc.items():  
@@ -75,12 +108,7 @@ class SolrModel(Component):  
else:  
return u"%s:%s" % (doc_type, doc_id)  

-if __name__ == '__main__':  
- env = 
trac.env.Environment("/Users/antonia/Documents/Code/bloodhound/installer/bloodhound/environments/main")
  
- db_connection = env.get_db_cnx()  
- cursor = db_connection.cursor()  
- a = cursor.execute("select * from ticket")  
- ticket = a.fetchall()[0]  
+ def getInstance(self):  
+ return self.solr_interface  
+  

- # for result in si.query(name="Ticket").execute():  
- # print result  

Modified: bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py  
URL: 
http://svn.apache.org/viewvc/bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py?rev=1604058&r1=1604057&r2=1604058&view=diff
  
==============================================================================  
--- bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py (original)  
+++ bloodhound/branches/bep_0014_solr/bloodhound_solr/setup.py Fri Jun 20 
00:39:42 2014  
@@ -1,6 +1,6 @@  
from setuptools import setup, find_packages  

-PKG_INFO = {'bhsolr': ['htdocs/*.*', 'templates/*', 'schemadoc/*.xml'],  
+PKG_INFO = {'bhsolr': ['schemadoc/*.xml'],  
'bhsolr.search_resources' : [],  
}  

@@ -8,9 +8,9 @@ PKG_INFO = {'bhsolr': ['htdocs/*.*', 'te  

ENTRY_POINTS = {  
'trac.plugins': [  
- 'bhsolr.web_ui = bhsolr.web_ui',  
'bhsolr.api = bhsolr.api',  
'bhsolr.solr = bhsolr.solr',  
+ 'bhsolr.admin = bhsolr.admin',  
'bhsolr.solr_backend = bhsolr.solr_backend',  
'bhsolr.search_resources.ticket_search = 
bhsolr.search_resources.ticket_search',  
'bhsolr.search_resources.milestone_search = 
bhsolr.search_resources.milestone_search',  


Reply via email to