/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.search; import java.util.Iterator; import org.junit.Test; import com.enonic.cms.core.content.index.ContentIndexQuery; import com.enonic.cms.core.content.resultset.ContentResultSet; import com.enonic.cms.core.search.result.FacetResultSet; import com.enonic.cms.core.search.result.FacetsResultSet; import com.enonic.cms.core.search.result.TermsStatsFacetResultEntry; import com.enonic.cms.core.search.result.TermsStatsFacetResultSet; import static org.junit.Assert.*; public class ContentIndexServiceImpl_facetTermsStatsFacetTest extends ContentIndexServiceFacetTestBase { @Test public void simple() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"999", "c"}, new String[]{"data/price", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); assertNotNull( facetsResultSet ); assertTrue( facetsResultSet.iterator().hasNext() ); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); assertNotNull( termsStatsFacet ); assertTrue( termsStatsFacet instanceof TermsStatsFacetResultSet ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <term sum=\"899.0\" hits=\"3\" min=\"-100.0\" mean=\"299.6666666666667\" max=\"999.0\">c</term>\n" + " <term sum=\"510.0\" hits=\"3\" min=\"10.0\" mean=\"170.0\" max=\"300.0\">a</term>\n" + " <term sum=\"0.0\" hits=\"1\" min=\"0.0\" mean=\"0.0\" max=\"0.0\">b</term>\n" + " </terms-stats>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( contentResultSet, expectedXml ); } @Test public void orderby_min() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c"}, new String[]{"data/price", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " <orderby>min</orderby>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); TermsStatsFacetResultSet termFacetResultSet = (TermsStatsFacetResultSet) termsStatsFacet; final Iterator<TermsStatsFacetResultEntry> termsStatsFacetResultEntryIterator = termFacetResultSet.getResults().iterator(); assertEquals( "c", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "b", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "a", termsStatsFacetResultEntryIterator.next().getTerm() ); } @Test public void orderby_min_asc() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c"}, new String[]{"data/price", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " <orderby>min ASC</orderby>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); TermsStatsFacetResultSet termFacetResultSet = (TermsStatsFacetResultSet) termsStatsFacet; final Iterator<TermsStatsFacetResultEntry> termsStatsFacetResultEntryIterator = termFacetResultSet.getResults().iterator(); assertEquals( "a", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "b", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "c", termsStatsFacetResultEntryIterator.next().getTerm() ); } @Test public void orderby_max() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c"}, new String[]{"data/price", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " <orderby>max</orderby>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); TermsStatsFacetResultSet termFacetResultSet = (TermsStatsFacetResultSet) termsStatsFacet; final Iterator<TermsStatsFacetResultEntry> termsStatsFacetResultEntryIterator = termFacetResultSet.getResults().iterator(); assertEquals( "c", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "a", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "b", termsStatsFacetResultEntryIterator.next().getTerm() ); } @Test public void sum() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c"}, new String[]{"data/price", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " <orderby>sum</orderby>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); TermsStatsFacetResultSet termFacetResultSet = (TermsStatsFacetResultSet) termsStatsFacet; final Iterator<TermsStatsFacetResultEntry> termsStatsFacetResultEntryIterator = termFacetResultSet.getResults().iterator(); assertEquals( "c", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "a", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "b", termsStatsFacetResultEntryIterator.next().getTerm() ); } @Test public void multifield() { createAndIndexContent( 1, new String[]{"10", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 2, new String[]{"200", "a"}, new String[]{"data/price", "data/term"} ); createAndIndexContent( 3, new String[]{"300", "a", "b"}, new String[]{"data/price", "data/term", "data/term"} ); createAndIndexContent( 4, new String[]{"0", "b", "a"}, new String[]{"data/price", "data/term", "data/term"} ); createAndIndexContent( 5, new String[]{"-100", "c", "b", "a"}, new String[]{"data/price", "data/term", "data/term", "data/term"} ); createAndIndexContent( 6, new String[]{"0", "c", "b"}, new String[]{"data/price", "data/term", "data/term"} ); createAndIndexContent( 7, new String[]{"1000", "c", "b"}, new String[]{"data/price", "data/term", "data/term"} ); createAndIndexContent( 8, new String[]{"2000", "c", "b"}, new String[]{"data/price", "data/term", "data/term"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <index>data/term</index>\n" + " <value-index>data/price</value-index>\n" + " <orderby>hits</orderby>\n" + " </terms-stats >\n" + "</facets>"; query.setFacets( facetDefinition ); final ContentResultSet contentResultSet = contentIndexService.query( query ); final FacetsResultSet facetsResultSet = contentResultSet.getFacetsResultSet(); final FacetResultSet termsStatsFacet = facetsResultSet.iterator().next(); TermsStatsFacetResultSet termFacetResultSet = (TermsStatsFacetResultSet) termsStatsFacet; final Iterator<TermsStatsFacetResultEntry> termsStatsFacetResultEntryIterator = termFacetResultSet.getResults().iterator(); assertEquals( "b", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "a", termsStatsFacetResultEntryIterator.next().getTerm() ); assertEquals( "c", termsStatsFacetResultEntryIterator.next().getTerm() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <terms-stats name=\"myTermsStatsFacet\">\n" + " <term sum=\"3200.0\" hits=\"6\" min=\"-100.0\" mean=\"533.3333333333334\" max=\"2000.0\">b</term>\n" + " <term sum=\"410.0\" hits=\"5\" min=\"-100.0\" mean=\"82.0\" max=\"300.0\">a</term>\n" + " <term sum=\"2900.0\" hits=\"4\" min=\"-100.0\" mean=\"725.0\" max=\"2000.0\">c</term>\n" + " </terms-stats>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( contentResultSet, expectedXml ); } }