Changeset 8218

Show
Ignore:
Timestamp:
02/11/10 10:55:08 (6 months ago)
Author:
dragisak
Message:

Search2:

  • Remove unused field
  • Reduce code duplication
  • Add fixme comment to use filters
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • head/ambra/webapp/src/main/java/org/topazproject/ambra/search2/service/SolrSearchService.java

    r8217 r8218  
    2929import org.slf4j.Logger; 
    3030import org.slf4j.LoggerFactory; 
    31 import org.springframework.beans.factory.annotation.Required; 
    3231import org.topazproject.ambra.ApplicationException; 
    33 import org.topazproject.ambra.journal.JournalService; 
    34 import org.topazproject.ambra.models.Journal; 
    3532import org.topazproject.ambra.search2.SearchHit; 
    3633import org.topazproject.ambra.search2.SearchParameters; 
     
    5249  private static final Logger log = LoggerFactory.getLogger(SolrSearchService.class); 
    5350 
    54   private JournalService journalService; // Injected by Spring. 
    5551  private SolrServerFactory serverFactory; 
    5652  private int queryTimeout; 
     
    142138    // Form field description: "for at least one of the words:" 
    143139    if (searchParameters.getTextSearchAtLeastOne().trim().length() > 0) { 
    144       q.append(" AND ").append(buildFieldAtLeastOneOfTheWords( 
    145           searchParameters.getTextSearchOption(), searchParameters.getTextSearchAtLeastOne().trim())); 
     140      q.append(" AND ").append( 
     141          addFields(" OR ", searchParameters.getTextSearchOption(), searchParameters.getTextSearchAtLeastOne().trim()) 
     142      ); 
    146143    } 
    147144 
    148145    // Form field description: "for all the words:" 
    149146    if (searchParameters.getTextSearchAll().trim().length() > 0) { 
    150       q.append(" AND ").append(buildFieldAllTheWords( 
    151           searchParameters.getTextSearchOption(), searchParameters.getTextSearchAll().trim())); 
     147      q.append(" AND ").append( 
     148          addFields(" AND ", searchParameters.getTextSearchOption(), searchParameters.getTextSearchAll().trim()) 
     149      ); 
    152150    } 
    153151 
     
    166164 
    167165    // Form field description: "Journals" 
    168     if ("some".equals(searchParameters.getJournalOpt())) { // Option "all" does not modify the query. 
    169       q.append(" AND ("); 
    170       for (String eissn : searchParameters.getLimitToJournal()) { 
    171         q.append(" eissn:").append(eissn).append(" OR"); 
    172       } 
    173       q.replace(q.length() - 3, q.length(), " ) "); // Remove last "AND". Add closing parenthesis. 
    174     } 
     166    // FIXME: For performance, this should be done with filters not by concatenating "AND" clause. 
     167    addFilter(q, searchParameters.getJournalOpt(), searchParameters.getLimitToJournal(), " eissn:"); 
    175168 
    176169    // Form field description: "Subject Categories" 
    177     if ("some".equals(searchParameters.getSubjectCatOpt())) { // Option "all" does not modify the query. 
    178       q.append(" AND ("); 
    179       for (String category : searchParameters.getLimitToCategory()) { 
    180         q.append(" subject:").append(category).append(" OR"); 
    181       } 
    182       q.replace(q.length() - 3, q.length(), " ) "); // Remove last "AND". Add closing parenthesis. 
    183     } 
     170    // FIXME: For performance, this should be done with filters not by concatenating "AND" clause. 
     171    addFilter(q, searchParameters.getSubjectCatOpt(), searchParameters.getLimitToCategory(), " subject:"); 
    184172 
    185173    if (q.indexOf(" AND ") == 0) 
     
    189177  } 
    190178 
    191   /** 
    192    * Form field description: "Where my words occur:" 
    193    *  
    194    * @param textSearchOption 
    195    * @param searchString 
    196    * @return 
    197    */ 
    198   private StringBuilder buildFieldAtLeastOneOfTheWords(String textSearchOption, String searchString) { 
    199     StringBuilder sb = new StringBuilder(" ( "); 
     179  private void addFilter(StringBuilder q, String option, String[] limits, String field) { 
     180    if ("some".equals(option) && limits.length > 0) { // Option "all" does not modify the query. 
     181      q.append(" AND ("); 
     182      for (String limit : limits) { 
     183        q.append(field).append(limit).append(" OR"); 
     184      } 
     185      q.replace(q.length() - 3, q.length(), " ) "); // Remove last "OR". Add closing parenthesis. 
     186    } 
     187  } 
     188 
     189  private StringBuilder addFields(String operation, String textSearchOption, String searchString) { 
     190    StringBuilder sb = new StringBuilder(); 
    200191    for(String token : searchString.split(" ")) { 
     192 
     193      if(sb.length() == 0) { 
     194        sb.append(" ( "); 
     195      } else { 
     196        sb.append(operation); 
     197      } 
     198 
    201199      if ("abstract".equals(textSearchOption)) { 
    202         sb.append("abstract:").append(token).append(" OR "); 
     200        sb.append("abstract:").append(token); 
    203201      } else if ("refs".equals(textSearchOption)) { 
    204         sb.append("citation:").append(token).append(" OR "); 
     202        sb.append("citation:").append(token); 
    205203      } else if ("title".equals(textSearchOption)) { 
    206         sb.append("title:").append(token).append(" OR "); 
     204        sb.append("title:").append(token); 
    207205      } else { 
    208         sb.append(token).append(" OR "); 
    209       } 
    210     } 
    211     return sb.replace(sb.length() - 3, sb.length(), ") "); 
    212   } 
    213  
    214   private StringBuilder buildFieldAllTheWords(String textSearchOption, String searchString) { 
    215     StringBuilder sb = new StringBuilder(" ( "); 
    216     for(String token : searchString.split(" ")) { 
    217       if ("abstract".equals(textSearchOption)) { 
    218         sb.append("abstract:").append(token).append(" AND "); 
    219       } else if ("refs".equals(textSearchOption)) { 
    220         sb.append("citation:").append(token).append(" AND "); 
    221       } else if ("title".equals(textSearchOption)) { 
    222         sb.append("title:").append(token).append(" AND "); 
    223       } else { 
    224         sb.append(token).append(" AND "); 
    225       } 
    226     } 
    227     return sb.replace(sb.length() - 4, sb.length(), ") "); 
    228   } 
    229  
    230   private StringBuilder buildFieldFromTokens(String tokenString, String booleanFunction) { 
    231     StringBuilder sb = new StringBuilder(); 
    232     for(String token : tokenString.split(" ")) { 
    233       sb.append(token).append(" ").append(booleanFunction).append(" "); 
    234     } 
    235     return sb.replace(sb.length() - booleanFunction.length() - 1, sb.length(), ""); 
     206        sb.append(token); 
     207      } 
     208    } 
     209 
     210    if (sb.length() > 0) { 
     211      sb.append(") "); 
     212    } 
     213 
     214    return sb; 
    236215  } 
    237216