Author: gsingers
Date: Sat Nov 29 04:40:57 2008
New Revision: 721675

URL: http://svn.apache.org/viewvc?rev=721675&view=rev
Log:
SOLR-877: Added support for multiple fields, plus some more tests

Modified:
    
lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
    
lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java

Modified: 
lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java?rev=721675&r1=721674&r2=721675&view=diff
==============================================================================
--- 
lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
 (original)
+++ 
lucene/solr/trunk/src/java/org/apache/solr/handler/component/TermsComponent.java
 Sat Nov 29 04:40:57 2008
@@ -31,7 +31,7 @@
  * Return TermEnum information, useful for things like auto suggest.
  *
  * @see org.apache.solr.common.params.TermsParams
- * See Lucene's TermEnum class
+ *      See Lucene's TermEnum class
  */
 public class TermsComponent extends SearchComponent {
 
@@ -40,39 +40,46 @@
     SolrParams params = rb.req.getParams();
     if (params.getBool(TermsParams.TERMS, false)) {
       String lower = params.get(TermsParams.TERMS_LOWER, "");
-      String field = params.get(TermsParams.TERMS_FIELD);
-      if (field != null) {
-        Term lowerTerm = new Term(field, lower);
-        TermEnum termEnum = 
rb.req.getSearcher().getReader().terms(lowerTerm);//this will be positioned 
ready to go
-        int rows = params.getInt(TermsParams.TERMS_ROWS, 
params.getInt(CommonParams.ROWS, 10));
-        int i = 0;
+      String[] fields = params.getParams(TermsParams.TERMS_FIELD);
+      if (fields != null && fields.length > 0) {
         NamedList terms = new NamedList();
         rb.rsp.add("terms", terms);
-        String upper = params.get(TermsParams.TERMS_UPPER);
-        Term upperTerm = upper != null ? new Term(field, upper) : null;
-        boolean upperIncl = params.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, 
false);
-        boolean lowerIncl = params.getBool(TermsParams.TERMS_LOWER_INCLUSIVE, 
true);
-        boolean hasMore = true;
-        if (lowerIncl == false) {
-          hasMore = termEnum.next();
-        }
-        if (hasMore == true) {
-          do {
-            Term theTerm = termEnum.term();
-            String theText = theTerm.text();
-            int upperCmp = upperTerm != null ? theTerm.compareTo(upperTerm) : 
-1;
-            if (theTerm != null && theTerm.field().equals(field)
-                    && ((upperIncl == true && upperCmp <= 0) ||
-                    (upperIncl == false && upperCmp < 0))) {
-              terms.add(theText, termEnum.docFreq());
-            } else {//we're done
-              break;
+
+        for (int j = 0; j < fields.length; j++) {
+          String field = fields[j];
+          Term lowerTerm = new Term(field, lower);
+          TermEnum termEnum = 
rb.req.getSearcher().getReader().terms(lowerTerm);//this will be positioned 
ready to go
+          int rows = params.getInt(TermsParams.TERMS_ROWS, 
params.getInt(CommonParams.ROWS, 10));
+          int i = 0;
+          NamedList fieldTerms = new NamedList();
+          terms.add(field, fieldTerms);
+          String upper = params.get(TermsParams.TERMS_UPPER);
+          Term upperTerm = upper != null ? new Term(field, upper) : null;
+          boolean upperIncl = 
params.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, false);
+          boolean lowerIncl = 
params.getBool(TermsParams.TERMS_LOWER_INCLUSIVE, true);
+          boolean hasMore = true;
+          if (lowerIncl == false) {
+            hasMore = termEnum.next();
+          }
+          if (hasMore == true) {
+            do {
+              Term theTerm = termEnum.term();
+              String theText = theTerm.text();
+              int upperCmp = upperTerm != null ? theTerm.compareTo(upperTerm) 
: -1;
+              if (theTerm != null && theTerm.field().equals(field)
+                      && ((upperIncl == true && upperCmp <= 0) ||
+                      (upperIncl == false && upperCmp < 0))) {
+                fieldTerms.add(theText, termEnum.docFreq());
+              } else {//we're done
+                break;
+              }
+              i++;
             }
-            i++;
+            while (i < rows && termEnum.next());
           }
-          while (i < rows && termEnum.next());
+          termEnum.close();
         }
-        termEnum.close();
+
       } else {
         throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No 
terms.fl parameter specified");
       }

Modified: 
lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java
URL: 
http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java?rev=721675&r1=721674&r2=721675&view=diff
==============================================================================
--- 
lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java
 (original)
+++ 
lucene/solr/trunk/src/test/org/apache/solr/handler/component/TermsComponentTest.java
 Sat Nov 29 04:40:57 2008
@@ -46,16 +46,16 @@
   public void setUp() throws Exception {
     super.setUp();
 
-    assertU(adoc("id", "0", "lowerfilt", "a"));
-    assertU(adoc("id", "1", "lowerfilt", "a"));
-    assertU(adoc("id", "2", "lowerfilt", "aa"));
-    assertU(adoc("id", "3", "lowerfilt", "aaa"));
-    assertU(adoc("id", "4", "lowerfilt", "ab"));
-    assertU(adoc("id", "5", "lowerfilt", "abb"));
-    assertU(adoc("id", "6", "lowerfilt", "abc"));
-    assertU(adoc("id", "7", "lowerfilt", "b"));
-    assertU(adoc("id", "8", "lowerfilt", "baa"));
-    assertU(adoc("id", "9", "lowerfilt", "bbb"));
+    assertU(adoc("id", "0", "lowerfilt", "a", "standardfilt", "a"));
+    assertU(adoc("id", "1", "lowerfilt", "a", "standardfilt", "aa"));
+    assertU(adoc("id", "2", "lowerfilt", "aa", "standardfilt", "aaa"));
+    assertU(adoc("id", "3", "lowerfilt", "aaa", "standardfilt", "abbb"));
+    assertU(adoc("id", "4", "lowerfilt", "ab", "standardfilt", "b"));
+    assertU(adoc("id", "5", "lowerfilt", "abb", "standardfilt", "bb"));
+    assertU(adoc("id", "6", "lowerfilt", "abc", "standardfilt", "bbbb"));
+    assertU(adoc("id", "7", "lowerfilt", "b", "standardfilt", "c"));
+    assertU(adoc("id", "8", "lowerfilt", "baa", "standardfilt", "cccc"));
+    assertU(adoc("id", "9", "lowerfilt", "bbb", "standardfilt", "ccccc"));
 
     assertU("commit", commit());
   }
@@ -81,7 +81,8 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
+
     assertTrue("terms Size: " + terms.size() + " is not: " + 6, terms.size() 
== 6);
     assertTrue("a is null and it shouldn't be", terms.get("a") != null);
     assertTrue("aa is null and it shouldn't be", terms.get("aa") != null);
@@ -91,6 +92,58 @@
     assertTrue("abc is null and it shouldn't be", terms.get("abc") != null);
   }
 
+  public void testNoField() throws Exception {
+    SolrCore core = h.getCore();
+    TermsComponent tc = (TermsComponent) core.getSearchComponent("termsComp");
+    assertTrue("tc is null and it shouldn't be", tc != null);
+
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add(TermsParams.TERMS, "true");
+    //no lower bound
+    params.add(TermsParams.TERMS_LOWER, "d");
+    params.add(TermsParams.TERMS_ROWS, String.valueOf(50));
+    SolrRequestHandler handler;
+    SolrQueryResponse rsp;
+
+    handler = core.getRequestHandler("/terms");
+    assertTrue("handler is null and it shouldn't be", handler != null);
+    rsp = new SolrQueryResponse();
+    rsp.add("responseHeader", new SimpleOrderedMap());
+    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
+    Exception exception = rsp.getException();
+    assertTrue("exception is null and it shouldn't be", exception != null);
+  }
+
+
+  public void testMultipleFields() throws Exception {
+    SolrCore core = h.getCore();
+    TermsComponent tc = (TermsComponent) core.getSearchComponent("termsComp");
+    assertTrue("tc is null and it shouldn't be", tc != null);
+
+    ModifiableSolrParams params = new ModifiableSolrParams();
+    params.add(TermsParams.TERMS, "true");
+    params.add(TermsParams.TERMS_FIELD, "lowerfilt", "standardfilt");
+    //no lower bound
+    params.add(TermsParams.TERMS_UPPER, "b");
+    params.add(TermsParams.TERMS_ROWS, String.valueOf(50));
+    SolrRequestHandler handler;
+    SolrQueryResponse rsp;
+    NamedList values;
+    NamedList terms;
+    handler = core.getRequestHandler("/terms");
+    assertTrue("handler is null and it shouldn't be", handler != null);
+    rsp = new SolrQueryResponse();
+    rsp.add("responseHeader", new SimpleOrderedMap());
+    handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
+    values = rsp.getValues();
+    NamedList tmp = (NamedList) values.get("terms");
+    assertTrue("tmp Size: " + tmp.size() + " is not: " + 2, tmp.size() == 2);
+    terms = (NamedList) tmp.get("lowerfilt");
+    assertTrue("terms Size: " + terms.size() + " is not: " + 6, terms.size() 
== 6);
+    terms = (NamedList) tmp.get("standardfilt");
+    assertTrue("terms Size: " + terms.size() + " is not: " + 4, terms.size() 
== 4);
+  }
+
   public void testPastUpper() throws Exception {
     SolrCore core = h.getCore();
     TermsComponent tc = (TermsComponent) core.getSearchComponent("termsComp");
@@ -112,7 +165,7 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
     assertTrue("terms Size: " + terms.size() + " is not: " + 0, terms.size() 
== 0);
   }
 
@@ -137,7 +190,7 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
     assertTrue("terms Size: " + terms.size() + " is not: " + 6, terms.size() 
== 6);
     assertTrue("aa is null and it shouldn't be", terms.get("aa") != null);
     assertTrue("aaa is null and it shouldn't be", terms.get("aaa") != null);
@@ -152,7 +205,7 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
     assertTrue("terms Size: " + terms.size() + " is not: " + 7, terms.size() 
== 7);
     assertTrue("aa is null and it shouldn't be", terms.get("aa") != null);
     assertTrue("ab is null and it shouldn't be", terms.get("ab") != null);
@@ -168,7 +221,7 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
     assertTrue("terms Size: " + terms.size() + " is not: " + 6, terms.size() 
== 6);
     assertTrue("aa is null and it shouldn't be", terms.get("aa") != null);
     assertTrue("ab is null and it shouldn't be", terms.get("ab") != null);
@@ -191,7 +244,7 @@
     rsp.add("responseHeader", new SimpleOrderedMap());
     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);
     values = rsp.getValues();
-    terms = (NamedList) values.get("terms");
+    terms = (NamedList) ((NamedList) values.get("terms")).get("lowerfilt");
     assertTrue("terms Size: " + terms.size() + " is not: " + 2, terms.size() 
== 2);
     assertTrue("aa is null and it shouldn't be", terms.get("a") != null);
     assertTrue("aaa is null and it shouldn't be", terms.get("aa") != null);


Reply via email to