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 ho...@apache.org on 2008/07/24 21:02:17 UTC

svn commit: r679490 - in /lucene/solr/trunk: CHANGES.txt src/test/org/apache/solr/BasicFunctionalityTest.java src/test/org/apache/solr/request/SimpleFacetsTest.java

Author: hossman
Date: Thu Jul 24 12:02:17 2008
New Revision: 679490

URL: http://svn.apache.org/viewvc?rev=679490&view=rev
Log:
SOLR-645: Refactory faceting tests into SimpleFacetsTest

Added:
    lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java   (with props)
Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=679490&r1=679489&r2=679490&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Thu Jul 24 12:02:17 2008
@@ -542,6 +542,8 @@
 16. SOLR-520: Deprecated unused LengthFilter since already core in
     Lucene-Java (hossman)
 
+17. SOLR-645: Refactored SimpleFacetsTest (Lars Kotthoff via hossman)
+    
 Build
  1. SOLR-411.  Changed the names of the Solr JARs to use the defacto standard JAR names based on
     project-name-version.jar.  This yields, for example:

Modified: lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=679490&r1=679489&r2=679490&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java Thu Jul 24 12:02:17 2008
@@ -463,717 +463,6 @@
             );
 
   }
-      
-  public void testSimpleFacetCounts() {
-    assertU(adoc("id", "42", "trait_s", "Tool", "trait_s", "Obnoxious",
-                 "name", "Zapp Brannigan"));
-    assertU(adoc("id", "43" ,
-                 "title", "Democratic Order of Planets"));
-    assertU(adoc("id", "44", "trait_s", "Tool",
-                 "name", "The Zapper"));
-    assertU(adoc("id", "45", "trait_s", "Chauvinist",
-                 "title", "25 star General"));
-    assertU(adoc("id", "46", "trait_s", "Obnoxious",
-                 "subject", "Defeated the pacifists of the Gandhi nebula"));
-    assertU(adoc("id", "47", "trait_s", "Pig",
-                 "text", "line up and fly directly at the enemy death cannons, clogging them with wreckage!"));
-    assertU(commit());
- 
-    assertQ("standard request handler returns all matches",
-            req("id:[42 TO 47]"),
-            "*[count(//doc)=6]"
-            );
- 
-    assertQ("filter results using fq",
-            req("q","id:[42 TO 46]",
-                "fq", "id:[43 TO 47]"),
-            "*[count(//doc)=4]"
-            );
-    
-    assertQ("don't filter results using blank fq",
-            req("q","id:[42 TO 46]",
-                "fq", " "),
-            "*[count(//doc)=5]"
-            );
-     
-    assertQ("filter results using multiple fq params",
-            req("q","id:[42 TO 46]",
-                "fq", "trait_s:Obnoxious",
-                "fq", "id:[43 TO 47]"),
-            "*[count(//doc)=1]"
-            );
- 
-    assertQ("check counts for facet queries",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"facet.query", "trait_s:Obnoxious"
-                ,"facet.query", "id:[42 TO 45]"
-                ,"facet.query", "id:[43 TO 47]"
-                ,"facet.field", "trait_s"
-                )
-            ,"*[count(//doc)=6]"
- 
-            ,"//lst[@name='facet_counts']/lst[@name='facet_queries']"
-            ,"//lst[@name='facet_queries']/int[@name='trait_s:Obnoxious'][.='2']"
-            ,"//lst[@name='facet_queries']/int[@name='id:[42 TO 45]'][.='4']"
-            ,"//lst[@name='facet_queries']/int[@name='id:[43 TO 47]'][.='5']"
- 
-            ,"//lst[@name='facet_counts']/lst[@name='facet_fields']"
-            ,"//lst[@name='facet_fields']/lst[@name='trait_s']"
-            ,"*[count(//lst[@name='trait_s']/int)=4]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Pig'][.='1']"
-            );
- 
-    assertQ("check counts for applied facet queries using filtering (fq)",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                ,"facet.query", "id:[42 TO 45]"
-                ,"facet.query", "id:[43 TO 47]"
-                )
-            ,"*[count(//doc)=4]"
-            ,"//lst[@name='facet_counts']/lst[@name='facet_queries']"
-            ,"//lst[@name='facet_queries']/int[@name='id:[42 TO 45]'][.='4']"
-            ,"//lst[@name='facet_queries']/int[@name='id:[43 TO 47]'][.='3']"
-            ,"*[count(//lst[@name='trait_s']/int)=4]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Pig'][.='0']"
-            );
- 
-    assertQ("check counts with facet.zero=false&facet.missing=true using fq",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"facet.zeros", "false"
-                ,"f.trait_s.facet.missing", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                )
-            ,"*[count(//doc)=4]"
-            ,"*[count(//lst[@name='trait_s']/int)=4]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
-            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"
-            );
-
-    assertQ("check counts with facet.mincount=1&facet.missing=true using fq",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"facet.mincount", "1"
-                ,"f.trait_s.facet.missing", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                )
-            ,"*[count(//doc)=4]"
-            ,"*[count(//lst[@name='trait_s']/int)=4]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
-            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"
-            );
-
-    assertQ("check counts with facet.mincount=2&facet.missing=true using fq",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"facet.mincount", "2"
-                ,"f.trait_s.facet.missing", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                )
-            ,"*[count(//doc)=4]"
-            ,"*[count(//lst[@name='trait_s']/int)=2]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"               
-            );
-
-    assertQ("check sorted paging",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                ,"facet.mincount","0"
-                ,"facet.offset","0"
-                ,"facet.limit","4"
-                )
-            ,"*[count(//lst[@name='trait_s']/int)=4]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Pig'][.='0']"
-            );
-
-    assertQ("check sorted paging",
-            req("q", "id:[42 TO 47]"
-                ,"facet", "true"
-                ,"fq", "id:[42 TO 45]"
-                ,"facet.field", "trait_s"
-                ,"facet.mincount","0"
-                ,"facet.offset","0"
-                ,"facet.limit","3"
-                )
-            ,"*[count(//lst[@name='trait_s']/int)=3]"
-            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
-            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
-            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
-            );
-
-  }
- 
-  public void testDateFacets() {
-    final String f = "bday";
-    final String pre = "//lst[@name='facet_dates']/lst[@name='"+f+"']";
-
-    assertU(adoc("id", "1",  f, "1976-07-04T12:08:56.235Z"));
-    assertU(adoc("id", "2",  f, "1976-07-05T00:00:00.000Z"));
-    assertU(adoc("id", "3",  f, "1976-07-15T00:07:67.890Z"));
-    assertU(adoc("id", "4",  f, "1976-07-21T00:07:67.890Z"));
-    assertU(adoc("id", "5",  f, "1976-07-13T12:12:25.255Z"));
-    assertU(adoc("id", "6",  f, "1976-07-03T17:01:23.456Z"));
-    assertU(adoc("id", "7",  f, "1976-07-12T12:12:25.255Z"));
-    assertU(adoc("id", "8",  f, "1976-07-15T15:15:15.155Z"));
-    assertU(adoc("id", "9",  f, "1907-07-12T13:13:23.235Z"));
-    assertU(adoc("id", "10", f, "1976-07-03T11:02:45.678Z"));
-    assertU(adoc("id", "11", f, "1907-07-12T12:12:25.255Z"));
-    assertU(adoc("id", "12", f, "2007-07-30T07:07:07.070Z"));
-    assertU(adoc("id", "13", f, "1976-07-30T22:22:22.222Z"));
-    assertU(adoc("id", "14", f, "1976-07-05T22:22:22.222Z"));
-    assertU(commit());
-
-    assertQ("check counts for month of facet by day",
-            req( "q", "*:*"
-                ,"rows", "0"
-                ,"facet", "true"
-                ,"facet.date", f
-                ,"facet.date.start", "1976-07-01T00:00:00.000Z"
-                ,"facet.date.end",   "1976-07-01T00:00:00.000Z+1MONTH"
-                ,"facet.date.gap",   "+1DAY"
-                ,"facet.date.other", "all"
-                )
-            // 31 days + pre+post+inner = 34
-            ,"*[count("+pre+"/int)=34]"
-            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='0'  ]"
-            ,pre+"/int[@name='1976-07-02T00:00:00Z'][.='0'  ]"
-            ,pre+"/int[@name='1976-07-03T00:00:00Z'][.='2'  ]"
-            // july4th = 2 because exists doc @ 00:00:00.000 on July5
-            // (date faceting is inclusive)
-            ,pre+"/int[@name='1976-07-04T00:00:00Z'][.='2'  ]"
-            ,pre+"/int[@name='1976-07-05T00:00:00Z'][.='2'  ]"
-            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-07T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-08T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-09T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-10T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-12T00:00:00Z'][.='1'  ]"
-            ,pre+"/int[@name='1976-07-13T00:00:00Z'][.='1'  ]"
-            ,pre+"/int[@name='1976-07-14T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-15T00:00:00Z'][.='2'  ]"
-            ,pre+"/int[@name='1976-07-16T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-17T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-18T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-19T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-21T00:00:00Z'][.='1'  ]"
-            ,pre+"/int[@name='1976-07-22T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-23T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-24T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-25T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-26T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-27T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-28T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-29T00:00:00Z'][.='0']"
-            ,pre+"/int[@name='1976-07-30T00:00:00Z'][.='1'  ]"
-            ,pre+"/int[@name='1976-07-31T00:00:00Z'][.='0']"
-            
-            ,pre+"/int[@name='before' ][.='2']"
-            ,pre+"/int[@name='after'  ][.='1']"
-            ,pre+"/int[@name='between'][.='11']"
-            
-            );
-
-    assertQ("check hardend=false",
-            req( "q", "*:*"
-                ,"rows", "0"
-                ,"facet", "true"
-                ,"facet.date", f
-                ,"facet.date.start",  "1976-07-01T00:00:00.000Z"
-                ,"facet.date.end",    "1976-07-13T00:00:00.000Z"
-                ,"facet.date.gap",    "+5DAYS"
-                ,"facet.date.other",  "all"
-                ,"facet.date.hardend","false"
-                )
-            // 3 gaps + pre+post+inner = 6
-            ,"*[count("+pre+"/int)=6]"
-            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='5'  ]"
-            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0'  ]"
-            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='4'  ]"
-            
-            ,pre+"/int[@name='before' ][.='2']"
-            ,pre+"/int[@name='after'  ][.='3']"
-            ,pre+"/int[@name='between'][.='9']"
-            );
-
-    assertQ("check hardend=true",
-            req( "q", "*:*"
-                ,"rows", "0"
-                ,"facet", "true"
-                ,"facet.date", f
-                ,"facet.date.start",  "1976-07-01T00:00:00.000Z"
-                ,"facet.date.end",    "1976-07-13T00:00:00.000Z"
-                ,"facet.date.gap",    "+5DAYS"
-                ,"facet.date.other",  "all"
-                ,"facet.date.hardend","true"
-                )
-            // 3 gaps + pre+post+inner = 6
-            ,"*[count("+pre+"/int)=6]"
-            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='5'  ]"
-            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0'  ]"
-            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='1'  ]"
-            
-            ,pre+"/int[@name='before' ][.='2']"
-            ,pre+"/int[@name='after'  ][.='6']"
-            ,pre+"/int[@name='between'][.='6']"
-            );
-    
-  }
-
-  public void testFacetMultiValued() {
-    doFacets("t_s");
-    doFacets("t_s", "facet.enum.cache.minDf", "2");
-    doFacets("t_s", "facet.enum.cache.minDf", "100");
-  }
-
-  public void testFacetSingleValued() {
-    doFacets("t_s1");
-  }
-
-  public void doFacets(String f, String... params) {
-    String pre = "//lst[@name='"+f+"']";
-    String notc = "id:[* TO *] -"+f+":C";
-
-    assertU(adoc("id", "1",  f, "A"));
-    assertU(adoc("id", "2",  f, "B"));
-    assertU(adoc("id", "3",  f, "C"));
-    assertU(adoc("id", "4",  f, "C"));
-    assertU(adoc("id", "5",  f, "D"));
-    assertU(adoc("id", "6",  f, "E"));
-    assertU(adoc("id", "7",  f, "E"));
-    assertU(adoc("id", "8",  f, "E"));
-    assertU(adoc("id", "9",  f, "F"));
-    assertU(adoc("id", "10", f, "G"));
-    assertU(adoc("id", "11", f, "G"));
-    assertU(adoc("id", "12", f, "G"));
-    assertU(adoc("id", "13", f, "G"));
-    assertU(adoc("id", "14", f, "G"));
-    assertU(commit());
-
-    assertQ("check counts for unlimited facet",
-            req(params, "q", "id:[* TO *]"
-                ,"facet", "true"
-                ,"facet.field", f
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=7]"
-
-            ,pre+"/int[@name='G'][.='5']"
-            ,pre+"/int[@name='E'][.='3']"
-            ,pre+"/int[@name='C'][.='2']"
-
-            ,pre+"/int[@name='A'][.='1']"
-            ,pre+"/int[@name='B'][.='1']"
-            ,pre+"/int[@name='D'][.='1']"
-            ,pre+"/int[@name='F'][.='1']"
-            );
-
-    assertQ("check counts for facet with generous limit",
-            req(params, "q", "id:[* TO *]"
-                ,"facet", "true"
-                ,"facet.limit", "100"
-                ,"facet.field", f
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=7]"
-
-            ,pre+"/int[1][@name='G'][.='5']"
-            ,pre+"/int[2][@name='E'][.='3']"
-            ,pre+"/int[3][@name='C'][.='2']"
-
-            ,pre+"/int[@name='A'][.='1']"
-            ,pre+"/int[@name='B'][.='1']"
-            ,pre+"/int[@name='D'][.='1']"
-            ,pre+"/int[@name='F'][.='1']"
-            );
-
-    assertQ("check counts for limited facet",
-            req(params, "q", "id:[* TO *]"
-                ,"facet", "true"
-                ,"facet.limit", "2"
-                ,"facet.field", f
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-
-            ,pre+"/int[1][@name='G'][.='5']"
-            ,pre+"/int[2][@name='E'][.='3']"
-            );
-
-   assertQ("check offset",
-            req(params, "q", "id:[* TO *]"
-                ,"facet", "true"
-                ,"facet.offset", "1"
-                ,"facet.limit", "1"
-                ,"facet.field", f
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-
-            ,pre+"/int[1][@name='E'][.='3']"
-            );
-
-    assertQ("test sorted facet paging with zero (don't count in limit)",
-            req(params, "q", "id:[* TO *]"
-                ,"fq",notc
-                ,"facet", "true"
-                ,"facet.field", f
-                ,"facet.mincount","1"
-                ,"facet.offset","0"
-                ,"facet.limit","6"
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=6]"
-            ,pre+"/int[1][@name='G'][.='5']"
-            ,pre+"/int[2][@name='E'][.='3']"
-            ,pre+"/int[3][@name='A'][.='1']"
-            ,pre+"/int[4][@name='B'][.='1']"
-            ,pre+"/int[5][@name='D'][.='1']"
-            ,pre+"/int[6][@name='F'][.='1']"
-            );
-
-    assertQ("test sorted facet paging with zero (test offset correctness)",
-            req(params, "q", "id:[* TO *]"
-                ,"fq",notc
-                ,"facet", "true"
-                ,"facet.field", f
-                ,"facet.mincount","1"
-                ,"facet.offset","3"
-                ,"facet.limit","2"
-                ,"facet.sort","true"
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-            ,pre+"/int[1][@name='B'][.='1']"
-            ,pre+"/int[2][@name='D'][.='1']"
-            );
-
-   assertQ("test facet unsorted paging",
-            req(params, "q", "id:[* TO *]"
-                ,"fq",notc
-                ,"facet", "true"
-                ,"facet.field", f
-                ,"facet.mincount","1"
-                ,"facet.offset","0"
-                ,"facet.limit","6"
-                ,"facet.sort","false"
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=6]"
-            ,pre+"/int[1][@name='A'][.='1']"
-            ,pre+"/int[2][@name='B'][.='1']"
-            ,pre+"/int[3][@name='D'][.='1']"
-            ,pre+"/int[4][@name='E'][.='3']"
-            ,pre+"/int[5][@name='F'][.='1']"
-            ,pre+"/int[6][@name='G'][.='5']"
-            );
-
-   assertQ("test facet unsorted paging",
-            req(params, "q", "id:[* TO *]"
-                ,"fq",notc
-                ,"facet", "true"
-                ,"facet.field", f
-                ,"facet.mincount","1"
-                ,"facet.offset","3"
-                ,"facet.limit","2"
-                ,"facet.sort","false"
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-            ,pre+"/int[1][@name='E'][.='3']"
-            ,pre+"/int[2][@name='F'][.='1']"
-            );
-
-    assertQ("test facet unsorted paging, mincount=2",
-            req(params, "q", "id:[* TO *]"
-                ,"fq",notc
-                ,"facet", "true"
-                ,"facet.field", f
-                ,"facet.mincount","2"
-                ,"facet.offset","1"
-                ,"facet.limit","2"
-                ,"facet.sort","false"
-                )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='G'][.='5']"
-            );
-  }
-
-
-
-  public void testFacetPrefixMultiValued() {
-    doFacetPrefix("t_s");   
-    doFacetPrefix("t_s", "facet.enum.cache.minDf", "3");
-    doFacetPrefix("t_s", "facet.enum.cache.minDf", "100");
-  }
-
-  public void testFacetPrefixSingleValued() {
-    doFacetPrefix("t_s1");
-  }
-
-  public void doFacetPrefix(String f, String... params) {
-    String indent="on";
-    String pre = "//lst[@name='"+f+"']";
-    String notc = "id:[* TO *] -"+f+":C";
-
-    assertU(adoc("id", "1",  f, "AAA"));
-    assertU(adoc("id", "2",  f, "B"));
-    assertU(adoc("id", "3",  f, "BB"));
-    assertU(adoc("id", "4",  f, "BB"));
-    assertU(adoc("id", "5",  f, "BBB"));
-    assertU(adoc("id", "6",  f, "BBB"));
-    assertU(adoc("id", "7",  f, "BBB"));
-    assertU(adoc("id", "8",  f, "CC"));
-    assertU(adoc("id", "9",  f, "CC"));
-    assertU(adoc("id", "10", f, "CCC"));
-    assertU(adoc("id", "11", f, "CCC"));
-    assertU(adoc("id", "12", f, "CCC"));
-    assertU(commit());
-
-    assertQ("test facet.prefix middle, exact match first term",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
-            ,pre+"/int[1][@name='BBB'][.='3']"
-            ,pre+"/int[2][@name='BB'][.='2']"
-            ,pre+"/int[3][@name='B'][.='1']"
-    );
-
-    assertQ("test facet.prefix middle, exact match first term, unsorted",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","false"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
-            ,pre+"/int[1][@name='B'][.='1']"
-            ,pre+"/int[2][@name='BB'][.='2']"
-            ,pre+"/int[3][@name='BBB'][.='3']"
-    );
-
-
-     assertQ("test facet.prefix middle, exact match first term, unsorted",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","false"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
-            ,pre+"/int[1][@name='B'][.='1']"
-            ,pre+"/int[2][@name='BB'][.='2']"
-            ,pre+"/int[3][@name='BBB'][.='3']"
-    );
-
-
-    assertQ("test facet.prefix middle, paging",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","1"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-            ,pre+"/int[1][@name='BB'][.='2']"
-            ,pre+"/int[2][@name='B'][.='1']"
-    );
-
-    assertQ("test facet.prefix middle, paging",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","1"
-                    ,"facet.limit","1"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='BB'][.='2']"
-    );
-
-    assertQ("test facet.prefix middle, paging",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","1"
-                    ,"facet.limit","1"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","B"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='BB'][.='2']"
-    );
-
-    assertQ("test facet.prefix end, not exact match",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","C"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-            ,pre+"/int[1][@name='CCC'][.='3']"
-            ,pre+"/int[2][@name='CC'][.='2']"
-    );
-
-    assertQ("test facet.prefix end, exact match",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","CC"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
-            ,pre+"/int[1][@name='CCC'][.='3']"
-            ,pre+"/int[2][@name='CC'][.='2']"
-    );
-
-    assertQ("test facet.prefix past end",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","X"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
-    );
-
-    assertQ("test facet.prefix past end",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","1"
-                    ,"facet.limit","-1"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","X"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
-    );
-
-    assertQ("test facet.prefix at start, exact match",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","AAA"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='AAA'][.='1']"
-    );
-    assertQ("test facet.prefix at Start, not exact match",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","AA"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='AAA'][.='1']"
-    );
-    assertQ("test facet.prefix at Start, not exact match",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","AA"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
-            ,pre+"/int[1][@name='AAA'][.='1']"
-    );    
-    assertQ("test facet.prefix before start",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","0"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","999"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
-    );
-
-    assertQ("test facet.prefix before start",
-            req(params, "q", "id:[* TO *]"
-                    ,"indent",indent
-                    ,"facet","true"
-                    ,"facet.field", f
-                    ,"facet.mincount","0"
-                    ,"facet.offset","2"
-                    ,"facet.limit","100"
-                    ,"facet.sort","true"
-                    ,"facet.prefix","999"
-            )
-            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
-    );
-
-  }
-
 
   private String mkstr(int len) {
     StringBuilder sb = new StringBuilder(len);

Added: lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java?rev=679490&view=auto
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java (added)
+++ lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java Thu Jul 24 12:02:17 2008
@@ -0,0 +1,737 @@
+/**
+ * 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.
+ */
+
+package org.apache.solr.request;
+
+import org.apache.solr.util.AbstractSolrTestCase;
+
+public class SimpleFacetsTest extends AbstractSolrTestCase {
+
+  public String getSchemaFile() { return "schema.xml"; }
+  public String getSolrConfigFile() { return "solrconfig.xml"; }
+  public String getCoreName() { return "basic"; }
+  
+  public void testSimpleFacetCounts() {
+    assertU(adoc("id", "42", "trait_s", "Tool", "trait_s", "Obnoxious",
+                 "name", "Zapp Brannigan"));
+    assertU(adoc("id", "43" ,
+                 "title", "Democratic Order of Planets"));
+    assertU(adoc("id", "44", "trait_s", "Tool",
+                 "name", "The Zapper"));
+    assertU(adoc("id", "45", "trait_s", "Chauvinist",
+                 "title", "25 star General"));
+    assertU(adoc("id", "46", "trait_s", "Obnoxious",
+                 "subject", "Defeated the pacifists of the Gandhi nebula"));
+    assertU(adoc("id", "47", "trait_s", "Pig",
+                 "text", "line up and fly directly at the enemy death cannons, clogging them with wreckage!"));
+    assertU(commit());
+ 
+    assertQ("standard request handler returns all matches",
+            req("id:[42 TO 47]"),
+            "*[count(//doc)=6]"
+            );
+ 
+    assertQ("filter results using fq",
+            req("q","id:[42 TO 46]",
+                "fq", "id:[43 TO 47]"),
+            "*[count(//doc)=4]"
+            );
+    
+    assertQ("don't filter results using blank fq",
+            req("q","id:[42 TO 46]",
+                "fq", " "),
+            "*[count(//doc)=5]"
+            );
+     
+    assertQ("filter results using multiple fq params",
+            req("q","id:[42 TO 46]",
+                "fq", "trait_s:Obnoxious",
+                "fq", "id:[43 TO 47]"),
+            "*[count(//doc)=1]"
+            );
+ 
+    assertQ("check counts for facet queries",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"facet.query", "trait_s:Obnoxious"
+                ,"facet.query", "id:[42 TO 45]"
+                ,"facet.query", "id:[43 TO 47]"
+                ,"facet.field", "trait_s"
+                )
+            ,"*[count(//doc)=6]"
+ 
+            ,"//lst[@name='facet_counts']/lst[@name='facet_queries']"
+            ,"//lst[@name='facet_queries']/int[@name='trait_s:Obnoxious'][.='2']"
+            ,"//lst[@name='facet_queries']/int[@name='id:[42 TO 45]'][.='4']"
+            ,"//lst[@name='facet_queries']/int[@name='id:[43 TO 47]'][.='5']"
+ 
+            ,"//lst[@name='facet_counts']/lst[@name='facet_fields']"
+            ,"//lst[@name='facet_fields']/lst[@name='trait_s']"
+            ,"*[count(//lst[@name='trait_s']/int)=4]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Pig'][.='1']"
+            );
+ 
+    assertQ("check counts for applied facet queries using filtering (fq)",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                ,"facet.query", "id:[42 TO 45]"
+                ,"facet.query", "id:[43 TO 47]"
+                )
+            ,"*[count(//doc)=4]"
+            ,"//lst[@name='facet_counts']/lst[@name='facet_queries']"
+            ,"//lst[@name='facet_queries']/int[@name='id:[42 TO 45]'][.='4']"
+            ,"//lst[@name='facet_queries']/int[@name='id:[43 TO 47]'][.='3']"
+            ,"*[count(//lst[@name='trait_s']/int)=4]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Pig'][.='0']"
+            );
+ 
+    assertQ("check counts with facet.zero=false&facet.missing=true using fq",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"facet.zeros", "false"
+                ,"f.trait_s.facet.missing", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                )
+            ,"*[count(//doc)=4]"
+            ,"*[count(//lst[@name='trait_s']/int)=4]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
+            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"
+            );
+
+    assertQ("check counts with facet.mincount=1&facet.missing=true using fq",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"facet.mincount", "1"
+                ,"f.trait_s.facet.missing", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                )
+            ,"*[count(//doc)=4]"
+            ,"*[count(//lst[@name='trait_s']/int)=4]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
+            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"
+            );
+
+    assertQ("check counts with facet.mincount=2&facet.missing=true using fq",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"facet.mincount", "2"
+                ,"f.trait_s.facet.missing", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                )
+            ,"*[count(//doc)=4]"
+            ,"*[count(//lst[@name='trait_s']/int)=2]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[not(@name)][.='1']"               
+            );
+
+    assertQ("check sorted paging",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                ,"facet.mincount","0"
+                ,"facet.offset","0"
+                ,"facet.limit","4"
+                )
+            ,"*[count(//lst[@name='trait_s']/int)=4]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Pig'][.='0']"
+            );
+
+    assertQ("check sorted paging",
+            req("q", "id:[42 TO 47]"
+                ,"facet", "true"
+                ,"fq", "id:[42 TO 45]"
+                ,"facet.field", "trait_s"
+                ,"facet.mincount","0"
+                ,"facet.offset","0"
+                ,"facet.limit","3"
+                )
+            ,"*[count(//lst[@name='trait_s']/int)=3]"
+            ,"//lst[@name='trait_s']/int[@name='Tool'][.='2']"
+            ,"//lst[@name='trait_s']/int[@name='Obnoxious'][.='1']"
+            ,"//lst[@name='trait_s']/int[@name='Chauvinist'][.='1']"
+            );
+
+  }
+ 
+  public void testDateFacets() {
+    final String f = "bday";
+    final String pre = "//lst[@name='facet_dates']/lst[@name='"+f+"']";
+
+    assertU(adoc("id", "1",  f, "1976-07-04T12:08:56.235Z"));
+    assertU(adoc("id", "2",  f, "1976-07-05T00:00:00.000Z"));
+    assertU(adoc("id", "3",  f, "1976-07-15T00:07:67.890Z"));
+    assertU(adoc("id", "4",  f, "1976-07-21T00:07:67.890Z"));
+    assertU(adoc("id", "5",  f, "1976-07-13T12:12:25.255Z"));
+    assertU(adoc("id", "6",  f, "1976-07-03T17:01:23.456Z"));
+    assertU(adoc("id", "7",  f, "1976-07-12T12:12:25.255Z"));
+    assertU(adoc("id", "8",  f, "1976-07-15T15:15:15.155Z"));
+    assertU(adoc("id", "9",  f, "1907-07-12T13:13:23.235Z"));
+    assertU(adoc("id", "10", f, "1976-07-03T11:02:45.678Z"));
+    assertU(adoc("id", "11", f, "1907-07-12T12:12:25.255Z"));
+    assertU(adoc("id", "12", f, "2007-07-30T07:07:07.070Z"));
+    assertU(adoc("id", "13", f, "1976-07-30T22:22:22.222Z"));
+    assertU(adoc("id", "14", f, "1976-07-05T22:22:22.222Z"));
+    assertU(commit());
+
+    assertQ("check counts for month of facet by day",
+            req( "q", "*:*"
+                ,"rows", "0"
+                ,"facet", "true"
+                ,"facet.date", f
+                ,"facet.date.start", "1976-07-01T00:00:00.000Z"
+                ,"facet.date.end",   "1976-07-01T00:00:00.000Z+1MONTH"
+                ,"facet.date.gap",   "+1DAY"
+                ,"facet.date.other", "all"
+                )
+            // 31 days + pre+post+inner = 34
+            ,"*[count("+pre+"/int)=34]"
+            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='0'  ]"
+            ,pre+"/int[@name='1976-07-02T00:00:00Z'][.='0'  ]"
+            ,pre+"/int[@name='1976-07-03T00:00:00Z'][.='2'  ]"
+            // july4th = 2 because exists doc @ 00:00:00.000 on July5
+            // (date faceting is inclusive)
+            ,pre+"/int[@name='1976-07-04T00:00:00Z'][.='2'  ]"
+            ,pre+"/int[@name='1976-07-05T00:00:00Z'][.='2'  ]"
+            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-07T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-08T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-09T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-10T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-12T00:00:00Z'][.='1'  ]"
+            ,pre+"/int[@name='1976-07-13T00:00:00Z'][.='1'  ]"
+            ,pre+"/int[@name='1976-07-14T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-15T00:00:00Z'][.='2'  ]"
+            ,pre+"/int[@name='1976-07-16T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-17T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-18T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-19T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-21T00:00:00Z'][.='1'  ]"
+            ,pre+"/int[@name='1976-07-22T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-23T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-24T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-25T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-26T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-27T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-28T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-29T00:00:00Z'][.='0']"
+            ,pre+"/int[@name='1976-07-30T00:00:00Z'][.='1'  ]"
+            ,pre+"/int[@name='1976-07-31T00:00:00Z'][.='0']"
+            
+            ,pre+"/int[@name='before' ][.='2']"
+            ,pre+"/int[@name='after'  ][.='1']"
+            ,pre+"/int[@name='between'][.='11']"
+            
+            );
+
+    assertQ("check hardend=false",
+            req( "q", "*:*"
+                ,"rows", "0"
+                ,"facet", "true"
+                ,"facet.date", f
+                ,"facet.date.start",  "1976-07-01T00:00:00.000Z"
+                ,"facet.date.end",    "1976-07-13T00:00:00.000Z"
+                ,"facet.date.gap",    "+5DAYS"
+                ,"facet.date.other",  "all"
+                ,"facet.date.hardend","false"
+                )
+            // 3 gaps + pre+post+inner = 6
+            ,"*[count("+pre+"/int)=6]"
+            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='5'  ]"
+            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0'  ]"
+            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='4'  ]"
+            
+            ,pre+"/int[@name='before' ][.='2']"
+            ,pre+"/int[@name='after'  ][.='3']"
+            ,pre+"/int[@name='between'][.='9']"
+            );
+
+    assertQ("check hardend=true",
+            req( "q", "*:*"
+                ,"rows", "0"
+                ,"facet", "true"
+                ,"facet.date", f
+                ,"facet.date.start",  "1976-07-01T00:00:00.000Z"
+                ,"facet.date.end",    "1976-07-13T00:00:00.000Z"
+                ,"facet.date.gap",    "+5DAYS"
+                ,"facet.date.other",  "all"
+                ,"facet.date.hardend","true"
+                )
+            // 3 gaps + pre+post+inner = 6
+            ,"*[count("+pre+"/int)=6]"
+            ,pre+"/int[@name='1976-07-01T00:00:00Z'][.='5'  ]"
+            ,pre+"/int[@name='1976-07-06T00:00:00Z'][.='0'  ]"
+            ,pre+"/int[@name='1976-07-11T00:00:00Z'][.='1'  ]"
+            
+            ,pre+"/int[@name='before' ][.='2']"
+            ,pre+"/int[@name='after'  ][.='6']"
+            ,pre+"/int[@name='between'][.='6']"
+            );
+    
+  }
+
+  public void testFacetMultiValued() {
+    doFacets("t_s");
+    doFacets("t_s", "facet.enum.cache.minDf", "2");
+    doFacets("t_s", "facet.enum.cache.minDf", "100");
+  }
+
+  public void testFacetSingleValued() {
+    doFacets("t_s1");
+  }
+
+  public void doFacets(String f, String... params) {
+    String pre = "//lst[@name='"+f+"']";
+    String notc = "id:[* TO *] -"+f+":C";
+
+    assertU(adoc("id", "1",  f, "A"));
+    assertU(adoc("id", "2",  f, "B"));
+    assertU(adoc("id", "3",  f, "C"));
+    assertU(adoc("id", "4",  f, "C"));
+    assertU(adoc("id", "5",  f, "D"));
+    assertU(adoc("id", "6",  f, "E"));
+    assertU(adoc("id", "7",  f, "E"));
+    assertU(adoc("id", "8",  f, "E"));
+    assertU(adoc("id", "9",  f, "F"));
+    assertU(adoc("id", "10", f, "G"));
+    assertU(adoc("id", "11", f, "G"));
+    assertU(adoc("id", "12", f, "G"));
+    assertU(adoc("id", "13", f, "G"));
+    assertU(adoc("id", "14", f, "G"));
+    assertU(commit());
+
+    assertQ("check counts for unlimited facet",
+            req(params, "q", "id:[* TO *]"
+                ,"facet", "true"
+                ,"facet.field", f
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=7]"
+
+            ,pre+"/int[@name='G'][.='5']"
+            ,pre+"/int[@name='E'][.='3']"
+            ,pre+"/int[@name='C'][.='2']"
+
+            ,pre+"/int[@name='A'][.='1']"
+            ,pre+"/int[@name='B'][.='1']"
+            ,pre+"/int[@name='D'][.='1']"
+            ,pre+"/int[@name='F'][.='1']"
+            );
+
+    assertQ("check counts for facet with generous limit",
+            req(params, "q", "id:[* TO *]"
+                ,"facet", "true"
+                ,"facet.limit", "100"
+                ,"facet.field", f
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=7]"
+
+            ,pre+"/int[1][@name='G'][.='5']"
+            ,pre+"/int[2][@name='E'][.='3']"
+            ,pre+"/int[3][@name='C'][.='2']"
+
+            ,pre+"/int[@name='A'][.='1']"
+            ,pre+"/int[@name='B'][.='1']"
+            ,pre+"/int[@name='D'][.='1']"
+            ,pre+"/int[@name='F'][.='1']"
+            );
+
+    assertQ("check counts for limited facet",
+            req(params, "q", "id:[* TO *]"
+                ,"facet", "true"
+                ,"facet.limit", "2"
+                ,"facet.field", f
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+
+            ,pre+"/int[1][@name='G'][.='5']"
+            ,pre+"/int[2][@name='E'][.='3']"
+            );
+
+   assertQ("check offset",
+            req(params, "q", "id:[* TO *]"
+                ,"facet", "true"
+                ,"facet.offset", "1"
+                ,"facet.limit", "1"
+                ,"facet.field", f
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+
+            ,pre+"/int[1][@name='E'][.='3']"
+            );
+
+    assertQ("test sorted facet paging with zero (don't count in limit)",
+            req(params, "q", "id:[* TO *]"
+                ,"fq",notc
+                ,"facet", "true"
+                ,"facet.field", f
+                ,"facet.mincount","1"
+                ,"facet.offset","0"
+                ,"facet.limit","6"
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=6]"
+            ,pre+"/int[1][@name='G'][.='5']"
+            ,pre+"/int[2][@name='E'][.='3']"
+            ,pre+"/int[3][@name='A'][.='1']"
+            ,pre+"/int[4][@name='B'][.='1']"
+            ,pre+"/int[5][@name='D'][.='1']"
+            ,pre+"/int[6][@name='F'][.='1']"
+            );
+
+    assertQ("test sorted facet paging with zero (test offset correctness)",
+            req(params, "q", "id:[* TO *]"
+                ,"fq",notc
+                ,"facet", "true"
+                ,"facet.field", f
+                ,"facet.mincount","1"
+                ,"facet.offset","3"
+                ,"facet.limit","2"
+                ,"facet.sort","true"
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+            ,pre+"/int[1][@name='B'][.='1']"
+            ,pre+"/int[2][@name='D'][.='1']"
+            );
+
+   assertQ("test facet unsorted paging",
+            req(params, "q", "id:[* TO *]"
+                ,"fq",notc
+                ,"facet", "true"
+                ,"facet.field", f
+                ,"facet.mincount","1"
+                ,"facet.offset","0"
+                ,"facet.limit","6"
+                ,"facet.sort","false"
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=6]"
+            ,pre+"/int[1][@name='A'][.='1']"
+            ,pre+"/int[2][@name='B'][.='1']"
+            ,pre+"/int[3][@name='D'][.='1']"
+            ,pre+"/int[4][@name='E'][.='3']"
+            ,pre+"/int[5][@name='F'][.='1']"
+            ,pre+"/int[6][@name='G'][.='5']"
+            );
+
+   assertQ("test facet unsorted paging",
+            req(params, "q", "id:[* TO *]"
+                ,"fq",notc
+                ,"facet", "true"
+                ,"facet.field", f
+                ,"facet.mincount","1"
+                ,"facet.offset","3"
+                ,"facet.limit","2"
+                ,"facet.sort","false"
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+            ,pre+"/int[1][@name='E'][.='3']"
+            ,pre+"/int[2][@name='F'][.='1']"
+            );
+
+    assertQ("test facet unsorted paging, mincount=2",
+            req(params, "q", "id:[* TO *]"
+                ,"fq",notc
+                ,"facet", "true"
+                ,"facet.field", f
+                ,"facet.mincount","2"
+                ,"facet.offset","1"
+                ,"facet.limit","2"
+                ,"facet.sort","false"
+                )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='G'][.='5']"
+            );
+  }
+
+
+
+  public void testFacetPrefixMultiValued() {
+    doFacetPrefix("t_s");   
+    doFacetPrefix("t_s", "facet.enum.cache.minDf", "3");
+    doFacetPrefix("t_s", "facet.enum.cache.minDf", "100");
+  }
+
+  public void testFacetPrefixSingleValued() {
+    doFacetPrefix("t_s1");
+  }
+
+  public void doFacetPrefix(String f, String... params) {
+    String indent="on";
+    String pre = "//lst[@name='"+f+"']";
+    String notc = "id:[* TO *] -"+f+":C";
+
+    assertU(adoc("id", "1",  f, "AAA"));
+    assertU(adoc("id", "2",  f, "B"));
+    assertU(adoc("id", "3",  f, "BB"));
+    assertU(adoc("id", "4",  f, "BB"));
+    assertU(adoc("id", "5",  f, "BBB"));
+    assertU(adoc("id", "6",  f, "BBB"));
+    assertU(adoc("id", "7",  f, "BBB"));
+    assertU(adoc("id", "8",  f, "CC"));
+    assertU(adoc("id", "9",  f, "CC"));
+    assertU(adoc("id", "10", f, "CCC"));
+    assertU(adoc("id", "11", f, "CCC"));
+    assertU(adoc("id", "12", f, "CCC"));
+    assertU(commit());
+
+    assertQ("test facet.prefix middle, exact match first term",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
+            ,pre+"/int[1][@name='BBB'][.='3']"
+            ,pre+"/int[2][@name='BB'][.='2']"
+            ,pre+"/int[3][@name='B'][.='1']"
+    );
+
+    assertQ("test facet.prefix middle, exact match first term, unsorted",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","false"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
+            ,pre+"/int[1][@name='B'][.='1']"
+            ,pre+"/int[2][@name='BB'][.='2']"
+            ,pre+"/int[3][@name='BBB'][.='3']"
+    );
+
+
+     assertQ("test facet.prefix middle, exact match first term, unsorted",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","false"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=3]"
+            ,pre+"/int[1][@name='B'][.='1']"
+            ,pre+"/int[2][@name='BB'][.='2']"
+            ,pre+"/int[3][@name='BBB'][.='3']"
+    );
+
+
+    assertQ("test facet.prefix middle, paging",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","1"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+            ,pre+"/int[1][@name='BB'][.='2']"
+            ,pre+"/int[2][@name='B'][.='1']"
+    );
+
+    assertQ("test facet.prefix middle, paging",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","1"
+                    ,"facet.limit","1"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='BB'][.='2']"
+    );
+
+    assertQ("test facet.prefix middle, paging",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","1"
+                    ,"facet.limit","1"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","B"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='BB'][.='2']"
+    );
+
+    assertQ("test facet.prefix end, not exact match",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","C"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+            ,pre+"/int[1][@name='CCC'][.='3']"
+            ,pre+"/int[2][@name='CC'][.='2']"
+    );
+
+    assertQ("test facet.prefix end, exact match",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","CC"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=2]"
+            ,pre+"/int[1][@name='CCC'][.='3']"
+            ,pre+"/int[2][@name='CC'][.='2']"
+    );
+
+    assertQ("test facet.prefix past end",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","X"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
+    );
+
+    assertQ("test facet.prefix past end",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","1"
+                    ,"facet.limit","-1"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","X"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
+    );
+
+    assertQ("test facet.prefix at start, exact match",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","AAA"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='AAA'][.='1']"
+    );
+    assertQ("test facet.prefix at Start, not exact match",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","AA"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='AAA'][.='1']"
+    );
+    assertQ("test facet.prefix at Start, not exact match",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","AA"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=1]"
+            ,pre+"/int[1][@name='AAA'][.='1']"
+    );    
+    assertQ("test facet.prefix before start",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","0"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","999"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
+    );
+
+    assertQ("test facet.prefix before start",
+            req(params, "q", "id:[* TO *]"
+                    ,"indent",indent
+                    ,"facet","true"
+                    ,"facet.field", f
+                    ,"facet.mincount","0"
+                    ,"facet.offset","2"
+                    ,"facet.limit","100"
+                    ,"facet.sort","true"
+                    ,"facet.prefix","999"
+            )
+            ,"*[count(//lst[@name='facet_fields']/lst/int)=0]"
+    );
+
+  }
+}

Propchange: lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: lucene/solr/trunk/src/test/org/apache/solr/request/SimpleFacetsTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL