changeset 4:10733d367831

date ranges links auf fulltext
author dwinter
date Fri, 26 Apr 2013 17:52:24 +0200
parents 156c1db5a701
children f695be8f4f34
files zopeSolr.py zpt/AddZopeSolr.zpt zpt/ChangeZopeSolr.zpt
diffstat 3 files changed, 147 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/zopeSolr.py	Wed Mar 13 08:39:41 2013 +0100
+++ b/zopeSolr.py	Fri Apr 26 17:52:24 2013 +0200
@@ -9,6 +9,7 @@
 import sunburnt
 from Globals import package_home
 import httplib2
+import urlparse
 import urllib
 import re
 import xml.etree.ElementTree as ET
@@ -23,6 +24,10 @@
           }
 
 
+PURLSERVER="http://md.mpiwg-berlin.mpg.de/purls/"
+
+#TODO: only needed for getTermsAsJSON, solle irgendwie aus dem sunburnt kommen
+SOLRSERVER="/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"
 
 def zptFile(self, path, orphaned=False):
     """returns a page template file from the product"""
@@ -53,12 +58,43 @@
     
     def connect(self):
         self._v_solr=sunburnt.SolrInterface(url=self.solrURL)
-      
+    
+    
+    #erzeuge den link auf die fulltext display version des bildviewers
+    def createFullTextLink(self,page,facetSerch,search):
+        
+        fqs=[]
+        for key in facetSerch.keys():
+            values = self.getList(facetSerch.get(key))
+            for value in values:
+                if value!="*":
+                    fqs.append("%s=%s"%(key,urllib.quote(value)));
+        
+        ret="pf=%s"%page 
+        ret+="&query=("
+        
+       
+        
+        ret+=" OR ".join(fqs)
+        #if len(fqs)>0 and len(qs)>0 and qs[0]!="":
+        if len(fqs)>0 and len(search)>0: #TODO das muss noch geandert werden, wenn das der normale suchstring nach feldern müssen alle "AND" in "OR" getauscht werden
+            #da ja in der volltext-line  die Zeile gedunfen werden soll wenn eines der Worte drin ist, vorher wurd eventuell und über die ganee seite gesucht
+            #die worte müssen aber nicht in einer zeile sein und werden jetzt nicht gefunden
+            ret+=" OR "
+        
+        
+        
+        ret+="("+search+")"
+        
+        ret+=")&viewLayer=search"
+        
+        return ret
+         
     #erzeuge einen Link, insbesonder für faceted suche
     #@param search: ist suchparameter, wird einfach als search=%s weitergereicht
     #@param facetSearch: bekommt einen hash (feldname, liste der suchworte) 
     
-    def generateLink(self,search,facetSearch={},ranges={},args={}):
+    def generateLink(self,search,facetSearch={},ranges={},dateranges={},args={}):
         ret="?search=%s"%search
        
         for facet in facetSearch.keys():
@@ -82,6 +118,14 @@
             for value in values:
                 ret+="&%s_rg=%s"%(key,value)    
 
+        for key,values in dateranges.items():
+            
+            if isinstance(values, basestring):
+                values=[values]
+            
+            for value in values:
+                ret+="&%s_drg=%s"%(key,value)    
+
             
         for key,value in args.items():
             
@@ -104,13 +148,21 @@
     #@param begin anfang der ranges
     #@param end ende der Raanges
     #@param increment größe eines ranges
+    #@param date wenn wahr, dann ist field ein Datumsfeld, begin, end,increment sind trotzdem zur Zeit, dan Integer für Jahre !!, d.h. zur Zeit sind nur JAhre als Schritte möglich
     # für alle andere paramter @see prepareSearch
     #@return gibt ein hash: mit range -> anzahl der Treffer in dem Ranage. e.g 1921-1950 -> 21
-    def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True):
+    
+    def ranges(self,field,begin,end,increment,solrQuery="",facetFields=[],start=0,rows=10,facetSearch=None,sortFacets=True,date=False,storeFields=False):
       
         q=self.prepareSearch(solrQuery,facetFields,start,rows,facetSearch,sortFacets)
    
-        res={}
+        res={} #speiceher abzahl
+        
+        fls={} #speichere felder
+        
+        #for fl in  storeFields: #initialisiere den hash
+        #    fls[fl]={}
+        
         if not getattr(self,'_v_solr_',None):
             self.connect()
         
@@ -120,15 +172,36 @@
             query={}
             #query["%s__gt"%field]=x
             #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
-            query["%s__gte"%field]=int(x)+1
-                       
-            query["%s__lte"%field]=x+increment
+            
+            if not date:
+                query["%s__gte"%field]=int(x)+1
+                           
+                query["%s__lte"%field]=x+increment
+                
+                key="%s-%s"%(x,x+increment)
             
-            result = q.query(**query).execute()
+            else:
+                year="%s-01-01T00:00:00Z"
+                query["%s__gte"%field]=year%(int(x))
+                           
+                query["%s__lte"%field]=year%(x+increment)
+                
+                key="%s@%s"%(year%(int(x)),year%(x+increment))
+                
+            result = q.query(**query).highlight("text_german").execute()
             
-            res["%s-%s"%(x,x+increment)]=result.result.numFound
+            res[key]=result.result.numFound
+            
+            if storeFields:
+                fls[key] = result.highlighting;
+            
             
-        return res
+            
+        if storeFields:
+            return res,fls
+        
+        else:
+            return res
             
         
     #prepareSearch erzeugt die Suchabfrage
@@ -205,7 +278,14 @@
                         #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
                         ranges[field.replace("_rg","__gte")]=int(splitted[0])+1
                         ranges[field.replace("_rg","__lte")]=splitted[1]
-                    
+                
+                elif field.endswith("_drg"):
+                        splitted = "@".split(field)
+                        if len(splitted)==2:
+                            #ranges[field.replace("_rg","__gt")]=splitted[0]
+                            #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
+                            ranges[field.replace("_drg","__gte")]=splitted[0]
+                            ranges[field.replace("_drg","__lte")]=splitted[1]
             
         
         #teste verbindung zu solr
@@ -226,15 +306,18 @@
         
     
         res=res.query(splitted)
+    
         if len(ranges.keys())>0:
+            
+        
             res=res.query(ranges)
          
-         
+    
         #ubergebe alle weiteren feld an die suche.
         if facetSearch:
             for key,vals in facetSearch.items():
               
-                if key.endswith("_rg"):
+                if key.endswith("_rg"): #range
                 
                     if not isinstance(vals,basestring):
                       
@@ -249,9 +332,29 @@
                         if len(splitted)==2:
                             #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
                             facetSearch[key.replace("_rg","__gte")]=int(splitted[0])+1
-                            facetSearch[key.replace("_rg","__lte")]=splitted[1]
+                            facetSearch[key.replace("_rg","__lte")]=int(splitted[1])
 
                     del facetSearch[key] # loesche das urspuerngliche feld
+                
+                elif key.endswith("_drg"): #daterange    
+                    
+                    if not isinstance(vals,basestring):
+                      
+                        vals=[x.decode('utf-8') for x in vals]
+                    else:
+                        vals=[vals.decode('utf-8')]
+                    
+                    for val in vals:
+                      
+                        splitted = val.split("@")
+
+                        if len(splitted)==2:
+                            #TODO __gt scheint nicht zu funktionieren wird zu gte (???)
+                            facetSearch[key.replace("_drg","__gte")]=splitted[0]
+                            facetSearch[key.replace("_drg","__lte")]=splitted[1]
+
+                    del facetSearch[key] # loesche das urspuerngliche feld
+                    
                     
                 else:
                     if not isinstance(vals, basestring):
@@ -260,7 +363,7 @@
                         val = [vals]
                     facetSearch[key]=val
             
-          
+            
             res=res.query(**facetSearch)
             
             
@@ -298,16 +401,35 @@
         res=res.paginate(start=start, rows=rows)
        
        
-
+        #only highlighting if not searhc for only "*" - avoid max clause error
         if solrQuery=="*":
 
+            
             res=res.paginate(start=start, rows=rows)
         else:
+            
             res=res.paginate(start=start, rows=rows).highlight(usePhraseHighlighter=True)
           
         return res
     
     
+    def replaceParameter(self,paramsNeu,queryString,ignore=[]):
+        params=urlparse.parse_qs(queryString);
+     
+        for key in paramsNeu.keys():
+           
+            params[key]=paramsNeu[key]
+        
+        for key in ignore:
+            del params[key]
+
+        retArray = []
+        for x in params.keys():
+            for y in self.getList(params[x]):
+                retArray.append("%s=%s"%(x,urllib.quote(y)))
+                                         
+        print retArray
+        return "&".join(retArray);
     #für die parameter @see prepareSearch
     #erzeugt eine Suchabfrage und führt diese aus.
     #return {"result":response.result, "hl":response.highlighting,"facetFields":facetedFields}   
@@ -403,7 +525,8 @@
         urlq=url.replace(":","\:")
         urlq=urlq.replace("/","\/")
         
-        q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field)
+        #q ="http://localhost:8983/solr/mpiwgweb/select?q=%s:%s&wt=xml&tv=on&qt=tvrh&fl=%s&tv.tf=true"%(idfield,urlq,field)
+        q =self.solrURL+SOLRSERVER%(idfield,urlq,field)
       
         resp, content = h.request(q)
        
@@ -462,15 +585,18 @@
     def filter (self,resultList,startLetter=None,startLetterNonAscii=0):
         ls=[]
         if startLetter:
+            startLetter=startLetter.lower()
             
             matchStr = "[\[\]'\"]*"+startLetter
-            ls = [x for x in resultList if re.match(matchStr,x[0])]
+            ls = [x for x in resultList if re.match(matchStr,x[0].lower())]
         
         if startLetterNonAscii ==1:
            
             ls = [x for x in resultList if not re.match("[\[\]'\"a-zA-Z].*",x[0])]
         return ls
         
+
+        
 def manage_addZopeSolrForm(self):
         """Form for external Links"""
         pt=zptFile(self, 'zpt/AddZopeSolr.zpt')
@@ -487,4 +613,4 @@
   
     if RESPONSE is not None:
         RESPONSE.redirect('manage_main')
-        
+        
\ No newline at end of file
--- a/zpt/AddZopeSolr.zpt	Wed Mar 13 08:39:41 2013 +0100
+++ b/zpt/AddZopeSolr.zpt	Fri Apr 26 17:52:24 2013 +0200
@@ -5,6 +5,7 @@
     	<tr><td> ID: </td><td><input type="text" name="id" size=50></td></tr>
       <tr><td> Title: </td><td><input type="text" name="title" size=50></td></tr>
       <tr><td> url: </td><td><input type="text" name="solrURL" size=50></td></tr>
+      <tr><td>&nbsp;</td><td>e.g. http://127.0.0.1:8983/solr/collection1, no SLASH "/" at the end</td></tr>
    
     
     </table>
--- a/zpt/ChangeZopeSolr.zpt	Wed Mar 13 08:39:41 2013 +0100
+++ b/zpt/ChangeZopeSolr.zpt	Fri Apr 26 17:52:24 2013 +0200
@@ -4,6 +4,7 @@
     <table> 
       <tr><td> Title: </td><td><input type="text" name="title" tal:attributes="value here/title" size=50></td></tr>
       <tr><td> url: </td><td><input type="text" name="solrURL" tal:attributes="value here/solrURL" size=50></td></tr>
+   	  <tr><td>&nbsp;</td><td>e.g. http://127.0.0.1:8983/solr/collection1, no SLASH "/" at the end</td></tr>
    
      
     </table>