/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.search; import java.text.SimpleDateFormat; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; 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.DateHistogramFacetResultSet; import com.enonic.cms.core.search.result.FacetResultSet; import static org.junit.Assert.*; public class ContentIndexServiceImpl_facetDateHistogramFacetTest extends ContentIndexServiceFacetTestBase { public static final SimpleDateFormat INTERVAL_DATE_FORMAT = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); @Test public void minute_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-01-01 12:00", "data.myDate" ); createAndIndexContent( 3, "2012-01-02", "data.myDate" ); createAndIndexContent( 4, "2012-01-03 23:59:59", "data.myDate" ); createAndIndexContent( 5, "2012-01-04 10:00", "data.myDate" ); createAndIndexContent( 6, "2012-01-04 12:00:42", "data.myDate" ); createAndIndexContent( 7, "2012-01-04 14:10", "data.myDate" ); createAndIndexContent( 8, "2012-01-04 16:01:59", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>minute</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; //assertEquals( 4, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"1\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-01-01 12:00:00</interval>\n" + " <interval hits=\"1\">2012-01-02 00:00:00</interval>\n" + " <interval hits=\"1\">2012-01-03 23:59:00</interval>\n" + " <interval hits=\"1\">2012-01-04 10:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 12:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 14:10:00</interval>\n" + " <interval hits=\"1\">2012-01-04 16:01:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void two_minute_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-01-01 00:00:01", "data.myDate" ); createAndIndexContent( 3, "2012-01-01 00:01:30", "data.myDate" ); createAndIndexContent( 4, "2012-01-01 00:01:59", "data.myDate" ); createAndIndexContent( 5, "2012-01-01 00:02:00", "data.myDate" ); createAndIndexContent( 6, "2012-01-01 01:00:00", "data.myDate" ); createAndIndexContent( 7, "2012-01-01 01:01:59", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>2m</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 3, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"4\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-01-01 00:02:00</interval>\n" + " <interval hits=\"2\">2012-01-01 01:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void hour_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-01-01 12:00", "data.myDate" ); createAndIndexContent( 3, "2012-01-02", "data.myDate" ); createAndIndexContent( 4, "2012-01-03 23:59:59", "data.myDate" ); createAndIndexContent( 5, "2012-01-04 10:00", "data.myDate" ); createAndIndexContent( 6, "2012-01-04 12:00", "data.myDate" ); createAndIndexContent( 7, "2012-01-04 14:10", "data.myDate" ); createAndIndexContent( 8, "2012-01-04 16:00", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>hour</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 8, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"1\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-01-01 12:00:00</interval>\n" + " <interval hits=\"1\">2012-01-02 00:00:00</interval>\n" + " <interval hits=\"1\">2012-01-03 23:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 10:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 12:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 14:00:00</interval>\n" + " <interval hits=\"1\">2012-01-04 16:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void hour_and_a_half_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-01-01 01:29:59", "data.myDate" ); createAndIndexContent( 3, "2012-01-01 01:30", "data.myDate" ); createAndIndexContent( 4, "2012-01-01 02:00", "data.myDate" ); createAndIndexContent( 5, "2012-01-01 03:00", "data.myDate" ); createAndIndexContent( 6, "2012-01-01 04:00", "data.myDate" ); createAndIndexContent( 7, "2012-01-01 05:00", "data.myDate" ); createAndIndexContent( 8, "2012-01-01 06:00", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>1.5h</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 5, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"2\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"2\">2012-01-01 01:30:00</interval>\n" + " <interval hits=\"2\">2012-01-01 03:00:00</interval>\n" + " <interval hits=\"1\">2012-01-01 04:30:00</interval>\n" + " <interval hits=\"1\">2012-01-01 06:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void day_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-01-01 12:00", "data.myDate" ); createAndIndexContent( 3, "2012-01-02", "data.myDate" ); createAndIndexContent( 4, "2012-01-02 23:59:59", "data.myDate" ); createAndIndexContent( 5, "2012-01-04 00:00", "data.myDate" ); createAndIndexContent( 6, "2012-01-04 12:00", "data.myDate" ); createAndIndexContent( 7, "2012-01-04 22:10", "data.myDate" ); createAndIndexContent( 8, "2012-01-04 23:50", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>day</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 3, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"2\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"2\">2012-01-02 00:00:00</interval>\n" + " <interval hits=\"4\">2012-01-04 00:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>\n" + "\n"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void month_interval() { createAndIndexContent( 1, "2012-01-01", "data.myDate" ); createAndIndexContent( 2, "2012-02-01 12:00", "data.myDate" ); createAndIndexContent( 3, "2012-03-02", "data.myDate" ); createAndIndexContent( 4, "2012-04-03 23:59:59", "data.myDate" ); createAndIndexContent( 5, "2012-05-04 10:00", "data.myDate" ); createAndIndexContent( 6, "2012-06-04 12:00:42", "data.myDate" ); createAndIndexContent( 7, "2012-07-04 14:10", "data.myDate" ); createAndIndexContent( 8, "2012-08-04 16:01:59", "data.myDate" ); createAndIndexContent( 9, "2012-08-31 23:59:59", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>month</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 8, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"1\">2012-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-02-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-03-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-04-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-05-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-06-01 00:00:00</interval>\n" + " <interval hits=\"1\">2012-07-01 00:00:00</interval>\n" + " <interval hits=\"2\">2012-08-01 00:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void year_interval() { createAndIndexContent( 1, "2001-01-01", "data.myDate" ); createAndIndexContent( 2, "2002-02-01 12:00", "data.myDate" ); createAndIndexContent( 3, "2003-03-02", "data.myDate" ); createAndIndexContent( 4, "2004-04-03 23:59:59", "data.myDate" ); createAndIndexContent( 5, "2005-05-04 10:00", "data.myDate" ); createAndIndexContent( 6, "2006-06-04 12:00:42", "data.myDate" ); createAndIndexContent( 7, "2007-07-04 14:10", "data.myDate" ); createAndIndexContent( 8, "2008-08-04 16:01:59", "data.myDate" ); createAndIndexContent( 9, "2008-08-31 23:59:59", "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>year</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; //assertEquals( 4, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"1\">2001-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2002-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2003-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2004-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2005-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2006-01-01 00:00:00</interval>\n" + " <interval hits=\"1\">2007-01-01 00:00:00</interval>\n" + " <interval hits=\"2\">2008-01-01 00:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } @Test public void preZone_settings() { /* Setting preZone to Pacific/Tongatapu means that facet-data settings is threaded to be in timezone+13 */ final String timeZoneId = "Pacific/Tongatapu"; String date1 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 01, 0, 0 ); String date2 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 01, 12, 0 ); String date3 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 02, 0, 0 ); String date4 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 02, 23, 59 ); String date5 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 04, 0, 0 ); String date6 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 04, 12, 0 ); String date7 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 04, 22, 10 ); String date8 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 04, 23, 50 ); createAndIndexContent( 1, date1, "data.myDate" ); createAndIndexContent( 2, date2, "data.myDate" ); createAndIndexContent( 3, date3, "data.myDate" ); createAndIndexContent( 4, date4, "data.myDate" ); createAndIndexContent( 5, date5, "data.myDate" ); createAndIndexContent( 6, date6, "data.myDate" ); createAndIndexContent( 7, date7, "data.myDate" ); createAndIndexContent( 8, date8, "data.myDate" ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <interval>day</interval>\n" + " <pre-zone>" + timeZoneId + "</pre-zone>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 3, histogramFacetResultSet.getResultEntries().size() ); String interval1 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 01, 0, 0 ); String interval2 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 02, 0, 0 ); String interval3 = formatAsCurrentTZDate( timeZoneId, 2012, 01, 04, 0, 0 ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval hits=\"2\">" + interval1 + "</interval>\n" + " <interval hits=\"2\">" + interval2 + "</interval>\n" + " <interval hits=\"4\">" + interval3 + "</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>"; createAndCompareResultAsXml( result, expectedXml ); } private String formatAsCurrentTZDate( String timeZoneId, int year, int mont, int day, int hour, int minute ) { DateTime interval1 = new DateTime( year, mont, day, hour, minute, DateTimeZone.forID( timeZoneId ) ); return INTERVAL_DATE_FORMAT.format( interval1.toDate() ); } @Test public void key_and_value() { createAndIndexContent( 1, new String[]{"2012-01-01", "10"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 2, new String[]{"2012-01-01 12:00", "20"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 3, new String[]{"2012-01-02", "30"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 4, new String[]{"2012-01-02 23:59:59", "40"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 5, new String[]{"2012-01-04 00:00", "50"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 6, new String[]{"2012-01-04 12:00", "60"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 7, new String[]{"2012-01-04 22:10", "70"}, new String[]{"data.myDate", "data.myValue"} ); createAndIndexContent( 8, new String[]{"2012-01-04 23:50", "80"}, new String[]{"data.myDate", "data.myValue"} ); flushIndex(); ContentIndexQuery query = new ContentIndexQuery( "" ); final String facetDefinition = "<facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <index>data.myDate</index>\n" + " <value-index>data.myValue</value-index>\n" + " <interval>day</interval>\n" + " </date-histogram>\n" + "</facets>\n"; query.setFacets( facetDefinition ); final ContentResultSet result = contentIndexService.query( query ); final FacetResultSet next = result.getFacetsResultSet().iterator().next(); assertNotNull( next ); assertTrue( next instanceof DateHistogramFacetResultSet ); DateHistogramFacetResultSet histogramFacetResultSet = (DateHistogramFacetResultSet) next; assertEquals( 3, histogramFacetResultSet.getResultEntries().size() ); String expectedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<content>\n" + " <facets>\n" + " <date-histogram name=\"myHistogramFacet\">\n" + " <interval sum=\"30.0\" hits=\"2\" min=\"10.0\" mean=\"15.0\" max=\"20.0\">2012-01-01 00:00:00</interval>\n" + " <interval sum=\"70.0\" hits=\"2\" min=\"30.0\" mean=\"35.0\" max=\"40.0\">2012-01-02 00:00:00</interval>\n" + " <interval sum=\"260.0\" hits=\"4\" min=\"50.0\" mean=\"65.0\" max=\"80.0\">2012-01-04 00:00:00</interval>\n" + " </date-histogram>\n" + " </facets>\n" + "</content>\n" + "\n"; createAndCompareResultAsXml( result, expectedXml ); } }