You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by sh...@apache.org on 2009/12/13 12:58:37 UTC

svn commit: r890053 - in /lucene/solr/trunk: ./ src/solrj/org/apache/solr/client/solrj/ src/solrj/org/apache/solr/client/solrj/response/ src/test/org/apache/solr/client/solrj/ src/test/org/apache/solr/client/solrj/response/

Author: shalin
Date: Sun Dec 13 11:58:37 2009
New Revision: 890053

URL: http://svn.apache.org/viewvc?rev=890053&view=rev
Log:
SOLR-1139 -- Add TermsComponent Query and Response Support in SolrJ

Added:
    lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java   (with props)
    lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java   (with props)
Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/SolrQuery.java
    lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java
    lucene/solr/trunk/src/test/org/apache/solr/client/solrj/SolrQueryTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=890053&r1=890052&r2=890053&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Sun Dec 13 11:58:37 2009
@@ -60,6 +60,8 @@
 
 * SOLR-1297: Add sort by Function capability (gsingers)
 
+* SOLR-1139: Add TermsComponent Query and Response Support in SolrJ (Matt Weber via shalin)
+
 Optimizations
 ----------------------
 

Modified: lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/SolrQuery.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/SolrQuery.java?rev=890053&r1=890052&r2=890053&view=diff
==============================================================================
--- lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/SolrQuery.java (original)
+++ lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/SolrQuery.java Sun Dec 13 11:58:37 2009
@@ -22,6 +22,7 @@
 import org.apache.solr.common.params.HighlightParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.StatsParams;
+import org.apache.solr.common.params.TermsParams;
 
 import java.util.regex.Pattern;
 
@@ -54,7 +55,154 @@
     this.set(CommonParams.Q, q);
   }
 
+  /** enable/disable terms.  
+   * 
+   * @param b flag to indicate terms should be enabled. <br /> if b==false, removes all other terms parameters
+   * @return Current reference (<i>this</i>)
+   */
+  public SolrQuery setTerms(boolean b) {
+    if (b) {
+      this.set(TermsParams.TERMS, true);
+    } else {
+      this.remove(TermsParams.TERMS);
+      this.remove(TermsParams.TERMS_FIELD);
+      this.remove(TermsParams.TERMS_LOWER);
+      this.remove(TermsParams.TERMS_UPPER);
+      this.remove(TermsParams.TERMS_UPPER_INCLUSIVE);
+      this.remove(TermsParams.TERMS_LOWER_INCLUSIVE);
+      this.remove(TermsParams.TERMS_LIMIT);
+      this.remove(TermsParams.TERMS_PREFIX_STR);
+      this.remove(TermsParams.TERMS_MINCOUNT);
+      this.remove(TermsParams.TERMS_MAXCOUNT);
+      this.remove(TermsParams.TERMS_RAW);
+      this.remove(TermsParams.TERMS_SORT);
+      this.remove(TermsParams.TERMS_REGEXP_STR);
+      this.remove(TermsParams.TERMS_REGEXP_FLAG);
+    }
+    return this;
+  }
+  
+  public boolean getTerms() {
+    return this.getBool(TermsParams.TERMS, false);
+  }
+  
+  public SolrQuery addTermsField(String field) {
+    this.add(TermsParams.TERMS_FIELD, field);
+    return this;
+  }
+  
+  public String[] getTermsFields() {
+    return this.getParams(TermsParams.TERMS_FIELD);
+  }
+  
+  public SolrQuery setTermsLower(String lower) {
+    this.set(TermsParams.TERMS_LOWER, lower);
+    return this;
+  }
+  
+  public String getTermsLower() {
+    return this.get(TermsParams.TERMS_LOWER, "");
+  }
+  
+  public SolrQuery setTermsUpper(String upper) {
+    this.set(TermsParams.TERMS_UPPER, upper);
+    return this;
+  }
+  
+  public String getTermsUpper() {
+    return this.get(TermsParams.TERMS_UPPER, "");
+  }
+  
+  public SolrQuery setTermsUpperInclusive(boolean b) {
+    this.set(TermsParams.TERMS_UPPER_INCLUSIVE, b);
+    return this;
+  }
+  
+  public boolean getTermsUpperInclusive() {
+    return this.getBool(TermsParams.TERMS_UPPER_INCLUSIVE, false);
+  }
+  
+  public SolrQuery setTermsLowerInclusive(boolean b) {
+    this.set(TermsParams.TERMS_LOWER_INCLUSIVE, b);
+    return this;
+  }
+  
+  public boolean getTermsLowerInclusive() {
+    return this.getBool(TermsParams.TERMS_LOWER_INCLUSIVE, true);
+  }
+ 
+  public SolrQuery setTermsLimit(int limit) {
+    this.set(TermsParams.TERMS_LIMIT, limit);
+    return this;
+  }
+  
+  public int getTermsLimit() {
+    return this.getInt(TermsParams.TERMS_LIMIT, 10);
+  }
+ 
+  public SolrQuery setTermsMinCount(int cnt) {
+    this.set(TermsParams.TERMS_MINCOUNT, cnt);
+    return this;
+  }
+  
+  public int getTermsMinCount() {
+    return this.getInt(TermsParams.TERMS_MINCOUNT, 1);
+  }
 
+  public SolrQuery setTermsMaxCount(int cnt) {
+    this.set(TermsParams.TERMS_MAXCOUNT, cnt);
+    return this;
+  }
+  
+  public int getTermsMaxCount() {
+    return this.getInt(TermsParams.TERMS_MAXCOUNT, -1);
+  }
+  
+  public SolrQuery setTermsPrefix(String prefix) {
+    this.set(TermsParams.TERMS_PREFIX_STR, prefix);
+    return this;
+  }
+  
+  public String getTermsPrefix() {
+    return this.get(TermsParams.TERMS_PREFIX_STR, "");
+  }
+  
+  public SolrQuery setTermsRaw(boolean b) {
+    this.set(TermsParams.TERMS_RAW, b);
+    return this;
+  }
+  
+  public boolean getTermsRaw() {
+    return this.getBool(TermsParams.TERMS_RAW, false);
+  }
+ 
+  public SolrQuery setTermsSortString(String type) {
+    this.set(TermsParams.TERMS_SORT, type);
+    return this;
+  }
+  
+  public String getTermsSortString() {
+    return this.get(TermsParams.TERMS_SORT, TermsParams.TERMS_SORT_COUNT);
+  }
+
+  public SolrQuery setTermsRegex(String regex)  {
+    this.set(TermsParams.TERMS_REGEXP_STR, regex);
+    return this;
+  }
+
+  public String getTermsRegex() {
+    return this.get(TermsParams.TERMS_REGEXP_STR);
+  }
+
+  public SolrQuery setTermsRegexFlag(String flag) {
+    this.add(TermsParams.TERMS_REGEXP_FLAG, flag);
+    return this;
+  }
+
+  public String[] getTermsRegexFlags()  {
+    return this.getParams(TermsParams.TERMS_REGEXP_FLAG);
+  }
+     
   /** Add field(s) for facet computation.
    * 
    * @param fields Array of field names from the IndexSchema

Modified: lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java?rev=890053&r1=890052&r2=890053&view=diff
==============================================================================
--- lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java (original)
+++ lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/QueryResponse.java Sun Dec 13 11:58:37 2009
@@ -46,6 +46,7 @@
   private NamedList<Object> _highlightingInfo = null;
   private NamedList<Object> _spellInfo = null;
   private NamedList<Object> _statsInfo = null;
+  private NamedList<Object> _termsInfo = null;
 
   // Facet stuff
   private Map<String,Integer> _facetQuery = null;
@@ -59,6 +60,9 @@
   // SpellCheck Response
   private SpellCheckResponse _spellResponse = null;
 
+  // Terms Response
+  private TermsResponse _termsResponse = null;
+  
   // Field stats Response
   private Map<String,FieldStatsInfo> _fieldStatsInfo = null;
   
@@ -118,6 +122,10 @@
         _statsInfo = (NamedList<Object>) res.getVal( i );
         extractStatsInfo( _statsInfo );
       }
+      else if ( "terms".equals( n ) ) {
+        _termsInfo = (NamedList<Object>) res.getVal( i );
+        extractTermsInfo( _termsInfo );
+      }
     }
   }
 
@@ -125,6 +133,10 @@
     _spellResponse = new SpellCheckResponse(spellInfo);
   }
 
+  private void extractTermsInfo(NamedList<Object> termsInfo) {
+    _termsResponse = new TermsResponse(termsInfo);
+  }
+  
   private void extractStatsInfo(NamedList<Object> info) {
     if( info != null ) {
       _fieldStatsInfo = new HashMap<String, FieldStatsInfo>();
@@ -276,6 +288,10 @@
     return _spellResponse;
   }
 
+  public TermsResponse getTermsResponse() {
+    return _termsResponse;
+  }
+  
   /**
    * See also: {@link #getLimitingFacets()}
    */

Added: lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java?rev=890053&view=auto
==============================================================================
--- lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java (added)
+++ lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java Sun Dec 13 11:58:37 2009
@@ -0,0 +1,89 @@
+package org.apache.solr.client.solrj.response;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.solr.common.util.NamedList;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Encapsulates responses from TermsComponent
+ */
+public class TermsResponse {
+  private Map<String, List<Term>> termMap = new HashMap<String, List<Term>>();
+  
+  public TermsResponse(NamedList<Object> termsInfo) {
+    for (int i = 0; i < termsInfo.size(); i++) {
+      String fieldName = termsInfo.getName(i);
+      List<Term> itemList = new ArrayList<Term>();
+      NamedList<Object> items = (NamedList<Object>) termsInfo.getVal(i);
+      
+      for (int j = 0; j < items.size(); j++) {
+        Term t = new Term(items.getName(j), ((Number) items.getVal(j)).longValue());
+        itemList.add(t);
+      }
+      
+      termMap.put(fieldName, itemList);
+    }
+  }
+
+  /**
+   * Get's the term list for a given field
+   * 
+   * @return the term list or null if no terms for the given field exist
+   */
+  public List<Term> getTerms(String field) {
+    return termMap.get(field);
+  }
+  
+  public Map<String, List<Term>> getTermMap() {
+    return termMap;
+  }
+
+  public static class Term {
+    private String term;
+    private long frequency;
+
+    public Term(String term, long frequency) {
+      this.term = term;
+      this.frequency = frequency;
+    }
+
+    public String getTerm() {
+      return term;
+    }
+
+    public void setTerm(String term) {
+      this.term = term;
+    }
+    
+    public long getFrequency() {
+      return frequency;
+    }
+    
+    public void setFrequency(long frequency) {
+      this.frequency = frequency;
+    }
+    
+    public void addFrequency(long frequency) {
+      this.frequency += frequency;
+    }
+  }
+}

Propchange: lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: lucene/solr/trunk/src/solrj/org/apache/solr/client/solrj/response/TermsResponse.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: lucene/solr/trunk/src/test/org/apache/solr/client/solrj/SolrQueryTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/client/solrj/SolrQueryTest.java?rev=890053&r1=890052&r2=890053&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/client/solrj/SolrQueryTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/client/solrj/SolrQueryTest.java Sun Dec 13 11:58:37 2009
@@ -143,4 +143,56 @@
     assertEquals( SolrQuery.ORDER.asc, SolrQuery.ORDER.desc.reverse() );
     assertEquals( SolrQuery.ORDER.desc, SolrQuery.ORDER.asc.reverse() );
   }
+  
+  public void testTerms() {
+    SolrQuery q = new SolrQuery();
+    
+    // check getters
+    assertEquals(false, q.getTerms());
+    assertEquals(null, q.getTermsFields());
+    assertEquals("", q.getTermsLower());
+    assertEquals("", q.getTermsUpper());
+    assertEquals(false, q.getTermsUpperInclusive());
+    assertEquals(true, q.getTermsLowerInclusive());
+    assertEquals(10, q.getTermsLimit());
+    assertEquals(1, q.getTermsMinCount());
+    assertEquals(-1, q.getTermsMaxCount());
+    assertEquals("", q.getTermsPrefix());
+    assertEquals(false, q.getTermsRaw());
+    assertEquals("count", q.getTermsSortString());
+    assertEquals(null, q.getTermsRegex());
+    assertEquals(null, q.getTermsRegexFlags());
+
+    // check setters
+    q.setTerms(true);
+    assertEquals(true, q.getTerms());
+    q.addTermsField("testfield");
+    assertEquals(1, q.getTermsFields().length);
+    assertEquals("testfield", q.getTermsFields()[0]);
+    q.setTermsLower("lower");
+    assertEquals("lower", q.getTermsLower());
+    q.setTermsUpper("upper");
+    assertEquals("upper", q.getTermsUpper());
+    q.setTermsUpperInclusive(true);
+    assertEquals(true, q.getTermsUpperInclusive());
+    q.setTermsLowerInclusive(false);
+    assertEquals(false, q.getTermsLowerInclusive());
+    q.setTermsLimit(5);
+    assertEquals(5, q.getTermsLimit());
+    q.setTermsMinCount(2);
+    assertEquals(2, q.getTermsMinCount());
+    q.setTermsMaxCount(5);
+    assertEquals(5, q.getTermsMaxCount());
+    q.setTermsPrefix("prefix");
+    assertEquals("prefix", q.getTermsPrefix());
+    q.setTermsRaw(true);
+    assertEquals(true, q.getTermsRaw());
+    q.setTermsSortString("index");
+    assertEquals("index", q.getTermsSortString());
+    q.setTermsRegex("a.*");
+    assertEquals("a.*", q.getTermsRegex());
+    q.setTermsRegexFlag("case_insensitive");
+    q.setTermsRegexFlag("multiline");
+    assertEquals(2, q.getTermsRegexFlags().length);
+  }
 }

Added: lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java?rev=890053&view=auto
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java (added)
+++ lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java Sun Dec 13 11:58:37 2009
@@ -0,0 +1,79 @@
+package org.apache.solr.client.solrj.response;
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.List;
+import junit.framework.Assert;
+
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.SolrServer;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.client.solrj.SolrExampleTestBase;
+import org.apache.solr.client.solrj.request.QueryRequest;
+import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.response.TermsResponse.Term;
+
+/**
+ * Test for TermComponent's response in Solrj
+ */
+public class TermsResponseTest extends SolrExampleTestBase {
+
+  SolrServer server;
+
+  @Override 
+  public void setUp() throws Exception {
+    super.setUp();
+    server = createNewSolrServer();
+  }
+
+  @Override
+  protected SolrServer getSolrServer() {
+    return server;
+  }
+
+  @Override
+  protected SolrServer createNewSolrServer() {
+    return new EmbeddedSolrServer(h.getCoreContainer(), "");
+  }
+
+  public void testTermsResponse() throws Exception {
+    SolrInputDocument doc = new SolrInputDocument();
+    doc.setField("id", 1);
+    doc.setField("terms_s", "samsung");
+    getSolrServer().add(doc);
+    getSolrServer().commit(true, true);
+
+    SolrQuery query = new SolrQuery();
+    query.setQueryType("/terms");
+    query.setTerms(true);
+    query.setTermsLimit(5);
+    query.setTermsLower("s");
+    query.setTermsPrefix("s");
+    query.addTermsField("terms_s");
+    query.setTermsMinCount(1);
+    
+    QueryRequest request = new QueryRequest(query);
+    List<Term> terms = request.process(getSolrServer()).getTermsResponse().getTerms("terms_s");
+
+    Assert.assertNotNull(terms);
+    Assert.assertEquals(terms.size(), 1);
+
+    Term term = terms.get(0);
+    Assert.assertEquals(term.getTerm(), "samsung");
+    Assert.assertEquals(term.getFrequency(), 1);
+  }
+}

Propchange: lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: lucene/solr/trunk/src/test/org/apache/solr/client/solrj/response/TermsResponseTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL